![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#261
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
Тут для теста Аз написал скрипт подсчета игрового времени. Цикл вывода инфы 5 минут, подсчета 1 минута. Может пригодится...
Neverwinter Script //::///////////////////////////////////////////////
//:: Скрип работает при загрузке модуля //:: FileName: module_load //:: auth: azathoth //////////////////////////////////////////////////////////////////////////////// // ***** ПОДСЧЕТ ВРЕМЕНИ ДЛЯ ТЕСТА ***** //////////////////////////////////////////////////////////////////////////////// void Count(int nTimer) { object oPC = GetFirstPC(); object oMod = GetModule(); int iHB = GetLocalInt(oMod, "HB_TIME"); SetLocalInt(oMod, "HB_TIME", iHB+1); if(iHB >= 4) { int iTimeGameM = GetLocalInt(oMod, "Time_Game_M"); //минуты int iTimeGameH = GetLocalInt(oMod, "Time_Game_H"); //часы SetLocalInt(oMod, "HB_TIME", 0); if(iTimeGameM > 55) { iTimeGameH++; SetLocalInt(oMod, "Time_Game_H", iTimeGameH); //часы SetLocalInt(oMod, "Time_Game_M", 0); //минуты } else { iTimeGameM+=5; SetLocalInt(oMod, "Time_Game_M", iTimeGameM); } SendMessageToPC(oPC, "Длительность игры: "+IntToString(iTimeGameH)+" ч. "+IntToString(iTimeGameM)+" мин."); } DelayCommand(60.0, Count(nTimer + 1)); } //////////////////////////////////////////////////////////////////////////////// void main() { // ================= ДЛЯ ТЕСТА ==================== if (GetLocalInt(GetModule(), "START_TIME_TEST") == 0) // Проверить { SetLocalInt(GetModule(),"START_TIME_TEST",1); Count(0); } } Сообщение отредактировал gennady - Jun 5 2010, 11:50 |
![]()
Сообщение
#262
|
|
Level 3 ![]() Класс: Воин Характер: Chaotic Good Раса: Человек ![]() |
Мне нужно было написать скрипт, который перемещает вещи из одного сундука в другой. Решил вопрос так:
Neverwinter Script void main() { object oPC = GetFirstPC(), oChest_01 = GetObjectByTag("RC_chest_01"), oChest_02 = GetObjectByTag("RC_chest_02"), oItem = GetFirstItemInInventory(oChest_01), oItem_in; //string sString = "скрипт сработал"; while(GetIsObjectValid(oItem)) { //FloatingTextStringOnCreature(sString, oPC); CopyItem(oItem, oChest_02); DestroyObject(oItem); //sString = "скрипт сработал более одного раза"; oItem = GetNextItemInInventory(oChest_01); } //FloatingTextStringOnCreature("вещей нет", oPC); return; } Однако выяснилось, что предметы типа контейнера не копируются, если в них что-то есть. Копируется только их содержимое. Сам контейнер пропадает. Попробовал решить вопрос следующим образом(хотя ясно, что это не совсем то, что нужно): Neverwinter Script void main() { object oPC = GetFirstPC(), oChest_01 = GetObjectByTag("RC_chest_01"), oChest_02 = GetObjectByTag("RC_chest_02"), oItem = GetFirstItemInInventory(oChest_01), oItem_in; //string sString = "скрипт сработал"; while(GetIsObjectValid(oItem)) { //FloatingTextStringOnCreature(sString, oPC); while(GetHasInventory(oItem)) { oItem_in = GetFirstItemInInventory(oItem); while(GetIsObjectValid(oItem_in)) { CopyItem(oItem_in, oChest_02); DestroyObject(oItem_in); oItem_in = GetNextItemInInventory(oItem); } CopyItem(oItem, oChest_02); DestroyObject(oItem); oItem = GetNextItemInInventory(oChest_01); } CopyItem(oItem, oChest_02); DestroyObject(oItem); //sString = "скрипт сработал более одного раза"; oItem = GetNextItemInInventory(oChest_01); } //FloatingTextStringOnCreature("вещей нет", oPC); return; } Но в этом случае предметы из контейнера копируются дважды, а сам контейнер опять же пропадает. Есть идеи, как скопировать контейнер с вложенными в него вещами? |
![]()
Сообщение
#263
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Никак. Sad, but true.
|
![]()
Сообщение
#264
|
|
Level 5 ![]() ![]() Класс: Пьяный Мастер Характер: Chaotic Good Раса: Человек ![]() |
ну по идеи нужно скопировать/создать сначала сам контейнер
а потом скопировать вещи из одного в другой у тебя во всех скриптах копируются только вещи |
![]()
Сообщение
#265
|
|
Level 3 ![]() Класс: Воин Характер: Chaotic Good Раса: Человек ![]() |
|
![]()
Сообщение
#266
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Контейнеры вообще зло (IMG:style_emoticons/kolobok_light/smile.gif)
Цитата я исходил из того, что после перебора, копирования и удаления всех вещей в контейнере, он станет пустым и скопируется нормально. Но не получилось. Потому что дестрой только помечает на удаление, удаляются вещи после окончания работы скрипта. Пока скрипт работает, контейнер не пустой.Цитата у тебя во всех скриптах копируются только вещи Нет, там и контейнер мелькает, он тоже ловится при переборе параллельно со своим содержимым.
|
![]()
Сообщение
#267
|
|
Level 7 ![]() ![]() Класс: Некромант Характер: True Neutral Раса: Нежить ![]() |
|
![]()
Сообщение
#268
|
|
Level 3 ![]() Класс: Воин Характер: Chaotic Good Раса: Человек ![]() |
В первом это можно было сделать при помощи ActionGiveItem, но на втором не проверялось. Хотя можно и с копированием извратиться при особом желании. Спасибо, контейнер действительно переносится со всеми вложенными вещами. Neverwinter Script void main() { object oPC = GetFirstPC(), oChest_01 = GetObjectByTag("RC_chest_01"), oChest_02 = GetObjectByTag("RC_chest_02"), oItem = GetFirstItemInInventory(oChest_01), oItem_in; //string sString = "скрипт сработал"; while(GetIsObjectValid(oItem)) { //FloatingTextStringOnCreature(sString, oPC); AssignCommand(oChest_01, ActionGiveItem(oItem, oChest_02)); //sString = "скрипт сработал более одного раза"; oItem = GetNextItemInInventory(oChest_01); } //FloatingTextStringOnCreature("вещей нет", oPC); return; } |
![]()
Сообщение
#269
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Эпично (IMG:style_emoticons/kolobok_light/smile.gif) Помню даже на волте видел когда-то скрипт, где всё копировалось, а вот контейнер уничтожался, и в комментах было типа "так надо, иначе дюп" (IMG:style_emoticons/kolobok_light/smile.gif)
|
![]()
Сообщение
#270
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Да, здорово... Сразу вспоминается куча проблем при работе с рюкзаками. (IMG:style_emoticons/kolobok_light/smile.gif)
|
![]()
Сообщение
#271
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
Ну если ActionGiveItem() работает через стек действий, то с игроком может не прокатить (скажем, дроп при смерти, или забитый стек, или дикие лаги). Но вот между сундуками работает (IMG:style_emoticons/kolobok_light/smile.gif)
|
![]()
Сообщение
#272
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Если уж так приспичило, сундук всегда можно пересоздать с палитры (IMG:style_emoticons/kolobok_light/rolleyes.gif)
|
![]()
Сообщение
#273
|
|
Level 7 ![]() ![]() Класс: Некромант Характер: True Neutral Раса: Нежить ![]() |
|
![]()
Сообщение
#274
|
|
Level 2 ![]() Класс: Волшебник Характер: Neutral Good Раса: Человек ![]() |
Извините, если вопрос не по теме. Я видел, как в обе NWN прикручивали новые навыки (feats). Я понял, что это делали через скрипт, но как?
Кто-нибудь так делал? Сообщение отредактировал GoodLuc - Jun 24 2010, 18:21 |
![]()
Сообщение
#275
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
нужно 2da таблицы ковырять: feats + spells + еще пара по мелочи, и конечно же скрипты. Все это довольно подробно описано в разделе Кастом Контент в категории тулсета первого НВН (во втором суть та же, мб чуток больше параметров).
Новые фиты могут быть только активными. Пассивные вещи типа (+1 атака всегда) сделать нельзя, к сожалению. Те можно, но коряво и через попу. Или через nwnx - но это только для мультиплеера. |
![]()
Сообщение
#276
|
|
Level 2 ![]() Класс: Волшебник Характер: Neutral Good Раса: Человек ![]() |
Цитата Все это довольно подробно описано в разделе Кастом Контент в категории тулсета первого НВН А где именно? |
![]()
Сообщение
#277
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
где-то в этой теме: 2ДА таблицы
|
![]()
Сообщение
#278
|
|
Level 8 ![]() ![]() ![]() Класс: Псионик Характер: Chaotic Neutral Раса: Хафлинг ![]() |
Хотел поделится скриптом строкового массива, может мне бы его оптимизировали..
Neverwinter Script
Сообщение отредактировал PaiNt - Sep 24 2010, 06:44 |
![]()
Сообщение
#279
|
|
Level 12 ![]() Класс: Оборотень Характер: Chaotic Neutral Раса: Нежить NWN: Скриптинг [Sn] ![]() |
Neverwinter Script if(GetStringLength(sDevider)!=1) sDevider=","; Ага, незадокумментированная фича! |
![]()
Сообщение
#280
|
|
Level 8 ![]() ![]() ![]() Класс: Псионик Характер: Chaotic Neutral Раса: Хафлинг ![]() |
Neverwinter Script if(GetStringLength(sDevider)!=1) sDevider=","; Ага, незадокумментированная фича! Да, (IMG:style_emoticons/kolobok_light/smile.gif) вот бы вспомнить как вообще все это работает (IMG:style_emoticons/kolobok_light/smile.gif) Поидее функция позволяяет добавлять элемент в конец массива (удлинять массив). Как и было замечено разделитель предусматривается только односимвольный. |
![]()
Сообщение
#281
|
|
Level 12 ![]() Класс: Оборотень Характер: Chaotic Neutral Раса: Нежить NWN: Скриптинг [Sn] ![]() |
Цитата вот бы вспомнить как вообще все это работает ну уж даже если ты не вспомнишь, то вряд ли тут найдутся добровольцы сами разобраться и ещё оптимизировать. |
![]()
Сообщение
#282
|
|
Level 1 Класс: Обыватель Характер: Lawful Good Раса: Человек ![]() |
у меня твердое намеренье, ввести в свою компанию что-то типа замка из офф компании...
если это возмоно силами одного человека ( а в этом я не сомневаюсь) подкиньте идей, а еще лучше подскажите где найти грамотный гайд именно по скриптописанию. все остальный что я встречал, ничего путного на эту тему не говорят. п.с. я не чужд программированию и т.д. т.п., но синтаксиса тулсета не знаю. И на русском ничего не нашел. (А с английским я провожусь не один месяц...) |
![]()
Сообщение
#283
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
на русском есть лишь пара совсем нубских гайдов и пару глав про скрипты в НВН1. Если не чужд программированию, то тебе по сути только функции изучить (циклы, условия, объявление переменных и тд тебе должно быть знакомо, синтаксис си тоже не должен вызвать трудностей). А тут никакой гайд не поможет, только ковыряние.
Более менее приличные гайды есть на английском. Но тоже не фонтан, если честно. Начни изучение с ковыряния уже готовых скриптов (точно зная что они делают), потом пробуй крутить параметры и оценивать результаты. Потом небольшая переделка. И тд. Функции лучше всего изучаются именно так, когда их использовать пытаешься. |
![]()
Сообщение
#284
|
|
Level 9 ![]() ![]() ![]() Класс: Волшебник Характер: Neutral Good Раса: Эльф ![]() |
Мне в своё время очень помогли ресурсы www.nwnlexicon.com / nwn1.nwn2lexicon.com и nwn2.wikia.com. Легко переводятся при помощи Google Translate, хотя там довольно просто все написано и так.
А в самом начале мне жутко помогла тулза под названием ScriptGen. Разбирая то, как она генерит скрипты, можно быстро научиться приемам работы. Сообщение отредактировал Lorendroll - Aug 12 2010, 17:05 |
![]()
Сообщение
#285
|
|
Level 2 ![]() Класс: Обыватель Характер: Chaotic Neutral Раса: Человек ![]() |
Есть у Священника заклинание 4-го круга, называется "Декламация". Действует на всех союзников, давая бонус к атаке, спасброскам и КЗ +2, если божество у цели то же, что у заклинателя, то +3.
Выглядит так: Neverwinter Script #include "nwn2_inc_spells" #include "x2_inc_spellhook" void main() { if (!X2PreSpellCastCode()) { // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell return; } // Declare major variables object oCaster = OBJECT_SELF; int nCasterLvl = GetCasterLevel(oCaster); float fDuration = RoundsToSeconds(nCasterLvl); fDuration = ApplyMetamagicDurationMods(fDuration); int nDurType = ApplyMetamagicDurationTypeMods(DURATION_TYPE_TEMPO RARY); location lTarget = GetLocation(oCaster); // effects effect eAC; effect eAttack; effect eSave; effect eVis = EffectVisualEffect(VFX_DUR_SPELL_RECITATION); effect eLink; // find the first target object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_VAST, lTarget, TRUE, OBJECT_TYPE_CREATURE); while (GetIsObjectValid(oTarget)) { if (spellsIsTarget(oTarget, SPELL_TARGET_ALLALLIES, oCaster)) { //Fire cast spell at event for the specified target SignalEvent(oTarget, EventSpellCastAt(oCaster, GetSpellId(), FALSE)); int nBonus = 2; if (GetStringLowerCase(GetDeity(oTarget)) == GetStringLowerCase(GetDeity(oCaster))) { nBonus = 3; } eAC = EffectACIncrease(nBonus, AC_DODGE_BONUS, AC_VS_DAMAGE_TYPE_ALL); eAttack = EffectAttackIncrease(nBonus); eSave = EffectSavingThrowIncrease(SAVING_THROW_ALL, nBonus, SAVING_THROW_TYPE_ALL); eLink = EffectLinkEffects(eAC, eAttack); eLink = EffectLinkEffects(eLink, eSave); eLink = EffectLinkEffects(eLink, eVis); RemoveEffectsFromSpell(oTarget, GetSpellId()); //Apply the VFX impact and effects ApplyEffectToObject(nDurType, eLink, oTarget, fDuration); } oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_VAST, lTarget, TRUE, OBJECT_TYPE_CREATURE); } } Помогите поправить, пожалуйста. Нужно чтобы под действие заклинания попадали только дружественные аутсайдеры, плюс чтобы не было бонуса для них, если божество совпадает с божеством заклинателя. Как это сделать? Сообщение отредактировал DilanZendal - Aug 14 2010, 15:46 |
![]() ![]() |
Текстовая версия | Сейчас: 19th July 2025 - 20:04 |