Seaward.ru

Здравствуйте, гость ( Вход | Регистрация )

> Для программистов, вопросы по скриптам ПКМ
igor_pol
сообщение Aug 24 2005, 21:00
Сообщение #1


боцман
****


Группа: форумчанин
Сообщений: 140
Регистрация: 3-December 04
Пользователь №: 169



Первое что я хотел написать "АДМИНЫ!!!!" НЕ ЗВЕРЕЙТЕ ЗА "НЕНУЖНУЮ ТЕМУ"
**************************************************
на вопрос зачем создал эту тему отвечу так "Я например НЕ ПРОСТО ЮЗВЕРЬ А КОЕ ЧТО И САМ НАПИСАТЬ МОГУ.
И хотел бы чтобы на форуме была тема для тех кто сам хочет что-то добавить в игру.
На сайте аддона Алекс вікинул ссылку на описание скриптов ПКМ на английском.
Я хотел бы узнать где можно нарыть больше инфы по этом скриптам.
И кстати на каком языке они пишуться.
Если кто-то знает ----- пишите.
И вообще всем програмерам на форуме нужна своя тема.
так что ГОСПОДА ПРОГРАМЕРЫ ВАЛИТЕ СЮДА !!!!
Может из этого что небудь интересное выйдет!!!!!!(Если тему не УТРУТ)
Жду сообщений (может у когот есть идеи на эту тему )

Сообщение отредактировал Догева - Apr 24 2006, 13:36
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
35 страниц V « < 30 31 32 33 34 > »   
Reply to this topicStart new topic
Ответов(620 - 639)
Martial
сообщение Aug 2 2020, 23:07
Сообщение #621


юнга
**


Группа: форумчанин
Сообщений: 21
Регистрация: 13-April 19
Пользователь №: 136,449



как-то во вторых корсарах странно работают условия при потоплении и абордаже кораблей, я прописываю блоки для абордажа и потопления в том же кейсе где и указываются локаторы спавна судна (которое нужно захватить/потопить)
pchar.quest.QuestShip_status.win_condition.l1 = "NPC_Death";
pchar.quest.QuestShip_status.win_condition.l1.character = "QuestShipCaptain";
pchar.quest.QuestShip_status.win_condition = "Sink_QuestShip";

pchar.quest.QuestShip_status.win_condition.l1 = "Character_Capture";
pchar.quest.QuestShip_status.win_condition.l1.character = "QuestShipCaptain";
pchar.quest.QuestShip_status.win_condition = "Capture_QuestShip";

и идея была в том чтобы в СЖ шли записи в соответствии был ли захвачен или потоплен корабль. При варианте указанном выше запись в СЖ идет только при абордаже (2 блок), если потопить судно то кейс первого блока (Sink_QuestShip) не выполняется. Если закоментить любой один из двух блоков то второй выполняется корректно в СЖ появляются записи потопления либо абордажа, но вот когда они оба прописаны возникают проблемы. А если прописать эти два блока в обратном порядке (сначала Character_Capture, потом NPC_Death), то выполняется только кейс из ветви NPC_Death.

Могут ли параметры NPC который стоит капитаном судна влиять на статус его корабля? И есть ли еще что-то что влияет на статус корабля (кроме капитана, и кейсов в quests_reaction)?

User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Thorgal
сообщение Aug 3 2020, 23:53
Сообщение #622


капер
******

Ветеран ФорумаЗаслуженный Художник
Группа: форумчанин
Сообщений: 819
Регистрация: 13-December 05
Из: Москва
Пользователь №: 1,667



Цитата(BUKA_E}l{EBUKA @ Aug 2 2020, 22:10) *
На практике - не совсем. По крайней мере, в моих тестах при "MOD_DEAD_CLEAR_TIME * 1000" время от PostEvent до удаления = 106с, а при 100000 = 104с.

Хм... Неожиданно. Тогда лучше трогать не буду.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
BUKA_E}l{EBUKA
сообщение Aug 4 2020, 09:09
Сообщение #623


юнга
**


Группа: форумчанин
Сообщений: 31
Регистрация: 20-July 20
Пользователь №: 194,252



Что написать в if чтоб проверить, является ли результат выражения целым числом или нет? Имею в виду не int/float, а целое ли с т.ч. математики.

И еще - как будет эффективнее (производительность)?
При том что операция "xxx/yyy" будет для каждого предмета инвентаря, а "xxx" "yyy" для каждого предмета разные
Код

if(..xxx/yyy..) {xxx/yyy}
else {xxx/yyy}

или
Код

float zzz = xxx/yyy
if(..zzz..) {zzz}
else {zzz}


UPD с первым разобралась: if(makeint(xxx/yyy) == xxx/yyy). Второе в силе
UPD2 логическая часть моска наконец проснулась laugh.gif Очевидно, посчитать один раз лучше, чем считать дважды. Вопрос снимается

Но появился новый, даже в двух частях!

Если мне нужно запихнуть в if() проверку, равна ли X нулю, как корректно это сделать?
if(X == 0.0)? if(X == 0)? if(X == 0.0 || X == 0)? Или как-то еще?

Если Х это:
а) Переменная "string qqq". Ее значения всегда в виде числа с плавающей запятой. В том числе бывают "0.0".
б) Результат функции "float Function" которая иногда возвращает нуль.

UPD Провела тест валидности всяких разных случаев нулей по обе стороны от оператора.
Для а подойдет 0 / 0.0 / "0.0", для б - 0 / 0.0
Спойлеры по-видимому не работают, так что скрин всех результатов здесь, а код тут.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
bengunn
сообщение Aug 5 2020, 21:40
Сообщение #624


юнга
**


Группа: форумчанин (*)
Сообщений: 14
Регистрация: 28-June 18
Пользователь №: 91,788



В C++ переменная float гарантирует точность только первых 7 цифр (и не после запятой, а вообще), поэтому использование оператора '==' может привести к непредсказуемым результатам.
Если хотите углубиться в тему, google в помощь.

Самый простой способ (если числа приблизительно одного порядка) - выбрать допустимую погрешность и сравнить с ней модуль разности значений.

Пример, для небольших чисел:

Код

#define FLOAT_EPSILON 0.0005

bool is_equal_floats(float f1, float f2)
{
    // abs throw error if argument is reference
    float f1_float = f1;
    float f2_float = f2;

    return abs(f1_float - f2_float) < FLOAT_EPSILON;
}


Идем дальше, при сравнении разных типов вторая переменная приводится к типу первой.
Узнать точно, как происходит конвертирование, без исходного кода невозможно.
Все что остается, пробовать.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
BUKA_E}l{EBUKA
сообщение Aug 5 2020, 22:37
Сообщение #625


юнга
**


Группа: форумчанин
Сообщений: 31
Регистрация: 20-July 20
Пользователь №: 194,252



Много гуглила по этой теме, попадалось и поведение описанное вами. Но в случае сравнения с нулем таких неожиданностей не происходит насколько я поняла (в С/С++ по крайней мере). А меня именно это интересует.
К тому же float Function, которую я с нулем сравниваю, оперирует только числами с максимум одним знаком после запятой.
Но все же спасибо!

P.S. Конкретно про функцию - хотела убедиться что выражение "GetItemsWeight(chref) == 0.0" из моего поста выше корректно, и мое представление об его результате не расходится с представлением компилятора biggrin.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
BUKA_E}l{EBUKA
сообщение Aug 7 2020, 15:32
Сообщение #626


юнга
**


Группа: форумчанин
Сообщений: 31
Регистрация: 20-July 20
Пользователь №: 194,252



Доброго дня! Вопрос (по ВМЛ):
Есть цикл. В нем крутится массив на 173 объекта. Среди объектов есть штук 15 особенных.
Как в процессе цикла проигнорировать эти объекты чтобы после прогона по всем 173 - прогнать по этим 15ти? В рамках этого же цикла.

Конкретика: хочу чтобы все карты были в конце инвентаря.
Хотелку удовлетворила, но на мой взгляд - неэффективно, добавлением еще одного цикла.
файл: Program\Characters\CharacterUtilite.c

старый код
Код

void SortItems(ref NPChar)
{// отсортировать предметы в кармане, сундуке
    //тут переменные и прочие циклы
    //последний цикл:
    for (i=0; i<ITEMS_QUANTITY; i++)
    {
        makeref(itm, Items[i]);
        attr = itm.id;
        if (CheckAttribute(rObj, "items."+attr) && !CheckAttribute(itm, "SortIndex"))
        {
               NPChar.Items.(attr) = sti(rObj.Items.(attr));
               ok = true;
          }
    }
}


новый код
Код

void SortItems(ref NPChar)
{// отсортировать предметы в кармане, сундуке
    //тут переменные и прочие циклы
    //последний цикл:
    for (i=0; i<ITEMS_QUANTITY; i++)
    {
        makeref(itm, Items[i]);
        attr = itm.id;
        if (CheckAttribute(rObj, "items."+attr) && !CheckAttribute(itm, "SortIndex"))
        {
            //новый код >
            if (CheckAttribute(itm, "ItemType") && itm.ItemType == "MAP")
            {
                continue;
            }
            //новый код <
               NPChar.Items.(attr) = sti(rObj.Items.(attr));
               ok = true;
          }
    }
    //добавили цикл >
    for (i=0; i<ITEMS_QUANTITY; i++)
    {
        makeref(itm, Items[i]);
        attr = itm.id;
        if (CheckAttribute(rObj, "items."+attr) && !CheckAttribute(itm, "SortIndex") && CheckAttribute(itm, "ItemType") && itm.ItemType == "MAP")
        {
               NPChar.Items.(attr) = sti(rObj.Items.(attr));
               ok = true;
          }
    }
    //добавили цикл <
}

Меня не покидает чувство что задача решена не оптимально.
Что возможно сделать то что я хочу можно не плодя лишний цикл, но не хватает знаний/понимания.

З.Ы. За мультипостинг простите! Если сообщение не будет новым, сюда никто не заглянет sad.gif
А спойлеров правда нет? Мб я кейворд не тот пробую. [spoiler][/spoiler] не подходит
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
tislic
сообщение Aug 7 2020, 16:45
Сообщение #627


капитан
*****


Группа: форумчанин
Сообщений: 452
Регистрация: 11-April 07
Пользователь №: 7,115



Цитата
А спойлеров правда нет? Мб я кейворд не тот пробую. [spoiler][/spoiler] не подходит

Собственно, как и оффтопа, я уже говорил, ещё раз повторюсь, spoiler можно будет поставить, если ALexusB вспомнить пароль от FTP.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
BUKA_E}l{EBUKA
сообщение Aug 7 2020, 17:24
Сообщение #628


юнга
**


Группа: форумчанин
Сообщений: 31
Регистрация: 20-July 20
Пользователь №: 194,252



От почты тоже?
Регистратор - RU-CENTER? Восстановить можно через панель управления > FTP
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
tislic
сообщение Aug 7 2020, 21:28
Сообщение #629


капитан
*****


Группа: форумчанин
Сообщений: 452
Регистрация: 11-April 07
Пользователь №: 7,115



Привет!

С начало, думаю нужно объяснить для тех, кто не понимает о чем идет речь. spoiler делает пост короче, не надо мотать несколько экранов вниз, чтобы прочитать следующий пост, если щелкнуть на полоску spoiler, то окошко раскроется показывая скрытый текст.
Еще под спойлер принято прятать оффтоп, он очень удобен при обсуждении фильмов, сериалов, игр, чтобы не портить впечатление раскрытием сюжета у тех, кто ещё не смотрел и т.д.

С одно стороны, если бы тут еще кто-то писал и полным ходом шло обсуждение, то да, есть смысл ставить, с другой стороны, может кто-то и присоединился, но удобства чтения ответов нет и не хочется начинать.

Поэтому, я считаю, правильно будет провести голосование среди тех, кто сюда заходит, нужна им такая вещь или нет, а так, ALexusB пароль от FTP забыл wink.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
bengunn
сообщение Aug 10 2020, 21:07
Сообщение #630


юнга
**


Группа: форумчанин (*)
Сообщений: 14
Регистрация: 28-June 18
Пользователь №: 91,788



Можно уменьшить число шагов последнего цикла до числа карт у игрока следующим образом:

Код

void SortItems(ref NPChar)
{// отсортировать предметы в кармане, сундуке
    //тут переменные и прочие циклы
    //последний цикл:

    object maps; // в этом объекте будем хранить id карт у игрока.

    for (i=0; i<ITEMS_QUANTITY; i++)
    {
        makeref(itm, Items[i]);
        attr = itm.id;
        if (CheckAttribute(rObj, "items."+attr) && !CheckAttribute(itm, "SortIndex"))
        {
            //новый код >
            if (CheckAttribute(itm, "ItemType") && itm.ItemType == "MAP")
            {
                maps.(attr) = ""; // сохраняем id
                continue;
            }
            //новый код <
            
            NPChar.Items.(attr) = sti(rObj.Items.(attr));
            ok = true;
        }
    }

    //пробегаем по аттрибутам объекта maps
    for (i=0; i<GetAttributesNum(&maps); i++)
    {
        string map_id = GetAttributeName(GetAttributeN(&maps, i));
        NPChar.Items.(map_id) = rObj.Items.(map_id);
        ok = true;
    }
}


Код не проверял unsure.gif (лень ставить ВМЛ), но надеюсь основная идея понятна.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
BUKA_E}l{EBUKA
сообщение Aug 14 2020, 23:55
Сообщение #631


юнга
**


Группа: форумчанин
Сообщений: 31
Регистрация: 20-July 20
Пользователь №: 194,252



Не вылезет ли у меня проблем, если я для switch/case использую string а не int?
В тестах все окей, несмотря на мануалы по C++ и примеры из ВМЛ.

Например вот этот код
Код

    string datIsland = refIsland.id
    switch(datIsland)
    {
        case "Gaity":
            Log_Info("Gaity");
            break;
        case "Cuba":
            Log_Info("Cuba");
            break;
    }

для интерфейса "F2" > "Торговля" будет выводить Gaity/Cuba при переключении на Эспаньолу/Кубу.

Но меня терзают смутные сомнения. Если оно работает со стрингами, почему везде инт?
В ВМЛ везде где я видела switch используется так:
Код

switch(rand(1))
{
    case 0:
    case 1:
}

Или так:
Код

#define KILL_BALLS 0
#define KILL_BOARDING 1
switch(howKilled)
{
    case KILL_BALLS:
    case KILL_BOARDING:
}
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ALexusB
сообщение Aug 15 2020, 09:53
Сообщение #632


Разработчик ВМЛ-КВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 16,225
Регистрация: 2-November 04
Пользователь №: 3



все будет ок, там главное, что тип на входе будет как в кейсе.
Текстовые кейсы в ВМЛ тоже есть - квест реакшн весь такой
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
BUKA_E}l{EBUKA
сообщение Aug 21 2020, 21:31
Сообщение #633


юнга
**


Группа: форумчанин
Сообщений: 31
Регистрация: 20-July 20
Пользователь №: 194,252



(ВМЛ) Как в тексте диалога сделать перенос строки?
То есть:
dialog.text = "a = " +xxxx+ " b = " +yyyy;
Будет отображаться:
xxxx yyyy
А мне надо:
xxxx
yyyy
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Verdugo
сообщение Aug 22 2020, 01:07
Сообщение #634


новичок
*


Группа: форумчанин (*)
Сообщений: 9
Регистрация: 22-August 20
Пользователь №: 198,224



Цитата(BUKA_E}l{EBUKA @ Aug 21 2020, 21:31) *
Как в тексте диалога сделать перенос строки?

"\n" или newStr();
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Slayer
сообщение Sep 2 2020, 21:35
Сообщение #635


юнга
**


Группа: форумчанин (*)
Сообщений: 18
Регистрация: 2-September 20
Пользователь №: 199,708



Всем добрый день! кто знает как принудительно нацепить саблю на офицера после его потери сознания в бою? В итоге она остается в инвентаре просто .
Просто так сабля не надевается , даже с проверкой

if (GetCharacterEquipByGroup(sld, BLADE_ITEM_TYPE) == "" || !IsOfficer(sld))
{
GiveItem2Character(sld, "blade_19"); //приходится ставить эту строку , но это уже вторая сабля получается...
sld.equip.blade = "blade_19";
}
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ALexusB
сообщение Sep 2 2020, 21:44
Сообщение #636


Разработчик ВМЛ-КВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 16,225
Регистрация: 2-November 04
Пользователь №: 3



А что за потеря сознания в бою? Уже не помню
Если раньше дохли, а потом воскресали, но без сабли - то вещи в кармане есть вообще?
Если есть, то можно просто снять и одеть экипировку + там есть какой-то метод, дернуть ядро,чтоб она нарисовалась на модели.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Slayer
сообщение Sep 2 2020, 23:12
Сообщение #637


юнга
**


Группа: форумчанин (*)
Сообщений: 18
Регистрация: 2-September 20
Пользователь №: 199,708



Цитата(ALexusB @ Sep 2 2020, 21:44) *

А что за потеря сознания в бою? Уже не помню
Если раньше дохли, а потом воскресали, но без сабли - то вещи в кармане есть вообще?
Если есть, то можно просто снять и одеть экипировку + там есть какой-то метод, дернуть ядро,чтоб она нарисовалась на модели.

это в ККС . они там сознания теряют . Я просто квест пишу для себя и у меня свой абордажник если потеряет сознание то его сабля с него снимается и просто оказывается в инвентаре . Надеть - неактуально , ибо по сюжету Шарлю потом приходится драться уже с этим . его офицером, получается что офф без сабли ( я конечно обошел этот момент , выдав ему вторую саблю на время боя , потом удалив её снова) Но хотелось бы чтобы первапя сабля уже была на оффе. А что за метод? не подскажите? в описаниях скриптов не нашел. Может каким то образом можно запомнить ID предыдущего оружия ?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ALexusB
сообщение Sep 2 2020, 23:27
Сообщение #638


Разработчик ВМЛ-КВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 16,225
Регистрация: 2-November 04
Пользователь №: 3



ИД оружия в переменную из sld.equip.blade
Метод где equip.blade = и отрисовка на модели - поиском найти
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Verdugo
сообщение Sep 2 2020, 23:36
Сообщение #639


новичок
*


Группа: форумчанин (*)
Сообщений: 9
Регистрация: 22-August 20
Пользователь №: 198,224



А вы рефреш модели делаете перед тем как экипировать саблю?

Characters_RefreshModel(sld);

Или она сама одевается?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Slayer
сообщение Sep 3 2020, 15:24
Сообщение #640


юнга
**


Группа: форумчанин (*)
Сообщений: 18
Регистрация: 2-September 20
Пользователь №: 199,708



Цитата(Verdugo @ Sep 2 2020, 23:36) *

А вы рефреш модели делаете перед тем как экипировать саблю?

Characters_RefreshModel(sld);

Или она сама одевается?

а что делает эта функция? просто ни разу её не пользовался. прописывать надо прямо в генерации персонажа, если он по сюжету будет менять отношение к ГГ?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

35 страниц V « < 30 31 32 33 34 > » 
Reply to this topicStart new topic
5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 20th April 2024 - 05:28

Блок рекламы
Яндекс цитирования Rambler's Top100
Rambler's Top100