![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#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)
|
![]()
Сообщение
#2741
|
|
Level 17 ![]() Класс: Волшебник Характер: Neutral Good Раса: Человек NWN: Скриптинг [PW] Axistown SR 1.9 NWNX ![]() |
QUOTE(Aiwan @ Jun 26 2007, 22:48) [snapback]109930[/snapback] Neverwinter Script Source if(sArea != "AREA1" || sArea != "AREA2") Попробуй так. |
![]()
Сообщение
#2742
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Цитата(virusman @ Jun 27 2007, 03:42) [snapback]109938[/snapback] Не ||, а &&. Тогда не будет работать никогда, ведь будет поиск двух лок одновременно, а это всегда будет FALSE. |
![]()
Сообщение
#2743
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Цитата(Aiwan @ Jun 27 2007, 09:54) [snapback]109953[/snapback] Тогда не будет работать никогда, ведь будет поиск двух лок одновременно, а это всегда будет FALSE. нет. Neverwinter Script Source if(sArea != "AREA1" && sArea != "AREA2") будет выдавать TRUE для всех локаций, тэг который не АРЕНА1 И не АРЕНА2. (те будет делать как раз то, что нужно) ps: легко заметить, что условия, данные тобой и Вирусманом эквивалентны. Достаточно применить базовые принципы дискретной математики (ну или логики) |
![]()
Сообщение
#2744
|
|
Level 17 ![]() Класс: Волшебник Характер: Neutral Good Раса: Человек NWN: Скриптинг [PW] Axistown SR 1.9 NWNX ![]() |
QUOTE(Lex @ Jun 27 2007, 10:48) [snapback]109956[/snapback] ps: легко заметить, что условия, данные тобой и Вирусманом эквивалентны. Достаточно применить базовые принципы дискретной математики (ну или логики) То, что у Айвана, всегда возвращает TRUE.Я просто применил закон Де Моргана: QUOTE not (P and Q) = (not P) or (not Q)
not (P or Q) = (not P) and (not Q) |
![]()
Сообщение
#2745
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Да, я пропустил то что там два &&. Законы никакие не применял извините (IMG:style_emoticons/kolobok_light/pardon.gif)
|
![]()
Сообщение
#2746
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Цитата(virusman @ Jun 27 2007, 13:21) [snapback]109957[/snapback] Я просто применил закон Де Моргана: ага, я именно про него и говорил (IMG:style_emoticons/kolobok_light/smile.gif) |
![]()
Сообщение
#2747
|
|
Ушедший на войну ![]() Класс: Маг Характер: Chaotic Good Раса: Человек NWN: Контент ![]() |
Задача такая. НПС бежит к цели по "коридору", и в конце атакует ее (это его единственная цель для атаки, и он направлен на нее через скрипт).
По обоим сторонам коридора стоят "орудия" которые непрерывно атакуют НПС. Это могут быть плейсы или кричи. Что и как необходимо изменить, чтобы бегущий НПС ни при каких случаях не стал бы атаковать или отвлекаться на стреляющих, даже если конечная цель будет недоступна (например заблокирован проход). Не знаю даже с чего начать. |
![]()
Сообщение
#2748
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
хм.. как вариант - переписать этому НПС скрипт onAttack и onDamage, чтобы НПС не атаковал в ответ тех, кто бьет его, если это не игрок или кто-то из партии игрока.
другой вариант - эти по краям корридора атакуют через FakeSpell, а дамаг кладется скриптом отдельно - тут нужно прописать для этих НПС ХБ скрипт свой. |
![]()
Сообщение
#2749
|
|
Level 4 ![]() ![]() Класс: Клерик Характер: Lawful Neutral Раса: Человек ![]() |
а можно я ляпну? (IMG:style_emoticons/kolobok_light/ph34r.gif) (IMG:style_emoticons/kolobok_light/unsure.gif) (IMG:style_emoticons/kolobok_light/unsure.gif)
хм.. как вариант - переписать этому НПС скрипт onAttack и onDamage, чтобы НПС не атаковал в ответ тех, кто бьет его, если это не игрок или кто-то из партии игрока. я бы наверно в этих скриптах делал проверку на текущее действие (бой) и если игрок в бою (GetIsInCombat (что то такое (IMG:style_emoticons/kolobok_light/unsure.gif) )) и последняя цель живая и/или действительная, чтоб он вообще ни на какие атаки и ущерб не реагировал (return) а добивал бы это до упора (если не надо делать проверку на собственные хп если не камикадзе), если нет списка приоритетов. Ну и в On perception поставил бы на дверь больший проиритет... сори если че.. Сообщение отредактировал r1Stranger - Aug 26 2007, 12:20 |
![]()
Сообщение
#2750
|
|
Level 1 ![]() Класс: Маг Характер: Lawful Evil Раса: Дракон NWN: Скриптинг [PW] ![]() |
делал спел, вроде все работает нормально, однако дамажит криво - то 3 раза, то 1.
Neverwinter Script Source #include "X0_I0_SPELLS"
#include "x2_inc_spellhook" void DoArmageddon() { vector vSelf = GetPosition(OBJECT_SELF); vector v1 = Vector(vSelf.x+10.0f, vSelf.y+10.0f, 0.0f); vector v2 = Vector(vSelf.x-10.0f, vSelf.y+10.0f, 0.0f); vector v3 = Vector(vSelf.x+10.0f, vSelf.y-10.0f, 0.0f); vector v4 = Vector(vSelf.x-10.0f, vSelf.y-10.0f, 0.0f); //вокруг чара 4 точки создаются, куда эффекты налагаются object oArea = GetArea(OBJECT_SELF); location Loc1 = Location(oArea, v1, GetFacing(OBJECT_SELF)); location Loc2 = Location(oArea, v2, GetFacing(OBJECT_SELF)); location Loc3 = Location(oArea, v3, GetFacing(OBJECT_SELF)); location Loc4 = Location(oArea, v4, GetFacing(OBJECT_SELF)); ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_METEOR_SWARM), Loc1); ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_METEOR_SWARM), Loc2); ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_METEOR_SWARM), Loc3); ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_METEOR_SWARM), Loc4); } void main() { int nDam1, nDam2; effect eDam, eDam2; DoArmageddon(); object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 20.0f, GetLocation(OBJECT_SELF), OBJECT_TYPE_CREATURE || OBJECT_TYPE_PLACEABLE); while (GetIsObjectValid(oTarget)) { if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF) && oTarget != OBJECT_SELF) { nDam1 = d10(20); nDam2 = d10(5); eDam = EffectDamage(nDam1, DAMAGE_TYPE_FIRE); eDam2 = EffectDamage(nDam2, DAMAGE_TYPE_MAGICAL); ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget); ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam2, oTarget); } oTarget = GetNextObjectInShape(SHAPE_SPHERE, 20.0f, GetLocation(OBJECT_SELF), OBJECT_TYPE_CREATURE || OBJECT_TYPE_PLACEABLE); } } |
![]() ![]() |
Текстовая версия | Сейчас: 28th April 2025 - 07:39 |