|
Addon Maker. Урок № 1. Добавить новый предмет в игру.
| |
Reboroda | Дата: Вторник, 25.03.2014, 01:27 | Сообщение # 141 |
Мичман
Группа: Корсар
Сообщений: 146
Награды: 10
Репутация: 111
Статус: В открытом море
| Цитата Весь массив предметов, описанный в inititems, генерируется в начале игры... Похоже что не только предметов. В нашем аддоне мы зафиксили лесничный марш дома в Кумане (модель из кс). Прописали ее в Cumana.c как .always и в итоге: ничего не изменилось! Со старой сохраненки. А вот при старте новой игры - любо дорого посмотреть, все на месте.
- Бизнесмен убъет в вас зрителя, но ты... Билли... Неужели тебе это могло понравиться? - Да я вообще только одним глазком...
|
|
| |
Nathaniel | Дата: Среда, 26.03.2014, 08:44 | Сообщение # 142 |
Контр-адмирал
Группа: Капитан
Сообщений: 8036
Награды: 347
Репутация: 1845
Статус: В открытом море
| Цитата Reboroda ( ) при старте новой игры - любо дорого посмотреть, все на месте Что вполне логично! В массивы записывается очень много данных... И далеко не только предметы и NPC...
Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор. Но я не нашёл там никого, кто не был бы моим другом!
|
|
| |
Reboroda | Дата: Понедельник, 21.04.2014, 00:53 | Сообщение # 143 |
Мичман
Группа: Корсар
Сообщений: 146
Награды: 10
Репутация: 111
Статус: В открытом море
| Такой вопрос: Как сделать проверяльщик минимального HP у перса? Чтоб по достижению "порога" (минимума HP, напр = 10), у данного перса (допустим оффа) отбирался один предмет (напр бутыль вина с ядом), и выдавался другой (напр пустая бутыль). Т.е не успел отобрать яд у живого - он ее всю выпил.
Я пробовал юзать стандартную функцию "Квест после боя": Код void LAi_SetCheckMinHP(aref chr, float min, bool immortal, string quest) { if(min < 0.9999999) min = 0.9999999; chr.chr_ai.hpchecker = min; chr.chr_ai.hpchecker.quest = quest; chr.chr_ai.hpchecker.immortal = immortal; } ...Но она вызывает квест, а когда прописываешь в кейс нового квеста: Код TakeNItems(chr, "пустая бутыль", 1); TakeNItems(chr, "ядовитое вино", -1); , он понятное дело раздает пустые бутылки всем персам и вычитает тоже у всех, а мне нужно именно у текущего оффа. Так как быть, написать новую функцию? Что в нее прописать, камрады?
Добавлено (21.04.2014, 00:53) --------------------------------------------- А вообще я пробовал просто добавлять трупу новый предмет - пустую бутыль, с последующим вычитанием имевшейся полной, т.е ставил условие на наличие полной бутыли и смерти перса, в замен - выдачу пустой бутыли и вычет полной. Однако у меня ничего не получилось, у трупа пустой бутылки не обнаруживалось, полная оставалась на месте.(
- Бизнесмен убъет в вас зрителя, но ты... Билли... Неужели тебе это могло понравиться? - Да я вообще только одним глазком...
Сообщение отредактировал Reboroda - Понедельник, 21.04.2014, 00:56 |
|
| |
Mett | Дата: Понедельник, 21.04.2014, 01:36 | Сообщение # 144 |
Капитан I ранга
Группа: Корсар
Сообщений: 586
Награды: 91
Репутация: 565
Статус: В открытом море
| Код case "1": sld = CharacteFromId("Вася"); LAi_SetCheckMinHP(sld, 10.0, 0, "2"); break;
case "2": sld = CharacteFromId("Вася"); TakeNItems(sld, "пустая бутыль", 1); TakeNItems(sld, "ядовитое вино", -1); break;
Что толку, если не можешь сделать мир лучше.
|
|
| |
Reboroda | Дата: Среда, 30.04.2014, 19:56 | Сообщение # 145 |
Мичман
Группа: Корсар
Сообщений: 146
Награды: 10
Репутация: 111
Статус: В открытом море
| Mett, понял, спасибо. Добавлено (25.04.2014, 11:12) --------------------------------------------- У меня все мушкетеры не хотят экипироваться добавленными в игру новыми мушкетами. Никак не могу разобраться, в чем проблема. Попробовал экипировать их родным двуствольным квестовым, при этом конечно в файле items.c снял запрет на экипировку им Код // if(arItem.id == "mushket2x2") return false; . Но и родным мушкетом они экипироваться не хотят. Тупо ходят с пустыми руками в режиме анимации мушкетера. Может кто сталкивался с подобной проблемой? Как решить? Что исправить?Добавлено (26.04.2014, 18:25) --------------------------------------------- Вопрос снимаю, тк осилил и это дело.) Как оказалось, ограничение стоит в файле characterUtilite.c, что в папке characters. Там есть строки кода: Код if (chref.id == "OffMushketer") { if (groupName == GUN_ITEM_TYPE && itemID != "mushket2x2") return; } else { if (groupName == GUN_ITEM_TYPE && itemID != "mushket") return; } } } else { if (groupName == GUN_ITEM_TYPE && itemID == "mushket") return; if (groupName == GUN_ITEM_TYPE && itemID == "mushket2x2") return; }
Тут все понятно, если квестовый офф не имеет своего двуствольника - он забивает на экипировку полностью, (тк его экипировка стоит первым делом, и если условие не срабатывает - return). :) Затем прописано, мол если не "OffMushketer", то если у него нет фитильного мушкета - он тоже забивает на экипировку чем либо другим, вот почему даже двустволку солдафоны не брали. Вот такая система.Добавлено (30.04.2014, 19:56) --------------------------------------------- А как изъять важный добавленный айтем у трупа до обыска, но так чтобы остальные обязательно остались. Дело в том, что если отключить "chr.SaveItemsForDead", лут у трупа - всякая рандомная ерунда, если - включить, то ГГ может заполучить то, что ему нельзя, кроме того, что можно. Есть варианты?
- Бизнесмен убъет в вас зрителя, но ты... Билли... Неужели тебе это могло понравиться? - Да я вообще только одним глазком...
|
|
| |
korsar01 | Дата: Среда, 30.04.2014, 20:09 | Сообщение # 146 |
Мичман
Группа: Корсар
Сообщений: 186
Награды: 6
Репутация: 46
Статус: В открытом море
| Цитата Reboroda ( ) изъять важный добавленный айтем у трупа до обыска Код TakeItemFromCharacter(chr, "id");
|
|
| |
Reboroda | Дата: Среда, 30.04.2014, 21:20 | Сообщение # 147 |
Мичман
Группа: Корсар
Сообщений: 146
Награды: 10
Репутация: 111
Статус: В открытом море
| Цитата korsar01 ( ) TakeItemFromCharacter(chr, "id"); Так он его изымает до смерти!)) Я забыл уточнить, в данном случае, важный айтем - квестовый мушкет, при его изъятии до смерти - мушкетер бегает с голыми руками. Вроде как chr относится к живому, а у трупа как? Я знаю, напр, что RemoveAllCharacterItems(chr, false) - трет все предметы и золото по желанию (true - трет, false - оставляет), но опять же - у живого...Добавлено (30.04.2014, 21:07) --------------------------------------------- Вот такой вар-нт, с проверкой на труп или нет, тоже не прокатывает: Код if(CheckAttribute(chr, "chr_ai.hp") == false) { RemoveAllCharacterItems(chr, false) // тереть всё GiveItem2Character(chr, "тот что должен остаться"); } Добавлено (30.04.2014, 21:20) --------------------------------------------- Точно, эт разовая проверка при загрузке...
- Бизнесмен убъет в вас зрителя, но ты... Билли... Неужели тебе это могло понравиться? - Да я вообще только одним глазком...
|
|
| |
Mett | Дата: Среда, 30.04.2014, 22:03 | Сообщение # 148 |
Капитан I ранга
Группа: Корсар
Сообщений: 586
Награды: 91
Репутация: 565
Статус: В открытом море
| Reboroda, Код if(CheckAttribute(chr, "chr_ai.hp") && stf(chr.chr_ai.hp) == 0.0)
Что толку, если не можешь сделать мир лучше.
|
|
| |
Reboroda | Дата: Среда, 30.04.2014, 23:06 | Сообщение # 149 |
Мичман
Группа: Корсар
Сообщений: 146
Награды: 10
Репутация: 111
Статус: В открытом море
| Mett, не срабатывает( Все предметы остаются в трупе. Прописал так:
Код chr.SaveItemsForDead = true; if(CheckAttribute(chr, "chr_ai.hp") && stf(chr.chr_ai.hp) == 0.0) { RemoveAllCharacterItems(chr, false) GiveItem2Character(chr, "тот что должен остаться"); } Добавлено (30.04.2014, 23:00) --------------------------------------------- Упс. ";" забыл поставить после терки.... Добавлено (30.04.2014, 23:06) --------------------------------------------- Нет, по прежнему, не срабатывает.(
- Бизнесмен убъет в вас зрителя, но ты... Билли... Неужели тебе это могло понравиться? - Да я вообще только одним глазком...
|
|
| |
Mett | Дата: Среда, 30.04.2014, 23:19 | Сообщение # 150 |
Капитан I ранга
Группа: Корсар
Сообщений: 586
Награды: 91
Репутация: 565
Статус: В открытом море
| а в какую функцию дописываешь фишку, или функция новая? просто можно было бы сделать так
Код if(chr.id == "нужный_НПС") { RemoveAllCharacterItems(chr, false); GiveItem2Character(chr, "тот что должен остаться"); }
и дописать такой участок в функцию, которая отвечает за смерть НПСа Код void LAi_Character_Dead_Process(aref chr)
Что толку, если не можешь сделать мир лучше.
|
|
| |
Reboroda | Дата: Вторник, 27.05.2014, 12:23 | Сообщение # 151 |
Мичман
Группа: Корсар
Сообщений: 146
Награды: 10
Репутация: 111
Статус: В открытом море
| В bool LAi_CreateEncounters(ref location), которая энкаунтеров креачит, типа патруля там и тд... Добавлено (01.05.2014, 00:42) --------------------------------------------- Прописал в void LAi_Character_Dead_Process(aref chr), так и осталось все, нифига не пойму в чем дело. Ну и ладно, придумаю что-то другое. Зато интересный прикол, когда я добавил эту тему в LAi_CreateEncounters, индейцы перестали воевать, признали таки в ГГ безобидного ингиза.))) Буду разбираться в чем соль. Добавлено (27.05.2014, 12:02) --------------------------------------------- Разобрался) Я случайно исправил в следующем коде минус "-1" на плюс "+1": Код LAi_SetCheckMinHP(chr, LAi_GetCharacterHP(chr)-1, true, "LandEnc_RaidersBeforeDialog");
Индейцы действовали как подранки, только без ранения. Сразу атаковали. Добавлено (27.05.2014, 12:23) --------------------------------------------- Я сделал рэндом код, чтоб индейцы сами выбирали: мачить либо угрожать диалогом. В 50% нападут без предупреждения короче.) Код if (rand(10) > 5) { LAi_SetCheckMinHP(chr, LAi_GetCharacterHP(chr)-1, true, "LandEnc_RaidersBeforeDialog"); }else { LAi_SetCheckMinHP(chr, LAi_GetCharacterHP(chr)+1, true, "LandEnc_RaidersBeforeDialog"); }
Возможно, кому-нибудь пригодится.
- Бизнесмен убъет в вас зрителя, но ты... Билли... Неужели тебе это могло понравиться? - Да я вообще только одним глазком...
|
|
| |
Mett | Дата: Вторник, 27.05.2014, 23:54 | Сообщение # 152 |
Капитан I ранга
Группа: Корсар
Сообщений: 586
Награды: 91
Репутация: 565
Статус: В открытом море
| Цитата Reboroda ( ) В 50% нападут без предупреждения короче.) можно было бы и так
Что толку, если не можешь сделать мир лучше.
|
|
| |
Reboroda | Дата: Среда, 28.05.2014, 02:42 | Сообщение # 153 |
Мичман
Группа: Корсар
Сообщений: 146
Награды: 10
Репутация: 111
Статус: В открытом море
| Mett, это да.) Так типа, того, полегче движку чтоль?))
- Бизнесмен убъет в вас зрителя, но ты... Билли... Неужели тебе это могло понравиться? - Да я вообще только одним глазком...
|
|
| |
Mett | Дата: Среда, 28.05.2014, 04:24 | Сообщение # 154 |
Капитан I ранга
Группа: Корсар
Сообщений: 586
Награды: 91
Репутация: 565
Статус: В открытом море
| Цитата Reboroda ( ) Так типа, того, полегче движку чтоль?)) ну, думаю, что да.. в случае 50на50 я б использовал свой вариант)
Что толку, если не можешь сделать мир лучше.
|
|
| |
Reboroda | Дата: Суббота, 31.05.2014, 19:49 | Сообщение # 155 |
Мичман
Группа: Корсар
Сообщений: 146
Награды: 10
Репутация: 111
Статус: В открытом море
| Я тут как-то раньше спрашивал, можно ли сделать предмет, типа черной метки, или проклятого амулета сектантов, способный снимать с владельца "иммунитет" (отключку френдлифаера для своей команды). Я нашел способ это сделать, однако пока не уверен точно, будут ли какие-нибудь дурные последствия от него в игре. =)
Код снимает с носящего атрибут "chr_ai.group" (чувак - принадлежит группе), ну а если "проклятого" предмета у перса не будет - иммунитет восстанавливается: Код if(GetCharacterItem(chr, "jewelry6") > 0) { DeleteAttribute(chr, "chr_ai.group"); }else{ chr.chr_ai.group = true; }
Самое смешное, что если сей предмет имеет сам Гг - он может крошить в капусту любого из своих, а те, в свою очередь, покрошат его в схватке френдлифаером.
Зы. Теперь только проверить, не приведет ли это к глюкам в ходе игры, это - раз, и добавить код, от которого покоцанный героем офф становился бы врагом и принимал решение контратаковать имеющ оружием.) Это - два. И в угоду прокачки нормуль и правильнее такая реакция. Но в репу Гг минус однозначно. Кто-нибудь сможет набросать такую добавку?
Добавлено (31.05.2014, 19:49) --------------------------------------------- Плохая была идея)) Не пробуйте этот код! Лучше удалить этот пост. От этого кода все путается с врагами-друзьями. Враги перестают получать повреждения, отказываются бить и вообще мраки.
- Бизнесмен убъет в вас зрителя, но ты... Билли... Неужели тебе это могло понравиться? - Да я вообще только одним глазком...
Сообщение отредактировал Reboroda - Воскресенье, 01.06.2014, 00:07 |
|
| |
Mett | Дата: Воскресенье, 01.06.2014, 18:15 | Сообщение # 156 |
Капитан I ранга
Группа: Корсар
Сообщений: 586
Награды: 91
Репутация: 565
Статус: В открытом море
| Reboroda, пост пусть остается, чтоб другие знали, что такой код использовать нельзя!)
Что толку, если не можешь сделать мир лучше.
|
|
| |
Salkyn | Дата: Среда, 29.10.2014, 21:34 | Сообщение # 157 |
Матрос
Группа: Корсар
Сообщений: 31
Награды: 0
Репутация: 10
Статус: В открытом море
| мастера есть тут еще живые?)) у меня вопрос по поводу дополнительных сундуков/рюкзаков - эт что такое и где они появятся в итоге?
|
|
| |
fedya228 | Дата: Вторник, 07.06.2016, 23:07 | Сообщение # 158 |
Пороховая обезьяна
Группа: Пират
Сообщений: 1
Награды: 0
Репутация: 0
Статус: В открытом море
| пытаюсь добавить новую саблю в Корсары: ПКМ, вот только нихрена не добавляется! всех торговцев обьездил несколько раз - нету! что делать? вот код, мож тут чето не так? стоит пак моргана
Код makeref(itm,Items[n]); itm.id = "blade28"; itm.groupID = BLADE_ITEM_TYPE; itm.name = "itmname_blade28"; itm.describe = "itmdescr_blade28"; itm.folder = "items"; itm.model = "blade28"; itm.picIndex = 13; itm.picTexture = "ITEMS_1"; itm.price = 1; itm.dmg_min = 30.0; itm.dmg_max = 50.0; itm.piercing = 100.0; itm.minlevel = 1; itm.rare = 0.1; itm.block = 100.0; itm.param.time = 0.1; itm.param.colorstart = argb(64, 64, 64, 64); itm.param.colorend = argb(0, 32, 32, 32); n++;
|
|
| |
Nathaniel | Дата: Вторник, 07.06.2016, 23:44 | Сообщение # 159 |
Контр-адмирал
Группа: Капитан
Сообщений: 8036
Награды: 347
Репутация: 1845
Статус: В открытом море
| Цитата fedya228 ( ) мож тут чето не так? Полагаю, вписать идентификатор нового предмета в общий диалог торговцев, чтобы он выбирался в качестве одного из товаров...
Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор. Но я не нашёл там никого, кто не был бы моим другом!
|
|
| |
starkbee | Дата: Понедельник, 29.08.2016, 22:42 | Сообщение # 160 |
Пороховая обезьяна
Группа: Пират
Сообщений: 10
Награды: 0
Репутация: 0
Статус: В открытом море
| Цитата Igorek-96 ( ) открывай utils в папке /корсары 3 гпк/PROGRAM/scripts находи строки и по примеру добавляй..
Перейди по ссылке на первоисточник - там все описано (стрелка справа от Igorek-96).
|
|
| |
|