![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#2716
|
|
Level 1 Класс: Убийца Характер: Neutral Evil Раса: Человек ![]() |
ясно. спасибо.
|
![]()
Сообщение
#2717
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
не надо мешать все в одну кучу. В эту тему по возможности только конкретные вопросы по скриптам. Типа "я пишу такой-то скрипт и что-то не работает" и тд. Все другие вопросы про то, как сделать какие-то простые вещи - в тему ВОПРОСЫ НОВИЧКОВ. Вопросы более отвлеченные (про Макс например) в ОДИНОЧНЫЕ ВОПРОСЫ
|
![]()
Сообщение
#2718
|
|
Level 2 ![]() Класс: Убийца Характер: Neutral Evil Раса: Человек ![]() |
gennady спсиба тебе за всё :) навёл меня на очень умные мысли
Переписал заново скрипт. Всё работает как часы. Выкладываю, может кому пригодится Neverwinter Script Source //:://////////////////////////////////////////////////////////////////////////// //:: Name: sl_on_used //:: Place: OnUsed Placeble //:://////////////////////////////////////////////////////////////////////////// /* ОПИСАНИЕ: Скрипт дуэли между ПС и НПС. На обоих до начала боя вешается бессмертие. Дуэль проигрывает тот, у кого остался 1 хитпоинт. Проигравший на время вырубается и, опционально, у него выбрасываются оружие и деньги. УСТАНОВКА: Скрипт sl_on_used поставить на любое действие, которое должно активиоровать дуэль Скрипт sl_OnCombatRoundEnd поставить на OnCombatRoundEnd НПСа, с которым будет дуэль Создать фракцию temp_enemy, нейтральную ко всем, кроме игрока, к нему враждебна Создать существо с этой фракцией в закрытой локе Удостовериться в том, что НПС с которым будет дуэль - не единственный в своей фракции, если единственный, то создать существо с его фракцией в закрытой локе (опционально) Настроить НПС с приведенными ниже параметрами ПАРАМЕТРЫ НПС: Установите на НПС локальные переменные числового типа, если хотите отключить следующие возможности скрипта (Название переменной/Значение/Описание) WinCountOFF/1/НЕ Считает количество побед НПС над ПС DefeatCountOFF/1/НЕ Считает количество поражений НПС от ПС WeaponDropOFF/1/НПС при поражение НЕ выбрасывает свое оружие MoneyDropOFF/1/НПС при поражение НЕ выбрасывает свои деньги GetPlayerWeaponMoneyOFF/1/НПС при победе НЕ забирает оружие и деньги ПС HealOFF/1/НПС НЕ лечится после боя OwnWeaponPickUpOFF/1/Если ПС после победы не взял оружие и/или золото НПС, то НПС когда оклемается, подберет его WeaponHideOFF/1/Если НПС перед боем стоял без оружия, то после боя он НЕ убирает его в инвентарь GoHomeOFF/1/НПС после боя НЕ возврашается на то место, где он был перед началом боя */ //:://////////////////////////////////////////////////////////////////////////// //:: Created By: Slam //:: Created On: 14.05.07 //:: Debugging help: gennady //:://////////////////////////////////////////////////////////////////////////// void main() { object oPC = GetFirstPC(); object oNPC = GetNearestObjectByTag("npc_guard"); object oFaction = GetObjectByTag("temp_enemy"); // МЕНЯЕМ ФРАКЦИЮ НПС НА РОДНУЮ //////////////////////////////////////////// object oFactionMember = GetNextFactionMember(oNPC, FALSE); int i; for (i = 0; i < 5; i++) { if (oFactionMember != oNPC) { SetLocalObject(oNPC, "FactionMember", oFactionMember); break; } oFactionMember = GetNextFactionMember(oFactionMember, FALSE); } //////////////////////////////////////////////////////////////////////////// // ВОЗВРАЩАЕМ НПС НА МЕСТО ///////////////////////////////////////////////// if (GetLocalInt(oNPC, "GoHomeOFF") == 0) { SetLocalLocation(oNPC, "Return_Loc", GetLocation(oNPC)); SetLocalFloat(oNPC, "FacingPoint", GetFacing(oNPC)); } //////////////////////////////////////////////////////////////////////////// SetLocalInt(oNPC, "bImmortalAttack", 1); // ОПРЕДЕЛЯЕМ, ДЕРЖИТ ЛИ НПС ОРУЖИЕ В РУКАХ ДО НАЧАЛА БОЯ ////////////////// if (GetLocalInt(oNPC, "WeaponHideOFF") == 0) { object oRHand=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oNPC); object oLHand=GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oNPC); if(oRHand != OBJECT_INVALID || oLHand != OBJECT_INVALID) { SetLocalInt(oNPC, "bIsArmed", 1); } } //////////////////////////////////////////////////////////////////////////// AssignCommand(oNPC, ClearAllActions()); AssignCommand(oNPC, ActionEquipMostDamagingMelee()); ChangeFaction(oNPC, oFaction); SetImmortal(oNPC, TRUE); SetImmortal(oPC, TRUE); AssignCommand(oNPC, ActionDoCommand(ActionAttack(oPC))); } Neverwinter Script Source //:://////////////////////////////////////////////////////////////////////////// //:: Name: sl_OnCombatRoundEnd //:: Place: OnCombatRoundEnd Creature //:://////////////////////////////////////////////////////////////////////////// /* */ //:://////////////////////////////////////////////////////////////////////////// //:: Created By: Slam //:: Created On: 14.05.07 //:: Debugging help: gennady //:://////////////////////////////////////////////////////////////////////////// #include "x0_i0_position" void DefeatCount(object oNPC); void General(object oPC, object oNPC); void ChangeFactionToParrent(object oNPC); void WeaponDrop(object oNPC); void MoneyDrop(object oNPC); void WinCount(object oNPC); void Heal(object oNPC); void GetPlayerWeaponMoney(object oNPC, object oPC); void GoHome(object oNPC); void WeaponHide(object oNPC); void Heal(object oNPC); void OwnWeaponPickUp(object oNPC); void DoIt(object oNPC); void main() { ExecuteScript("nw_c2_default3", OBJECT_SELF); object oNPC = OBJECT_SELF; if (GetLocalInt(oNPC, "bImmortalAttack") == 1) { object oPC = GetFirstPC(); int nCurPCHP = GetCurrentHitPoints(oPC); int nCurNPCHP = GetCurrentHitPoints(oNPC); // Если ПС выиграл if (nCurNPCHP < 2) { // УВЕЛИЧИВАЕМ ЛОКАЛКУ, КОТОРАЯ СЧИТАЕТ ПОРАЖАЕНИЯ НПС НА 1, см. void DefeatCount(object oNPC) if (GetLocalInt(oNPC, "DefeatCountOFF") == 0) DefeatCount(oNPC); effect eKnockdown = EffectKnockdown(); string sPCwinString = "Получил!"; float fNPCKnockdownTime = 10.0; float fNPCParentFacingPoint = GetLocalFloat(oNPC, "FacingPoint"); // ОБЩАЯ ПРОЦЕДУРА ДЛЯ НПС, НЕ ЗАВИСИМО, ВЫИГРАЛ ОН ИЛИ ПРОИГРАЛ, см. void General(object oPC, object oNPC) General(oPC, oNPC); // НПС ВЫКИДЫВАЕТ СВОЕ ОРУЖИЕ ПЕРЕД СОБОЙ, см. void WeaponDrop(object oNPC) if (GetLocalInt(oNPC, "WeaponDropOFF") == 0) WeaponDrop(oNPC); // НПС ВЫКИДЫВАЕТ СВОИ ДЕНЬГИ ПЕРЕД СОБОЙ, см. void MoneyDrop(object oNPC) if (GetLocalInt(oNPC, "MoneyDropOFF") == 0) MoneyDrop(oNPC); AssignCommand(oNPC, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnockdown, oNPC, fNPCKnockdownTime))); AssignCommand(oPC, ActionSpeakString(sPCwinString)); // ВЫПОЛНЯЕТСЯ, КОГДА НПС ПРОИГРАЛ, см. void DoIt(object oNPC) ///// DelayCommand(fNPCKnockdownTime + 0.3, DoIt(oNPC)); } // Если НПС выиграл if (nCurPCHP < 2) { // УВЕЛИЧИВАЕМ ЛОКАЛКУ, КОТОРАЯ СЧИТАЕТ ПОБЕДЫ НПС НА 1, см. void WinCount(object oNPC) if (GetLocalInt(oNPC, "WinCountOFF") == 0) WinCount(oNPC); string sNPCwinString = "Получил!"; float fPCKnockdownTime = 10.0; // ОБЩАЯ ПРОЦЕДУРА ДЛЯ НПС, НЕ ЗАВИСИМО, ВЫИГРАЛ ОН ИЛИ ПРОИГРАЛ, см. void General(object oPC, object oNPC) General(oPC, oNPC); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(), oPC, fPCKnockdownTime); AssignCommand(oNPC, SpeakString(sNPCwinString)); AssignCommand(oNPC, ActionWait(3.0)); // НПС ПЬЕТ ИЗ БУТЫЛКИ И ЛЕЧИТСЯ, см. void Heal(object oNPC) if (GetLocalInt(oNPC, "HealOFF") == 0) Heal(oNPC); // НПС ЗАБИРАЕТ ЗОЛОТО И ОРУЖИЕ ИГРОКА, ЕСЛИ ОНИ ЕСТЬ, см. void GetPlayerWeaponMoney(object oNPC, object oPC) if (GetLocalInt(oNPC, "GetPlayerWeaponMoneyOFF") == 0) GetPlayerWeaponMoney(oNPC, oPC); // ВОЗВРАЩАЕМ НПС НА МЕСТО, см. void GoHome(object oNPC) /////////// if (GetLocalInt(oNPC, "GoHomeOFF") == 0) GoHome(oNPC); // ЕСЛИ НПС ДО НАПАДЕНИЯ БЫЛ БЕЗ ОРУЖИЯ, УБИРАЕМ ОРУЖИЕ В ИНВЕНТАРЬ, см. void WeaponHide(object oNPC) if (GetLocalInt(oNPC, "WeaponHideOFF") == 0) WeaponHide(oNPC); } } else return; } // ОБЩАЯ ПРОЦЕДУРА ДЛЯ НПС, НЕ ЗАВИСИМО, ВЫИГРАЛ ОН ИЛИ ПРОИГРАЛ /////////////// void General(object oPC, object oNPC) { DeleteLocalInt(oNPC, "bImmortalAttack"); SetImmortal(oNPC, FALSE); SetImmortal(oPC, FALSE); // МЕНЯЕМ ФРАКЦИЮ НПС НА РОДНУЮ, см. void ChangeFactionToParrent(object oNPC) ChangeFactionToParrent(oNPC); ClearPersonalReputation(oPC, oNPC); AssignCommand(oNPC, ClearAllActions(TRUE)); AssignCommand(oPC, ClearAllActions(TRUE)); } //////////////////////////////////////////////////////////////////////////////// // МЕНЯЕМ ФРАКЦИЮ НПС НА РОДНУЮ //////////////////////////////////////////////// void ChangeFactionToParrent(object oNPC) { if (GetIsObjectValid(GetLocalObject(oNPC, "FactionMember"))) { object oFactionMember = GetLocalObject(oNPC, "FactionMember"); ChangeFaction(oNPC, oFactionMember); } else ChangeToStandardFaction(oNPC, STANDARD_FACTION_COMMONER); DeleteLocalObject(oNPC, "FactionMember"); } //////////////////////////////////////////////////////////////////////////////// // ВОЗВРАЩАЕМ НПС НА МЕСТО ///////////////////////////////////////////////////// void GoHome(object oNPC) { float fNPCParentFacingPoint = GetLocalFloat(oNPC, "FacingPoint"); location lNPCParentLoc = GetLocalLocation(oNPC, "Return_Loc"); AssignCommand(oNPC, ActionMoveToLocation(lNPCParentLoc)); AssignCommand(oNPC, ActionDoCommand(DelayCommand(0.3, SetFacing(fNPCParentFacingPoint)))); DeleteLocalLocation(oNPC, "Return_Loc"); DeleteLocalFloat(oNPC, "FacingPoint"); } //////////////////////////////////////////////////////////////////////////////// // ЕСЛИ НПС ДО НАПАДЕНИЯ БЫЛ БЕЗ ОРУЖИЯ, УБИРАЕМ ОРУЖИЕ В ИНВЕНТАРЬ void WeaponHide(object oNPC) { if (GetLocalInt(oNPC, "bIsArmed") == 0) { object oNPCRightHand = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oNPC); object oNPCLeftHand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oNPC); AssignCommand(oNPC, ActionDoCommand(DelayCommand(1.0, ActionUnequipItem(oNPCRightHand)))); AssignCommand(oNPC, ActionDoCommand(DelayCommand(1.5, ActionUnequipItem(oNPCLeftHand)))); } DeleteLocalInt(oNPC, "bIsArmed"); } //////////////////////////////////////////////////////////////////////////////// // НПС ЗАБИРАЕТ ЗОЛОТО И ОРУЖИЕ ИГРОКА, ЕСЛИ ОНИ ЕСТЬ ////////////////////////// void GetPlayerWeaponMoney(object oNPC, object oPC) { int nPCGold = GetGold(oPC); object oPCWeaponTag = GetLastWeaponUsed(oPC); if ((nPCGold != 0) && (GetIsObjectValid(oPCWeaponTag))) { // Есть золото, есть оружие string sNPCmoneyweaponString = "И деньги и оружие. Богатый сегодня улов"; location lPCMoneyLoc = GenerateNewLocationFromLocation(GetLocation(oPC), 1.0, GetLeftDirection(GetFacing(oPC)), 90.0); location lPCWeaponLoc = GenerateNewLocationFromLocation(GetLocation(oPC), 0.5, GetRightDirection(GetFacing(oPC)), 90.0); object oPCGold = CreateObject(OBJECT_TYPE_ITEM, "nw_it_gold001", lPCMoneyLoc); string sPCWeaponResRef = GetResRef(oPCWeaponTag); object oPCWeapon = CreateObject(OBJECT_TYPE_ITEM, sPCWeaponResRef, lPCWeaponLoc); TakeGoldFromCreature(nPCGold, oPC, TRUE); SetItemStackSize(oPCGold, nPCGold); AssignCommand(oNPC, ActionPickUpItem(oPCGold)); DestroyObject(oPCWeaponTag); AssignCommand(oNPC, ActionPickUpItem(oPCWeapon)); AssignCommand(oNPC, ActionSpeakString(sNPCmoneyweaponString)); } else if ((nPCGold != 0) && !(GetIsObjectValid(oPCWeaponTag))) { // Есть золото, нет оружия location lPCMoneyLoc = GenerateNewLocationFromLocation(GetLocation(oPC), 1.0, GetLeftDirection(GetFacing(oPC)), 90.0); string sNPCmoneynoweaponString = "И зачем тебе деньги, ты даже оружия не можешь купить"; object oPCGold = CreateObject(OBJECT_TYPE_ITEM, "nw_it_gold001", lPCMoneyLoc); TakeGoldFromCreature(nPCGold, oPC, TRUE); SetItemStackSize(oPCGold, nPCGold); AssignCommand(oNPC, ActionPickUpItem(oPCGold)); AssignCommand(oNPC, ActionSpeakString(sNPCmoneynoweaponString)); } else if ((nPCGold == 0) && (GetIsObjectValid(oPCWeaponTag))) { // Нет золота, есть оружие location lPCWeaponLoc = GenerateNewLocationFromLocation(GetLocation(oPC), 0.5, GetRightDirection(GetFacing(oPC)), 90.0); string sNPCnomoneyweaponString = "Хорошее у тебя было оружие, жаль, что еще денег нет"; string sPCWeaponResRef = GetResRef(oPCWeaponTag); object oPCWeapon = CreateObject( OBJECT_TYPE_ITEM, sPCWeaponResRef, lPCWeaponLoc); DestroyObject(oPCWeaponTag); AssignCommand(oNPC, ActionPickUpItem(oPCWeapon)); AssignCommand(oNPC, ActionSpeakString( sNPCnomoneyweaponString)); } else { // Нет золота, нет оружия string sNPCnomoneynoweaponString = "Ни денег, ни оружия, и зачем ты на меня полез?!"; AssignCommand(oNPC, ActionMoveToObject(oPC)); AssignCommand(oNPC, ActionSpeakString( sNPCnomoneynoweaponString)); } AssignCommand(oNPC, ActionWait(3.0)); } //////////////////////////////////////////////////////////////////////////////// // НПС ПЬЕТ ИЗ БУТЫЛКИ И ЛЕЧИТСЯ /////////////////////////////////////////////// void Heal(object oNPC) { int nMaxNPCHP = GetMaxHitPoints(oNPC); AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_FIREFORGET_DRINK)); ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectHeal(nMaxNPCHP), oNPC); } //////////////////////////////////////////////////////////////////////////////// // УВЕЛИЧИВАЕМ ЛОКАЛКУ, КОТОРАЯ СЧИТАЕТ ПОБЕДЫ НПС НА 1 //////////////////////// void WinCount(object oNPC) { int nWinCount = GetLocalInt(oNPC, "WinCount"); SetLocalInt(oNPC, "WinCount", nWinCount + 1); } //////////////////////////////////////////////////////////////////////////////// // НПС ВЫКИДЫВАЕТ СВОИ ДЕНЬГИ ПЕРЕД СОБОЙ ////////////////////////////////////// void MoneyDrop(object oNPC) { int nNPCGold = GetGold(oNPC); if (nNPCGold !=0) { location lNPCGoldLoc = GenerateNewLocationFromLocation(GetLocation(oNPC), 0.5, GetLeftDirection(GetFacing(oNPC)), 0.0); object oNPCGold = CreateObject(OBJECT_TYPE_ITEM, "nw_it_gold001", lNPCGoldLoc); TakeGoldFromCreature(nNPCGold, oNPC, TRUE); SetItemStackSize(oNPCGold, nNPCGold); } } //////////////////////////////////////////////////////////////////////////////// // НПС ВЫКИДЫВАЕТ СВОЕ ОРУЖИЕ ПЕРЕД СОБОЙ ////////////////////////////////////// void WeaponDrop(object oNPC) { object oNPCWeapon = GetLastWeaponUsed(oNPC); if (GetIsObjectValid(oNPCWeapon)) { SetLocalString(oNPC, "NPCWeaponTag", GetTag(oNPCWeapon)); location lNPCWeaponLoc = GenerateNewLocationFromLocation(GetLocation(oNPC), 1.0, GetRightDirection(GetFacing(oNPC)), 90.0); string sNPCItemResRef = GetResRef(oNPCWeapon); DestroyObject(oNPCWeapon); CreateObject(OBJECT_TYPE_ITEM, sNPCItemResRef, lNPCWeaponLoc); } } //////////////////////////////////////////////////////////////////////////////// // УВЕЛИЧИВАЕМ ЛОКАЛКУ, КОТОРАЯ СЧИТАЕТ ПОРАЖАЕНИЯ НПС НА 1 //////////////////// void DefeatCount(object oNPC) { int nDefeatCount = GetLocalInt(oNPC, "DefeatCount"); SetLocalInt(oNPC, "DefeatCount", nDefeatCount + 1); } //////////////////////////////////////////////////////////////////////////////// // НПС СОБИРАЕТ СВОЕ ОРУЖИЕ, ЕСЛИ ИГРОК НЕ ПОДНЯЛ ЕГО ////////////////////////// void OwnWeaponPickUp(object oNPC) { object oNPCWeapon = GetNearestObjectByTag(GetLocalString(oNPC, "NPCWeaponTag")); if (GetIsObjectValid(oNPCWeapon)) { AssignCommand(oNPC, ActionPickUpItem(oNPCWeapon)); } object oNPCGold = GetNearestObjectByTag("NW_IT_GOLD001"); if (GetIsObjectValid(oNPCGold)) { AssignCommand(oNPC, ActionPickUpItem(oNPCGold)); } } //////////////////////////////////////////////////////////////////////////////// // ВЫПОЛНЯЕТСЯ, КОГДА НПС ПРОИГРАЛ, сделанна из-за своей криворукости при работе с DelayCommand void DoIt(object oNPC) { string sNPCdefeatString = "Ммм... Моя голова"; AssignCommand(oNPC, ActionSpeakString(sNPCdefeatString)); AssignCommand(oNPC, ActionWait(3.0)); // НПС ПЬЕТ ИЗ БУТЫЛКИ И ЛЕЧИТСЯ, см. void Heal(object oNPC) /////////////// if (GetLocalInt(oNPC, "HealOFF") == 0) Heal(oNPC); // НПС СОБИРАЕТ СВОЕ ОРУЖИЕ, ЕСЛИ ИГРОК НЕ ПОДНЯЛ ЕГО, см. void OwnWeaponPickUp(object oNPC) if (GetLocalInt(oNPC, "OwnWeaponPickUpOFF") == 0) OwnWeaponPickUp(oNPC); DeleteLocalString(oNPC, "NPCWeaponTag"); // ВОЗВРАЩАЕМ НПС НА МЕСТО, см. void GoHome(object oNPC) /////////////////// if (GetLocalInt(oNPC, "GoHomeOFF") == 0) GoHome(oNPC); // ЕСЛИ НПС ДО НАПАДЕНИЯ БЫЛ БЕЗ ОРУЖИЯ, УБИРАЕМ ОРУЖИЕ В ИНВЕНТАРЬ, см. void WeaponHide(object oNPC) if (GetLocalInt(oNPC, "WeaponHideOFF") == 0) WeaponHide(oNPC); } |
![]()
Сообщение
#2719
|
|
Level 11 ![]() ![]() ![]() Класс: Воин Характер: Lawful Good Раса: Человек ![]() |
А можно заставить камеру трястись. Типа землетрясение? (IMG:style_emoticons/kolobok_light/rolleyes.gif)
|
![]()
Сообщение
#2720
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Slam, тут рядом есть тема "База скриптов". Туда скрипт запости.
Цитата(Белатрис @ May 17 2007, 13:04) [snapback]108330[/snapback] А можно заставить камеру трястись. Типа землетрясение? эффект землетрясения наложить. Или быстрые и рандомные изменения параметров камеры (дальность, угол, подъем) в небольшом диапазоне (но это теоретически, практически я такое не делал (IMG:style_emoticons/kolobok_light/smile.gif) ) |
![]()
Сообщение
#2721
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Цитата(Lex @ May 17 2007, 22:51) [snapback]108348[/snapback] эффект землетрясения наложить. Попросить друга потрясти монитор (IMG:style_emoticons/kolobok_light/smile.gif) |
![]()
Сообщение
#2722
|
|
Level 2 ![]() Класс: Убийца Характер: Neutral Evil Раса: Человек ![]() |
У меня вот образовалось два вопроса
1. Если я буду в одно и то же время выполнять много команд (например через DellayCommand с одинаковой задержкой), это может как-то негативно повлиять на работу скрипта? 2. Написал идущий ниже скрипт. Пытаюсь загнать его в функцию, но не получается. При дебаге выяснилось, что функция не может получить обьект НПС. Т.е. у меня в передаваемых параметрах стоит object NPC, когда функция начинает работать с ним, то возвращает OBJECT_INVALID. Пробовал НПС в скрипте определять и по тэгу и как OBJECT_SELF, результат один. Я вроде бы уже писал пару подобных функций и все было нормально... Neverwinter Script Source //:://///////////////////////////////////////////// //:: Name: sl_KnockDown //:: Place: Ever //::////////////////////////////////////////////// /* Описание: НПС вырубает ПС с анимацией одного удара */ //::////////////////////////////////////////////// //:: Created By: Slam //:: Created On: 22.05.07 //::////////////////////////////////////////////// #include "sc_inc_debug" void main() { SetLocalInt(GetModule(), "DebugMode", 4); SetLocalInt(GetModule(), "DebugLogFile", 1); object oPC = GetFirstPC(); object oNPC = OBJECT_SELF; SetCommandable(FALSE,oPC); SetImmortal(oPC, TRUE); SetImmortal(oNPC, TRUE); AssignCommand(oNPC, ClearAllActions()); // Записываем в локалку текущую фракцию НПС //////////////////////////////////// object oFactionMember = GetNextFactionMember(oNPC, FALSE); int i; for (i = 0; i < 5; i++) { if (oFactionMember != oNPC) { SetLocalObject(oNPC, "FactionMember", oFactionMember); break; } oFactionMember = GetNextFactionMember(oFactionMember, FALSE); } //////////////////////////////////////////////////////////////////////////////// // ОПРЕДЕЛЯЕМ, ДЕРЖИТ ЛИ НПС ОРУЖИЕ В РУКАХ ДО НАЧАЛА БОЯ ////////////////////// object oRHand = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oNPC); object oLHand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oNPC); if(oRHand != OBJECT_INVALID || oLHand != OBJECT_INVALID) { SetLocalInt(oNPC, "bIsArmed", 1); } //////////////////////////////////////////////////////////////////////////////// // Ударяем, а потом вырубаем ПС //////////////////////////////////////////////// effect eKnockdown = EffectKnockdown(); float fNPCKnockdownTime = 10.0; AssignCommand(oNPC, ActionUseFeat(FEAT_KNOCKDOWN, oPC)); DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnockdown, oPC, fNPCKnockdownTime)); //////////////////////////////////////////////////////////////////////////////// DelayCommand(1.5, FadeToBlack(oPC)); // Востанавливаем фракцию НПС ////////////////////////////////////////////////// if (GetIsObjectValid(GetLocalObject(oNPC, "FactionMember"))) { object oFactionMember = GetLocalObject(oNPC, "FactionMember"); DelayCommand(0.6, ChangeFaction(oNPC, oFactionMember)); DelayCommand(0.7, DeleteLocalObject(oNPC, "FactionMember")); } else DelayCommand(0.6, ChangeToStandardFaction(oNPC, STANDARD_FACTION_COMMONER)); DelayCommand(0.8, ClearPersonalReputation(oPC, oNPC)); //////////////////////////////////////////////////////////////////////////////// AssignCommand(oNPC, DelayCommand(0.9, ClearAllActions(TRUE))); // Лечим НПС и ПС ////////////////////////////////////////////////////////////// int nMaxNPCHP = GetMaxHitPoints(oNPC); int nMaxPCHP = GetMaxHitPoints(oPC); DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectHeal(nMaxNPCHP), oNPC)); DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectHeal(nMaxPCHP), oPC)); //////////////////////////////////////////////////////////////////////////////// // ЕСЛИ НПС ДО НАПАДЕНИЯ БЫЛ БЕЗ ОРУЖИЯ, УБИРАЕМ ОРУЖИЕ В ИНВЕНТАРЬ //////////// if (GetLocalInt(oNPC, "bIsArmed") == 0) { AssignCommand(oNPC, DelayCommand( 9.0, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oNPC)))); AssignCommand(oNPC, DelayCommand( 9.1, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oNPC)))); } DeleteLocalInt(oNPC, "bIsArmed"); //////////////////////////////////////////////////////////////////////////////// DelayCommand(fNPCKnockdownTime, FadeFromBlack(oPC)); DelayCommand(fNPCKnockdownTime, SetCommandable(TRUE, oPC)); } и вот ещё вопрос 3. Делаю скрипт с нападением НПС на ПС (меняю репутацию НПС а потом ActionAttack(oNPC,oPC)). Тестирую, и вот что мне невер выдаёт: "You cannot perform this action on a friendly target due to PvP settings", как это переводится я знаю, но вот откуда такая чтука появилась... Раньше всё робило, видимо в самом Тулсете что-то нахимичил... Может кто сталкивался? Сообщение отредактировал Slam - May 22 2007, 20:07 |
![]()
Сообщение
#2723
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
1. Почти всегда, когда две команды попадут на одно время по секундам и долям секунд, выполнится та что первая считается движком. Вторая не выполнится.
2. Муть какая то непонятная. Где стоит скрипт, при каких условиях работает. Додумывать было лень. 3. Функция атаки не будет действовать на дружественные НПС. Код поправь под свои нужды. Neverwinter Script Source //::////////////////////////////////////////////// //:: ActionTaken am_at_attack //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* Стандартный скрипт аттаки игроком НПС. НПС переводится в НЕЙТРАЛЬНУЮ фракцию. */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 24.05.2005 //::///////////////////////////////////////////// #include "nw_i0_generic" void main() { object oPC = GetPCSpeaker(); object oNeutral = GetObjectByTag("GLOBAL_TRUE_NEUTRAL"); object oSelf = OBJECT_SELF; AssignCommand(oSelf, ClearAllActions()); ChangeFaction(oSelf, oNeutral); SetIsTemporaryEnemy(oPC, oSelf); AssignCommand(oSelf, DetermineCombatRound(oPC)); DelayCommand(1.0, AssignCommand(oSelf, ActionAttack(oPC))); } Neverwinter Script Source //::////////////////////////////////////////////// //:: ActionTaken am_at_attack_pc //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* Скрипт аттаки игроком НПС в диалоге. НПС не переводится в НЕЙТРАЛЬНУЮ фракцию. Все НПС с одинаковой фракцией в радиусе 50 метров будут нападать на РС. */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 20.12.2005 //::///////////////////////////////////////////// #include "nw_i0_generic" void main() { object oPC = GetPCSpeaker(); object oSelf = OBJECT_SELF; object oNpc = GetFirstObjectInShape(SHAPE_CUBE, 50.0, GetLocation(OBJECT_SELF)); float n; string sSpeak; while (GetIsObjectValid(oNpc)) // пока такой объект существует... { if (GetFactionEqual(oSelf, oNpc)) // если фракциa сходна с исходным { n = IntToFloat(Random(50))/10.0; // врем задержки делное на 10. то есть от 0.0 до 5.0 секунды AssignCommand(oNpc, ClearAllActions()); // очистить действиa int iRand = Random(15); switch (iRand) { case 0: { sSpeak = "Смерть тебе!"; break; } case 3: { sSpeak = "А ну! Стоять!"; break; } case 5: { sSpeak = "Стой!!!"; break; } case 8: { sSpeak = "Все сюда!"; break; } case 11: { sSpeak = "Тревога!!!"; break; } case 13: { sSpeak = "Я тебя убью!"; break; } } DelayCommand(n - 0.2, AssignCommand(oNpc, SpeakString(sSpeak))); SetIsTemporaryEnemy(oPC, oNpc); AssignCommand(oNpc, DetermineCombatRound(oPC)); DelayCommand(n, AssignCommand(oNpc, ActionAttack(oPC))); } oNpc = GetNextObjectInShape(SHAPE_CUBE, 50.0, GetLocation(OBJECT_SELF)); // Берем следующего НПС в кубе с такой же гранью 50 метров } AssignCommand(oSelf, ClearAllActions()); SetIsTemporaryEnemy(oPC, oNpc); AssignCommand(oSelf, DetermineCombatRound(oPC)); DelayCommand(1.0, AssignCommand(oSelf, ActionAttack(oPC))); } |
![]()
Сообщение
#2724
|
|
Level 2 ![]() Класс: Убийца Характер: Neutral Evil Раса: Человек ![]() |
Цитата(Aiwan @ May 22 2007, 21:19) [snapback]108507[/snapback] 2. Муть какая то непонятная. Где стоит скрипт, при каких условиях работает. Додумывать было лень. 3. Функция атаки не будет действовать на дружественные НПС. Код поправь под свои нужды. 2. Скрипт стоит на диалоге. При выборе ПС определенной ветки диалога, выполняется этот скрипт. Сам по себе он рабочий, но у меня не получается сделать его функцией и запихать в свой инклуд. 3. Мой скрипт атаки один в один такой же кроме строчки AssignCommand(oSelf, DetermineCombatRound(oPC)); (кстати, всё хочу узнать, что это), проблемма в самом модуле, т.к. в новосозданном модуле атака проходит нормально. ЗЫ: извините, если я не внятно выражаю свои мысли |
![]()
Сообщение
#2725
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
DetermineCombatRound это функция Биоварей, в ней много вяких действий типа подготовки к бою, окаст, наезд, облом (IMG:style_emoticons/kolobok_light/smile.gif)
Функции есть смысл делать если часто используется это. Дело в том что инклюды компилятся в тело исполняемых файлов и размер модуля растет прямо на дрожжах... |
![]()
Сообщение
#2726
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Цитата(Slam @ May 22 2007, 19:51) [snapback]108503[/snapback] 2. Написал идущий ниже скрипт. Пытаюсь загнать его в функцию, но не получается. как ты пытаешься это сделать? никаких проблем не вижу |
![]()
Сообщение
#2727
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Приведи инклюду сюда.
|
![]()
Сообщение
#2728
|
|
Level 3 ![]() Класс: Воин Характер: Lawful Neutral Раса: Человек ![]() |
Не составляется скрипт
Neverwinter Script Source #include "lib" void main() { object oPC = GetEnteringObject(); object oRoba = GetObjectByTag("itm_roba"); { clearPCInventory(); clearPCSlot(INVENTORY_SLOT_ARMS); clearPCSlot(INVENTORY_SLOT_ARROWS); clearPCSlot(INVENTORY_SLOT_BELT); clearPCSlot(INVENTORY_SLOT_BOLTS); clearPCSlot(INVENTORY_SLOT_BOOTS); clearPCSlot(INVENTORY_SLOT_BULLETS); clearPCSlot(INVENTORY_SLOT_CHEST); clearPCSlot(INVENTORY_SLOT_CLOAK); clearPCSlot(INVENTORY_SLOT_HEAD); clearPCSlot(INVENTORY_SLOT_LEFTHAND); clearPCSlot(INVENTORY_SLOT_LEFTRING); clearPCSlot(INVENTORY_SLOT_NECK); clearPCSlot(INVENTORY_SLOT_RIGHTHAND); clearPCSlot(INVENTORY_SLOT_RIGHTRING); ActionGiveItem(oRoba, oPC); AssignCommand(oPC, ActionWait(1.0)); AssignCommand(oPC, ActionStartConversation(oPC, "start_dialog")); } } Пишут: Ошибка: Неопределенный идентификатор () Не подскажете, что здесь не так? |
![]()
Сообщение
#2729
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
желательно еще номер строчки, которая с ошибкой.
|
![]()
Сообщение
#2730
|
|
Level 3 ![]() Класс: Воин Характер: Lawful Neutral Раса: Человек ![]() |
Не указан. Наверное в инклюде ошибка.
Вот он Neverwinter Script Source /*
*/ //int W_DEBUG = TRUE; int W_DEBUG = FALSE; object getPC(); void print(string str); int W_EV_BEAT = 1001; int W_EV_CONV = 1004; int W_EV_CEND = 201; int W_EV_SPWN = 202; // ----------------------------------------------- void clearPCInventory() { object obj= getPC(); object item= GetFirstItemInInventory(obj); while(item!=OBJECT_INVALID) { DestroyObject(item); item= GetNextItemInInventory(obj); } } void clearPCSlot(int slot) { object obj= getPC(); object item= GetItemInSlot(slot, obj); if(item!=OBJECT_INVALID) DestroyObject(item); } int hasItemEquipped(string tag, object obj) { object item= GetItemPossessedBy(obj, tag); return item!=OBJECT_INVALID && ( GetItemInSlot(INVENTORY_SLOT_ARMS , obj) == item || GetItemInSlot(INVENTORY_SLOT_ARROWS , obj) == item || GetItemInSlot(INVENTORY_SLOT_BELT , obj) == item || GetItemInSlot(INVENTORY_SLOT_BOLTS , obj) == item || GetItemInSlot(INVENTORY_SLOT_BOOTS , obj) == item || GetItemInSlot(INVENTORY_SLOT_BULLETS , obj) == item || GetItemInSlot(INVENTORY_SLOT_CHEST , obj) == item || GetItemInSlot(INVENTORY_SLOT_CLOAK , obj) == item || GetItemInSlot(INVENTORY_SLOT_HEAD , obj) == item || GetItemInSlot(INVENTORY_SLOT_LEFTHAND , obj) == item || GetItemInSlot(INVENTORY_SLOT_LEFTRING , obj) == item || GetItemInSlot(INVENTORY_SLOT_NECK , obj) == item || GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, obj) == item || GetItemInSlot(INVENTORY_SLOT_RIGHTRING, obj) == item ); } |
![]()
Сообщение
#2731
|
|
Level 4 ![]() Класс: Обыватель Характер: True Neutral Раса: Человек NWN2: Маппинг ![]() |
Ругается оно на "getPC()" в функциях. Может, там имелось в виду "GetFirstPC()"? Тогда бы все работало.
|
![]()
Сообщение
#2732
|
|
![]() Класс: Пьяный Мастер Характер: Lawful Good Раса: Тварь MySQL, PHP, JavaScript Порядок Времени ![]() |
Цитата(Легионер @ Jun 7 2007, 12:00) [snapback]109039[/snapback] object getPC(); void print(string str); а может там имелись ввиду две функции? которые объявлены в начале, но их текста я так и не увидел. вот на это он и ругается |
![]()
Сообщение
#2733
|
|
Level 3 ![]() Класс: Воин Характер: Lawful Neutral Раса: Человек ![]() |
Цитата Ругается оно на "getPC()" в функциях. Может, там имелось в виду "GetFirstPC()"? Тогда бы все работало. Ты был прав... спасибо |
![]()
Сообщение
#2734
|
|
Level 4 ![]() ![]() Класс: Ученик Дракона Характер: Lawful Good Раса: Человек ![]() |
Думал, думал и решил, что вопросы о таком скрипте в вопросы новичков не впихнуть.
Возможно ли написать скрипт, который заставит понимать русскоязычные сообщения чата персонажа? Прошу администраторов удалить это сообщение: обдумывая структуру скрипта я осознал, что он мне не по силам |
![]()
Сообщение
#2735
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Цитата(Epsilon @ Jun 9 2007, 20:18) [snapback]109184[/snapback] Возможно ли написать скрипт, который заставит понимать русскоязычные сообщения чата персонажа? возможно. Причем от скрипта, который бы понимал англ. речь он не отличался бы ничем, кроме набора распознаваемых шаблонов. |
![]()
Сообщение
#2736
|
|
Level 1 Класс: Маг Характер: Neutral Good Раса: Чудовище ![]() |
Где можно узнать функции команд и принципы составления скриптов?
Может вопрос и не в тему. |
![]()
Сообщение
#2737
|
|
Вечно меняющийся ![]() Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] ![]() |
Все функции, имеют описание в самом тулсете. Так же есть Лексикон. Перевод, тоже имеется (смотри сайт).
Принципы построения, разжеваны в мануалах, это опять сайт/Лексикон. |
![]()
Сообщение
#2738
|
|
Level 3 ![]() Класс: Волшебник Характер: Neutral Evil Раса: Человек ![]() |
Neverwinter Script Source void RemoveXPFromParty(int nXP, object oPC, int bAllParty=TRUE) { if (!bAllParty) { nXP=(GetXP(oPC)-nXP)>=0 ? GetXP(oPC)-nXP : 0; SetXP(oPC, nXP); } else { object oMember=GetFirstFactionMember(oPC, TRUE); while (GetIsObjectValid(oMember)) { nXP=(GetXP(oMember)-nXP)>=0 ? GetXP(oMember)-nXP : 0; SetXP(oMember, nXP); oMember=GetNextFactionMember(oPC, TRUE); } } } void ApplyPenalty(object oDead) { int nXP = GetXP(oDead); int nPenalty = 250 * GetHitDice(oDead); int nHD = GetHitDice(oDead); // * You can not lose a level with this respawning int nMin = ((nHD * (nHD - 1)) / 2) * 1000; int nNewXP = nXP - nPenalty; if (nNewXP < nMin) nNewXP = nMin; SetXP(oDead, nNewXP); int nGoldToTake = FloatToInt(0.20 * GetGold(oDead)); // * a cap of 10 000gp taken from you if (nGoldToTake > 50000) { nGoldToTake = 50000; } AssignCommand(oDead, TakeGoldFromCreature(nGoldToTake, oDead, TRUE)); DelayCommand(4.0, FloatingTextStrRefOnCreature(58299, oDead, FALSE)); DelayCommand(4.8, FloatingTextStrRefOnCreature(58300, oDead, FALSE)); } #include "nw_i0_plot" /* Script generated by Lilac Soul's NWN Script Generator, v. 2.0 For download info, please visit: http://nwvault.ign.com/View.php?view=Other...4683&id=625 */ //Goes OnPlayerRespawn of the module properties void main() { object oPC = GetLastRespawnButtonPresser(); object oDead = oPC; string sArea = GetTag(GetArea(oPC)); if (!GetIsPC(oPC)) return; ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPC); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPC)), oPC); RemoveEffects(oPC); object oTarget; oTarget = oPC; //Visual effects can't be applied to waypoints, so if it is a WP //apply to the WP's location instead int nInt; nInt = GetObjectType(oTarget); if((sArea == "AREA1") || ( sArea == "AREA2") == FALSE ) { //Для Всех location lHALFELFTarget; oTarget = GetWaypointByTag("TN_SPAWN"); lHALFELFTarget = GetLocation(oTarget); if (nInt != OBJECT_TYPE_WAYPOINT) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_TIME_STOP), oTarget); else ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_TIME_STOP), GetLocation(oTarget)); if (GetAreaFromLocation(lHALFELFTarget)==OBJECT_INVALID) return; AssignCommand(oPC, ClearAllActions()); AssignCommand(oPC, ActionJumpToLocation(lHALFELFTarget)); ApplyPenalty(oDead); } } Задача скрипта: Ставиться в онреспавн, и должен кидать игрока после смерти в опр. точку. Тут все нормально, проблема в исключениях, когда игрок должен респавниться на месте. Есть 2 локации AREA1 & AREA2, когда игрок в этих локациях, после смерти при нажатии респавна он появляется на том же месте где и умер, без потери опыта\золота, с этим и проблема, в AREA2 все нормально, а первой не правильно работает, когда прописываю только одну локацию, то опять же все правильно работает. Может я использовал не тот символ " || " ? Помогите пожалуйста (IMG:style_emoticons/kolobok_light/rolleyes.gif) |
![]()
Сообщение
#2739
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Neverwinter Script Source if(sArea != "AREA1" || sArea != "AREA2") Попробуй так. Ты в своем выражинии описал ситуацию так: Если стринг арены 1 равен AREA1 или стринг арены2 не равен AREA2. Поэтому и косяк. Можно и так записать. Придет Лекс скажет как грамотней (IMG:style_emoticons/kolobok_light/smile.gif) Но я бы так написал. Neverwinter Script Source if(sArea == "AREA1" || sArea == "AREA2")
{ return; } else { // ТУТ ТВОЙ СКРИПТ } |
![]()
Сообщение
#2740
|
|
Level 3 ![]() Класс: Волшебник Характер: Neutral Evil Раса: Человек ![]() |
Aiwan, спасибо большое. Первый вариант не сработал, но второй работает как часы (IMG:style_emoticons/kolobok_light/rolleyes.gif)
|
![]() ![]() |
Текстовая версия | Сейчас: 2nd May 2025 - 07:29 |