Для программистов, вопросы по скриптам ПКМ |
Здравствуйте, гость ( Вход | Регистрация )
Для программистов, вопросы по скриптам ПКМ |
igor_pol |
Aug 24 2005, 21:00
Сообщение
#1
|
боцман Группа: форумчанин Сообщений: 140 Регистрация: 3-December 04 Пользователь №: 169 |
Первое что я хотел написать "АДМИНЫ!!!!" НЕ ЗВЕРЕЙТЕ ЗА "НЕНУЖНУЮ ТЕМУ"
************************************************** на вопрос зачем создал эту тему отвечу так "Я например НЕ ПРОСТО ЮЗВЕРЬ А КОЕ ЧТО И САМ НАПИСАТЬ МОГУ. И хотел бы чтобы на форуме была тема для тех кто сам хочет что-то добавить в игру. На сайте аддона Алекс вікинул ссылку на описание скриптов ПКМ на английском. Я хотел бы узнать где можно нарыть больше инфы по этом скриптам. И кстати на каком языке они пишуться. Если кто-то знает ----- пишите. И вообще всем програмерам на форуме нужна своя тема. так что ГОСПОДА ПРОГРАМЕРЫ ВАЛИТЕ СЮДА !!!! Может из этого что небудь интересное выйдет!!!!!!(Если тему не УТРУТ) Жду сообщений (может у когот есть идеи на эту тему ) Сообщение отредактировал Догева - Apr 24 2006, 13:36 |
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)? |
Thorgal |
Aug 3 2020, 23:53
Сообщение
#622
|
капер Группа: форумчанин Сообщений: 819 Регистрация: 13-December 05 Из: Москва Пользователь №: 1,667 |
|
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 логическая часть моска наконец проснулась Очевидно, посчитать один раз лучше, чем считать дважды. Вопрос снимается Но появился новый, даже в двух частях! Если мне нужно запихнуть в 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 Спойлеры по-видимому не работают, так что скрин всех результатов |
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; } Идем дальше, при сравнении разных типов вторая переменная приводится к типу первой. Узнать точно, как происходит конвертирование, без исходного кода невозможно. Все что остается, пробовать. |
BUKA_E}l{EBUKA |
Aug 5 2020, 22:37
Сообщение
#625
|
юнга Группа: форумчанин Сообщений: 31 Регистрация: 20-July 20 Пользователь №: 194,252 |
Много гуглила по этой теме,
К тому же float Function, которую я с нулем сравниваю, оперирует только числами с максимум одним знаком после запятой. Но все же спасибо! P.S. Конкретно про функцию - хотела убедиться что выражение "GetItemsWeight(chref) == 0.0" из моего поста выше корректно, и мое представление об его результате не расходится с представлением компилятора |
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; } } //добавили цикл < } Меня не покидает чувство что задача решена не оптимально. Что возможно сделать то что я хочу можно не плодя лишний цикл, но не хватает знаний/понимания. З.Ы. За мультипостинг простите! Если сообщение не будет новым, сюда никто не заглянет А спойлеров правда нет? Мб я кейворд не тот пробую. [spoiler][/spoiler] не подходит |
tislic |
Aug 7 2020, 16:45
Сообщение
#627
|
капитан Группа: форумчанин Сообщений: 452 Регистрация: 11-April 07 Пользователь №: 7,115 |
Цитата А спойлеров правда нет? Мб я кейворд не тот пробую. [spoiler][/spoiler] не подходит Собственно, как и оффтопа, я уже говорил, ещё раз повторюсь, spoiler можно будет поставить, если ALexusB вспомнить пароль от FTP. |
BUKA_E}l{EBUKA |
Aug 7 2020, 17:24
Сообщение
#628
|
юнга Группа: форумчанин Сообщений: 31 Регистрация: 20-July 20 Пользователь №: 194,252 |
От почты тоже?
Регистратор - RU-CENTER? Восстановить можно через |
tislic |
Aug 7 2020, 21:28
Сообщение
#629
|
капитан Группа: форумчанин Сообщений: 452 Регистрация: 11-April 07 Пользователь №: 7,115 |
Привет!
С начало, думаю нужно объяснить для тех, кто не понимает о чем идет речь. spoiler делает пост короче, не надо мотать несколько экранов вниз, чтобы прочитать следующий пост, если щелкнуть на полоску spoiler, то окошко раскроется показывая скрытый текст. Еще под спойлер принято прятать оффтоп, он очень удобен при обсуждении фильмов, сериалов, игр, чтобы не портить впечатление раскрытием сюжета у тех, кто ещё не смотрел и т.д. С одно стороны, если бы тут еще кто-то писал и полным ходом шло обсуждение, то да, есть смысл ставить, с другой стороны, может кто-то и присоединился, но удобства чтения ответов нет и не хочется начинать. Поэтому, я считаю, правильно будет провести голосование среди тех, кто сюда заходит, нужна им такая вещь или нет, а так, ALexusB пароль от FTP забыл |
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; } } Код не проверял (лень ставить ВМЛ), но надеюсь основная идея понятна. |
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: } |
ALexusB |
Aug 15 2020, 09:53
Сообщение
#632
|
Разработчик ВМЛ-КВЛ Группа: Admin Сообщений: 16,306 Регистрация: 2-November 04 Пользователь №: 3 |
все будет ок, там главное, что тип на входе будет как в кейсе.
Текстовые кейсы в ВМЛ тоже есть - квест реакшн весь такой |
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 |
Verdugo |
Aug 22 2020, 01:07
Сообщение
#634
|
новичок Группа: форумчанин (*) Сообщений: 9 Регистрация: 22-August 20 Пользователь №: 198,224 |
|
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"; } |
ALexusB |
Sep 2 2020, 21:44
Сообщение
#636
|
Разработчик ВМЛ-КВЛ Группа: Admin Сообщений: 16,306 Регистрация: 2-November 04 Пользователь №: 3 |
А что за потеря сознания в бою? Уже не помню
Если раньше дохли, а потом воскресали, но без сабли - то вещи в кармане есть вообще? Если есть, то можно просто снять и одеть экипировку + там есть какой-то метод, дернуть ядро,чтоб она нарисовалась на модели. |
Slayer |
Sep 2 2020, 23:12
Сообщение
#637
|
юнга Группа: форумчанин (*) Сообщений: 18 Регистрация: 2-September 20 Пользователь №: 199,708 |
А что за потеря сознания в бою? Уже не помню Если раньше дохли, а потом воскресали, но без сабли - то вещи в кармане есть вообще? Если есть, то можно просто снять и одеть экипировку + там есть какой-то метод, дернуть ядро,чтоб она нарисовалась на модели. это в ККС . они там сознания теряют . Я просто квест пишу для себя и у меня свой абордажник если потеряет сознание то его сабля с него снимается и просто оказывается в инвентаре . Надеть - неактуально , ибо по сюжету Шарлю потом приходится драться уже с этим . его офицером, получается что офф без сабли ( я конечно обошел этот момент , выдав ему вторую саблю на время боя , потом удалив её снова) Но хотелось бы чтобы первапя сабля уже была на оффе. А что за метод? не подскажите? в описаниях скриптов не нашел. Может каким то образом можно запомнить ID предыдущего оружия ? |
ALexusB |
Sep 2 2020, 23:27
Сообщение
#638
|
Разработчик ВМЛ-КВЛ Группа: Admin Сообщений: 16,306 Регистрация: 2-November 04 Пользователь №: 3 |
ИД оружия в переменную из sld.equip.blade
Метод где equip.blade = и отрисовка на модели - поиском найти |
Verdugo |
Sep 2 2020, 23:36
Сообщение
#639
|
новичок Группа: форумчанин (*) Сообщений: 9 Регистрация: 22-August 20 Пользователь №: 198,224 |
А вы рефреш модели делаете перед тем как экипировать саблю?
Characters_RefreshModel(sld); Или она сама одевается? |
Slayer |
Sep 3 2020, 15:24
Сообщение
#640
|
юнга Группа: форумчанин (*) Сообщений: 18 Регистрация: 2-September 20 Пользователь №: 199,708 |
|
Текстовая версия | Сейчас: 25th May 2024 - 15:23 |