Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights Aurora Toolset
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74
Aiwan
QUOTE (Zirrex @ Jul 6 2005, 01:50)
з.ы. эх, мне бы кто подсказал по выше описанным скриптам иное решение проблемы.

Насколько я понял, ты знаешь ВСЕ плохие твои эффекты? Если да, то потри их так и добавь те что тебя напрягают еще:
Neverwinter Script Source
void Debug(string message)
{
    object oPC = GetFirstPC();
    if (!GetLocalInt(GetModule(), "DEBAG_PC"))
    {
      SendMessageToPC(oPC, "Debag message: "+message);
    }
    if (!GetLocalInt(GetModule(), "DEBAG_DM"))
          {
            SendMessageToAllDMs("Debag message to DMs: "+message);
          }
}
void RemoveingBadEffect(object oPlayer)
{
        effect eBad = GetFirstEffect(oPlayer);
        while(GetIsEffectValid(eBad))
        {
            if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS ||
                GetEffectType(eBad) == EFFECT_TYPE_DEAF ||
                GetEffectType(eBad) == EFFECT_TYPE_PARALYZE ||
                GetEffectType(eBad) == EFFECT_TYPE_POISON ||
                GetEffectType(eBad) == EFFECT_TYPE_SLOW ||
                GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS ||
                GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL)
                {
                    Debug("RemoveEffect");
                    RemoveEffect(oPlayer, eBad);
                }
            eBad = GetNextEffect(oPlayer);
        }
        //Fire cast spell at event for the specified target
        SignalEvent(oPlayer, EventSpellCastAt(OBJECT_SELF, SPELL_RESTORATION, FALSE));
}


Либо проверь таг и ресреф невидимиго объекта в инвентаре:

Neverwinter Script Source
void DebugObject(object oObject)
{
    string sTag = GetTag(oObject);
    string sResRef = GetResRef(oObject);
    string sName = GetName(oObject);
    Debug ("TAG = "+sTag+", ResRef = "+sResRef+",  Name = "+sName+".");
}

void main()
{
        object oItemCr = GetFirstItemInInventory(oPC);
        while(GetIsObjectValid(oItemCr))
            {
            DebugObject(oPC);
            oItemCr = GetNextItemInInventory(oPC);
            }
}

Не притендую на работостпособность кода. Пишгу на форуме. Потести сам wink.gif
Потом попросту, сделай его не плотовым. Удали и все дела.
dumbo
Zirrex
в случае с полиморфом ты перемудрил, чем спровоцировал так называемое "непредсказуемое поведение". кстати, очень интересный глюк - уничтожение "недоубитой"(в данном случае хайд уничтожается при снимании полиморфа) вещи оставляет ее эффекты болтаться на PC. либо просто убери уничтожение хайда(кстати, эффекты могут висеть не только на ней), либо до снимания полиморфа сделай цикл по кричным слотам:
Neverwinter Script Source
for (i = 14; i < 18; i++) {
    oItem = GetItemInSlot(i, oPC);
    if (GetIsObjectValid(oItem))
      DestroyObject(oItem);
  }

насчет противодействия смене оружия ничего не слышал, хотя сам в свое время заметил, что не только количество атак за раунд повышается, но и, похоже, пересчитываются шансы попадания. понимаю, что по идее там обычный рандом должен быть, но вот мне показалось, что попадает чаще, если "передергивать" оружие... dntknw.gif
если твой скрипт пашет, то и хорошо wink.gif если только подоптимизировать его может быть немного стоит - сложилось впечатление, что это можно сделать, хотя и не всматривался... crazy.gif
Добавлено в [mergetime]1120627258[/mergetime]
да, стоит добавить, что сказанное о полиморфе действительно для версии 1.65, потому как в предыдущих версиях он сильно баговал, и как там работает этот скрипт одному биовару известно...
-fenix-
Вот кутсценка
Neverwinter Script Source
void main()
{
object oPC = GetPCSpeaker();
object oBarmen = GetObjectByTag("OBJECT_SELF");
object oVor = GetObjectByTag("VOR");
object oSunduk = GetObjectByTag("sunduk");
//==============================================================================
object oWP = GetWaypointByTag("WP_VOR_01");
object oWP_PC_1 = GetWaypointByTag("WP_PC_1");
//==============================================================================
object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPC);
object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPC);
object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPC);
object oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC);
object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPC);
//==============================================================================
effect eCutInv = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);
effect eCutPar = EffectParalyze();
//==============================================================================
SetLocalInt(oPC, "CUT_SCEN_03", TRUE);
SetLocalLocation(oPC, "START_POINT", GetLocation(oPC));
AssignCommand(oBarmen, ActionPauseConversation());
AssignCommand(oVor, ClearAllActions());
AssignCommand(oVor, ActionJumpToObject(oWP));
FadeToBlack(oPC, FADE_SPEED_FASTEST);
AssignCommand(oPC, ClearAllActions());
SetCutsceneMode(oPC);
SetAILevel(oVor, AI_LEVEL_HIGH);
//==============================================================================
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oAnimal, 13.5);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oAnimal, 13.5);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oDominated, 13.5);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oDominated, 13.5);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oFamiliar, 13.5);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oFamiliar, 13.5);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oHenchman, 13.5);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oHenchman, 13.5);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oSummoned, 13.5);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oSummoned, 13.5);
//==============================================================================

DelayCommand(1.0, AssignCommand(oPC, SetCameraFacing(100.0, 20.0, 30.0,
CAMERA_TRANSITION_TYPE_SNAP)));
DelayCommand(1.5, FadeFromBlack(oPC, FADE_SPEED_MEDIUM));
DelayCommand(2.0, AssignCommand(oPC, ClearAllActions()));
DelayCommand(2.5, AssignCommand(oVor, ClearAllActions()));
DelayCommand(3.0, AssignCommand(oVor, SpeakString("Åùå îäèí ñóíäó÷îê")));
DelayCommand(4.0, AssignCommand(oVor, ActionMoveToObject(oSunduk)));
DelayCommand(7.0, AssignCommand(oVor, ActionDoCommand(SetFacingPoint(GetPosition
(oSunduk)))));
DelayCommand(8.0, AssignCommand(oVor, ActionPlayAnimation(
ANIMATION_LOOPING_GET_MID,9.0, 1.0)));
DelayCommand(9.0, AssignCommand(oSunduk,ActionPlayAnimation(
ANIMATION_PLACEABLE_OPEN,1.0)));
DelayCommand(10.0, AssignCommand(oVor, SpeakString("Âîò ýòî êóø, óñå, ïîðà ñâàëèâàòü")));
DelayCommand(12.0, AssignCommand(oVor,ActionPlayAnimation
(ANIMATION_LOOPING_GET_MID,9.0, 1.0)));
DelayCommand(12.5, AssignCommand(oSunduk, ActionPlayAnimation(
ANIMATION_PLACEABLE_CLOSE,1.0)));
DelayCommand(14.0, AssignCommand(oVor, ActionMoveToObject(oBarmen, TRUE)));
DelayCommand(15.0, AssignCommand(oVor, ActionAttack(oBarmen, FALSE)));
DelayCommand(20.0, AssignCommand(oPC, ClearAllActions()));
DelayCommand(24.5, AssignCommand(oBarmen, ActionResumeConversation()));
DelayCommand(25.0, AssignCommand(oPC, SetCutsceneMode(oPC, FALSE)));
}



1)Вор не хочет идти к бармену, но если поставить вейп рядом с барменом то к нему идет.
2)Если поссорить до сценки, то во время сценки они друг на друго бросаются (близко стоят). А во время сценки не получается я делал так
Neverwinter Script Source
DelayCommand(14.5, AssignCommand(oVor, AdjustReputation(OBarmen, oVor, -90)));
DelayCommand(14.5, AssignCommand(oBarmen, AdjustReputation(OVor, oBarmen, -90)));

3)выполнять ActionAtatck не хочет ни как.
dumbo
QUOTE (-fenix- @ Jul 6 2005, 10:58)
Neverwinter Script Source
object oBarmen = GetObjectByTag("OBJECT_SELF");

это что за...?! this.gif
-fenix-
QUOTE (dumbo @ Jul 6 2005, 18:55)
это что за...?!

Не знаю! Кот на клаве полежал blush.gif smile.gif

Отлично, машутся, только каряво - это выглядет, как тырканье, дерганье, но уж точно не как драка. Так это и должно выглядеть?
Zirrex
dumbo, спасибо конечно, но как мне поможет этот цикл? Я же не хочу, чтобы каждый входящий персонаж в полиморфе лишался вещей. Ты не забывай, что не все полиморфы "закрывают" надетые вещи на персонаже. Тому пример, Друиды. И может так случиться, что удалятся вещи, которые и трогать то не нужно. Может все-таки стоит проверять только невидимые?

Aiwan, не совсем понял, причем тут плохие эффекты?! Полиморфы разве создают их? Возьмем за пример полиморф Голема. Заклинание "Shapechange". При полиморфе создается невидимый объект, если посмотреть 2da, то можно увидеть его тэг "NW_IT_CREITEMCO3". Ищем его у стандартного Голема. Что видим:

CODE

Damage Reduction: +3 Soak 30 Damage
Damage Vulnerability: Electrical 50% Damage Vulnerability
Immunity: Miscellaneous: Critical Hits
Immunity: Miscellaneous: Death Magic
Immunity: Miscellaneous: Disease
Immunity: Miscellaneous: Level/Ability Drain
Immunity: Miscellaneous: Mind-Affecting Spells
Immunity: Miscellaneous: Paralysis
Immunity: Miscellaneous: Poison
Immunity: Miscellaneous: Sneak Attack

Множество иммунитетов, далее снижение урона на 30 единиц от оружия +3, и ослабление защиты от электричества на 50%.

Да и потом, мне нужно удалять эффект полиморфа при входе игрока на шард, а не в игре. В игре его снять легко, и проблем нету. Все проблемы возникают именно при входе. Самое интересное, что если даже и не снимать эффект полиморфа, то иммунитеты и остальные эффекты останутся постоянными даже после снятия полиморфа. Что происходит с эффектами в момент перехода, я не знаю, но факт на лицо.

Пробовал ставить простой скрипт, который снимает абсолютно все эффекты с персонажа игрока, не проходит. Эти эффекты не отображаются в виде иконок, они висят как невидимые, но при этом работают, что очень плохо.

-fenix-, забавный у тебя Бармен smile.gif Не стоит вешать такие тэги на Барменов, во-первых, это некрасиво, во-вторых, нету шаблона названий. У меня например есть разделение по названиям. Скрипты начинаются: ahs_имя; тэги НПС: npc_имя; монстры: am_bst_имя и т.д.

Если уж ты ставишь скрипт прямо на НПС, то надо так:

Neverwinter Script Source
object oBarmen = OBJECT_SELF;

Да, если честно, не знаю, после какого-то патча при сражении с монстрами стала происходить какая-то каша. Все лезут к цели, друг другу мешают, и получается очень некрасиво. Попробуй сделать так, чтобы над полем битвы летала камера. Вообще, если ты обратишь внимание на сценки из одиночной игры, то там бои происходят быстро, а не как в игре, снял немного здоровья, продолжили плясать. Ведь в жизни часто достаточно одного удара smile.gif
Мефистофель
Скажите пожалуйста, мне нужно организовать большую бойню, но напихать кучу НПК враждебных и Дружественных, Имхо глупо, движок не позволит,
дак вот мне хотелось бы чтобы было две стороны ну тоесть хорошая и плохая, и они дрались, ну война короче, дык вот. как сделать скрипт чтобы например злобные появлялись, примерно по 5-10 человек с разных точек карты и бежали уничтожать базу хороших.
Zirrex
Мефистофель, ну вообще это не сложно, делаешь 2 фракции. Первую фракцию размещаешь на одном конце карты, другую фракцию на другом конце. Делаешь им вайпоинты, которые ставишь в центре, но не в кучу, а хаотично. Когда они пойдут к центру, то увидят враждебную фракцию. Дальше уже дело техники. Можно все это сделать красиво и, по желанию, с кучей эффектов.

Движок может потянуть много персонажей на одной карте, только чем больше их в одном месте, тем мощнее нужен процессор, иначе через какое-то время они просто будут качаться на ногах и изредка наносить удары.

Да, чтобы они не сразу кидались друг на друга, перед тем, как они пойдут, сделать небольшую паузу:

Neverwinter Script Source
DelayCommand(6.0, WalkWayPoints());
-fenix-
Zirrex, с разделениями все ясно, это у меня левый скрипт - мой 2 мультик, на катором я решил испытать битву.

у меня версия SoU 1.30 - это та версия ?

При чем тут летающая камера, они от этого дергаться не перестанут ?! И я не видел мультика в официалке с битвами (может я слепой, тагда раскройте мне глаза dntknw.gif). Знаю, что точно есть в ПЛ (в ней много чего интересного есть), но ее у меня нетsad.gif.

Они полюбому кревляются, хоть интелект обоим повышай, хоть что делай (остальные способы тупые и делались мной от безисходности). Значит, чтоб они не дергались мне нужно на другую версию перейти?
Ты делал кутсцены с потычками, мож простенькую кинешь мне в ПМ. smile.gif
dumbo
QUOTE (Zirrex @ Jul 6 2005, 21:46)
Я же не хочу, чтобы каждый входящий персонаж в полиморфе лишался вещей.
Neverwinter Script Source
int    INVENTORY_SLOT_CWEAPON_L = 14;
int    INVENTORY_SLOT_CWEAPON_R = 15;
int    INVENTORY_SLOT_CWEAPON_B = 16;
int    INVENTORY_SLOT_CARMOUR  = 17;
QUOTE (Zirrex @ Jul 6 2005, 21:46)
Может все-таки стоит проверять только невидимые?
good.gif
я не просто так упомянул версию - какая версия у тебя?
перечитай еще раз мой пост.
Zirrex
dumbo, так как работаю с шардом, то 1.65. Иначе быть просто и не может. В скором времени перейдем на 1.66, но подобный баг там все равно не исправлен. Ладно, все отговорки. Основную идею я понял, тем более этим скриптом пользовался уже.
Aiwan
Zirrex не работал с полимерфами, к тому же ты ж просил найи способы снять эффекты... pardon.gif звиняй!
Если ты говоришь что все нормально становится после сна или отдыха, то воткни на перезаход проверку, если в инвентаре контейнер полимерфа с тонной иммунов, раскорячь игрока на небольшой перекур. Вообще спроси лучше шардовиков. Им наверное тоже приходилось сталкиваться.

Мефистофель 5-10 это уже много. Вернее 5 еще ничего, но 10 нападающих... crazy.gif
Мефистофель
"Спрошу" А скрипт должен вроде так делатся. Создать персов с Рест Рефом, Добрых и плохих, далее приказать им джампится на точки! а как сделать чтоб они моявлялись каждые 5 минут например?
dumbo
Zirrex
если уж совсем ничего не поможет(что странно - у меня все пашет как часы), то убивай полиморфера на входе! diablo.gif запомни его состояние, убивай, оживляй... wink.gif
Добавлено в [mergetime]1120687397[/mergetime]
Мефистофель
твои словесные выкладки сюжета настолько неконкретны, что смысла не имеют - их можно рассматривать только как "стон", провоцирующий на написание вместо тебя этого скрипта. ты сначала напиши что-то, а потом уже вопросы задавай. "каждые 5 минут" - либо декрементный счетчик хертбитов (5*60 / 6 = 50), либо DelayCommand(300.0, ...);
Zirrex
-fenix-, у тебя чистый Соу, даже нету Хоту, причем сам Соу можно было бы обновить и до более высшей версии, например 1.65. Вообще, я тебе советую установить Хоту и посмотреть его одиночное прохождение. Почти в самом начале есть стычка между Дроу и остальными. Они не дерутся до потери пульса, обмениваются парой ударов, заклинаний, и умирают те, в кого это попадает. Ролики должны показывать завязку, а не целую битву, длинною в бесконечные раунды.

Я только не совсем понимаю, что значит они у тебя дергаются, плохо дерутся? Или перемещаются между точками до начала боя дерганно?

dumbo, попробую, правда если его убить, то запустится скрипт смерти, который создает тело и переносит персонажа в фугу. Хотя там можно сделать мелкое условие, если входящий имеет полиморф, то его не проверять, а просто оживлять.
dumbo
Zirrex, вешай локалку еще при убиении и проверяй ее в ondeath - зачем плодить циклические проверки на полиморф?
-fenix-
Zirrex, что бы обновиться до 1.65 нужно качать 70 метров, пока я это не могу sad.gif . А Хоту и ПЛ я пытаюся щаз найти и купить.

QUOTE
Я только не совсем понимаю, что значит они у тебя дергаются, плохо дерутся? Или перемещаются между точками до начала боя дерганно?


Выглядет их стычка так: вор подбегает к бармену, тот поворачивается к вору и они стоят, через некоторое время у кого-нить подымается рука до уровня пояса и тут же опускается обратно, еще возможны непонятные движения ногами и прегибания с уклонениями - типа от удара, но удара никто не наносил. Через некоторое время бармен неожиданно падает на землю, а вор и нанес та один удар (поднял руку) секунды 3 назад. Вот такая петрушка.
Zirrex
-fenix-, пришли мне этот фрагмент модуля на почту, попробую разобраться. Самому моделировать подобную сценку долго, лучше уж посмотреть по существующей.

Пиши на zirrexu@yandex.ru.

dumbo, не стал я убивать персонажа в полиморфе, просто добавил удаление именно невидимых вещей с тела персонажа, а потом и само удаление эффекта полиморфа. Выглядит это так:

Neverwinter Script Source
void RemovePolymorth(object oPC)
{
    // Посмотреть первый эффект
    effect eEffect = GetFirstEffect(oPC);

    while (GetIsEffectValid(eEffect))
    {
        // Если есть эффект полиморфа на игроке, то продолжить
        if (GetEffectType(eEffect) == EFFECT_TYPE_POLYMORPH)
        {
            int i;

            for (i = 14; i < 18 ; i++)
            {
                object oEquip = GetItemInSlot(i,oPC);

                if (GetIsObjectValid(oEquip)) DestroyObject(oEquip);
            }
            // Удалить эффект полиморфа с игрока
            RemoveEffect(oPC, eEffect);
            break;
        }
        // Посмотреть следующий эффект
        eEffect = GetNextEffect(oPC);
    }
}

Работает нормально, и снимаются все эффекты, которые были наложены от полиморфа. Персонаж не умирает, хотя если сделать не очень верную задержку перед снятием полиморфа, то персонаж может и умереть. Скрипт можно использовать для решения этого бага. Хотя, если честно, раньше его не было. Почему Bioware не поправит его, мне не очень понятно.
Aiwan
Zirrex выложи пожалуйста скрипт с описанием в базе скриптов этого форума. И укажи версию и прочее.
Zirrex
Эх, рано радоваться начал. Перестал работать подобный скрипт. Полиморф снимается нормально, но сами эффекты ну ни в какую не хотят сниматься. Даже смерть и сон теперь на них не влияют. То ли у меня уже крыша едет, то ли очередные глюки, я понять не могу. Биоваре убить мало за такой баг.

Никто не знает, какой скрипт установлен на отмене полиморфа? Может его использовать для решения этой проблемы?

Гм... сейчас протестировал без удаления невидимых предметов, все снимается, но есть одна загвоздка, персонаж иногда почему-то умирает, т.е. не очень верно снимается жизнь при перезаходе. Но эффекты от полиморфа, как не странно, все снялись.

Вот я и думаю, каждый игрок на шард входит n-ое количество секунд. Т.е. ни у кого вход не получается одинаковым по времени, и соответственно скрипты, на которые стоит задержка, срабатывают по-разному. Я с этим пытался бороться, ставя между запускающимися скриптами небольшую задержку, но то ли скрипты иногда лагают и не успевают срабатывать, то ли они наслаиваются, мешая друг другу.
Добавлено в [mergetime]1120991243[/mergetime]
Возник вопрос такого плана, как верно найти в радиусе, например, 20 метров, НПС именно фракции "Defender", а не просто любое существо. Дело в том, что на шарде есть система репутации, а именно, при убийстве другого персонажа срабатывает скрипт, но так как часто рядом бывает несколько НПС, то скрипт не знает, кого выбрать, ища именно существо, а не конкретную цель с определенной фракцией.

Пробовал ставить условие, что если найдено существо, то дальше проверять, принадлежит ли фракции "Defender", если да, то выполнять дальнейший скрипт, но почему-то иногда подбегает даже фракция "Commoner", или любая другая, которая была замечена рядом. Сам скрипт:

Neverwinter Script Source
// Поискать в радиусе жертвы живое существо
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 40.0f, GetLocation(oKiller), TRUE, OBJECT_TYPE_CREATURE);

// Если живое существо есть, и это не игрок, продолжить
while ((oTarget != OBJECT_INVALID) && !GetIsPC(oTarget))
{
    // Если фракция найденного существа 'Стражник', продолжить
    if (GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oTarget))
    {
        // Очистить действие игрока и НПС
        AssignCommand(oTarget, ClearAllActions(TRUE));
        AssignCommand(oKiller, ClearAllActions(TRUE));

        // Стражник подбегает к игроку
        AssignCommand(oTarget, ActionForceMoveToObject(oKiller, TRUE, 2.0f, 5.0f));
        // Стражник говорит фразу игроку в общий канал
        AssignCommand(oTarget, ActionDoCommand(ActionSpeakString("Эй, подожди, у меня к тебе неотложный разговор!", TALKVOLUME_TALK)));
        // Стражник открывает игроку диалог
        AssignCommand(oTarget, ActionDoCommand(ActionStartConversation(oKiller, "am_carma_system", TRUE)));
        break;
    }
    // Поискать в радиусе жертвы еще живое существо
    oTarget = GetNextObjectInShape(SHAPE_SPHERE, 40.0f, GetLocation(oKiller), TRUE, OBJECT_TYPE_CREATURE);
}
dumbo
QUOTE (Zirrex @ Jul 9 2005, 15:26)
Гм... сейчас протестировал без удаления невидимых предметов, все снимается
то, что тебе предложили сделать в самом начале... yes.gif
при сохранении для избежания глюков(хе-хе) биовары снимают полиморф, сэйвят, и надевают обратно - это было наиболее простое решение для лечения глюка, когда эффекты при сохранении переносились на самого игрока. swoon.gif если используется своя система автосохранения(скрипты), то лучше вообще не сохранять полиморфов. если у тебя товарищ гибнет, то либо вы где-то намудрили с восстановлением актуальных на момент выхода хитов, либо полиморф(что сомнительно, этот баг биовары исправили довольно давно, вроде).
"скрипта отмены полиморфа" нет - это движковое.
так и не понял твои выкладки про "задержки". время входа игрока если и меняется, то очень незначительно - событие OnClientEnter происходит где-то в самом начале загрузки локации. работа правильных скриптов никогда не зависит от всяких "задержек"...

GetStandardFactionReputation дает тебе отношение стандартной фракции к фракции объекта, т.е. в твоем случае ты выясняешь отношение дефендеров к перечисляемым объектам. а дефендеры, между прочим, очень уважают (100) и коммонеров и мерчантов, ну и себя, любимых, конечно тоже... мало того, ты проверяешь не значение функции, а отличие оного от 0... swoon.gif
короче, в данном случае тебе нужно пользоваться GetFactionEqual:
Neverwinter Script Source
object oDefender = GetObjectByTag("tag kakogo-libo defendera");
...
if (GetFactionEqual(oDefender, oTarget))
{
  // oTarget тоже дефендер
}
Aiwan
У тебя ActionDoCommand в этих строках лишнее. Команды ты даешь и так Актионы, а ActionDoCommand ставит в очередь не актионы. К примеру
Neverwinter Script Source
AssignCommand(oTarget, ActionSpeakString("Эй, подожди, у меня к тебе неотложный разговор!", TALKVOLUME_TALK));
        /* Либо как внизу ставь не актион в стэк */
//    AssignCommand(oTarget, ActionDoCommand(SpeakString("Эй, подожди, у меня к тебе неотложный разговор!", TALKVOLUME_TALK)));
        // Стражник открывает игроку диалог
        AssignCommand(oTarget, ActionStartConversation(oKiller, "am_carma_system", TRUE));


Вообще, мне кажется такая система может дать сбой. Во первых если рядом с погибшим объектом будет еще один из дружественной фракции, то будет большой шапашный разбор. Тебе надо ловить всех енимов и менять им фракцию и читстить репу. Если интересует, могу дать функцию для инклюды. Ловит енимов и меняет им фракцию на заданную.
Zirrex
dumbo, я уже это заметил, но не нашел альтернативы быстрого выбора именно фракции "Defender". Если попробовать по тэгу, то мне придется приводит к одному типу тэги охранников, а иначе получится ерунда.

Про задержки я имел в виду, что если игрок входит не 6 секунд, а все 20, то скрипты не успевают для него срабатывать. У меня стоит выполнение команды переноса на заданную координату, которая успевает сохраниться в тот момент, когда происходит рестарт модуля, и если игрок входит не 5-6 секунд, эта команда не срабатывает вовсе. Так же бывает, что и не срабатывают другие команды, которые тоже выполняются раньше переноса.

Понимаешь, я в самом начале пробовал такой способ, снятие одно лишь полиморфа, не получалось, правда, пробовал я его еще в версии 1.62, а потом почситал недейственным и не стал более проверять, оказалось, что зря.

Aiwan, так если его не ставить, охранник начинает движение и тут же говорит фразу. При этой же команде он ее говорит лишь только тогда, когда уже рядом с игроком. В точности не помню, то ли я использовал просто "SpeakString", поэтому он у меня так говорил, то ли "ActionSpeakString", но точно помню, что говорил он фразу раньше времени.

Шабашного разбора не будет, потому что этот скрипт срабатывает 1 раз, а если подцепляется второй НПС, эм, забыл указать в скрипте, то ему сразу же очищаю все действия. Совсем иного рода тот же скрипт, но на хартбите. Пока что без правок, как есть:

Neverwinter Script Source
// Поискать в радиусе жертвы живое существо
    object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 40.0f, GetLocation(oPlayer), TRUE, OBJECT_TYPE_CREATURE);

if ((GetLocalInt(oSpirit,"Carma_" + sID) < -200) &&
    (GetLocalInt(oPlayer, "PkKiller") != 1) &&
    (GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oPlayer) > 10))

    // Если живое существо есть, то продолжить
    while ((oTarget != OBJECT_INVALID) && !GetIsPC(oTarget))
    {
        if (GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oTarget) &&
            !IsInConversation(oTarget) && !GetIsInCombat(oTarget))
        {
            // Очистить действие игрока и НПС
            AssignCommand(oTarget, ClearAllActions(TRUE));
            AssignCommand(oPlayer, ClearAllActions(TRUE));

            // Изменение переменной 'PkKiller' на 1
            if (GetLocalInt(oPlayer, "PkKiller") == 1)
            {
                SetLocalInt(oPlayer, "PkKiller", 1);
            }
            // Стражник подбегает к игроку
            AssignCommand(oTarget, ActionForceMoveToObject(oPlayer, TRUE, 2.0f, 5.0f));
            // Стражник говорит фразу игроку в общий канал
            AssignCommand(oTarget, ActionSpeakString("Эй, подожди, у меня к тебе неотложный разговор!",TALKVOLUME_TALK));
            // Стражник открывает игроку диалог
            AssignCommand(oTarget, ActionStartConversation(oPlayer, "am_carma_system", TRUE));
            break;
        }
        // Поискать в радиусе жертвы еще живое существо
        oTarget = GetNextObjectInShape(SHAPE_SPHERE, 40.0f, GetLocation(oPlayer), TRUE, OBJECT_TYPE_CREATURE);
        AssignCommand(oTarget, ClearAllActions(TRUE));
    }

oSpirit - это вещь, которая есть у персонажа, и на ней хранится значение переменной "Carma".

Правда, тут есть одна тонкость, если персонаж в этот момент разговаривает, то НПС с ним ничего сделать не сможет smile.gif Подбежит и не солоно хлебавши уйдет. Попробовал запрещать диалог с кем либо, если вышеописанная переменная равна 1, но еще не проверял, как бы у самого охранника не удалось завести диалог с целью.

Буду благодарен, если поможешь, только в моем случае убийца не враг охраннику, а друг изначально, это уже в диалоге от своего выбора он может остаться либо другом, либо стать врагом.

И вот еще такой вопрос, чуть не забыл написать, если выполняется ряд команд, например создается копия тела персонажа, но создается только лишь потому, что есть цель, но если цель исчезает, то происходит переполнение стека этими командами, ведь они уже запущены, и в итоге ошибка по стеку. Я и подумал, можно ли как-то очистить стек, если цель неожиданно исчезает, но команды уже запустились. У меня они так запускаются в момент смерти, и через 7 секунд создают на земле копию тела персонажа, а потом оригинального персонажа переносят в фугу.
Aiwan
QUOTE (Zirrex @ Jul 12 2005, 12:28)
Шабашного разбора не будет, потому что этот скрипт срабатывает 1 раз, а если подцепляется второй НПС, эм, забыл указать в скрипте, то ему сразу же очищаю все действия. Совсем иного рода тот же скрипт, но на хартбите. Пока что без правок, как есть:

Я имею ввиду ситуацию, когда рядом ДВА НПС, один уже убит, другой еще жив.
Мое предложение, сделай два НПС лидеров фракций. Один для охранников, другой для НПС комманеров. Присвой им левел 40 и спрячь в закрытой локе. И можешь менять фракцию либо очищать. Иначе будет так: РС убил НПС, рядом шел другой и накинется на РС, даже если он уже убийца. И это ничем уже не исправишь. Надо отслеживать всез енимов в локе и чистить репу им. Функцию даю ниже. Я не знаю всех тонкостей твоих ситуаций, поэтому я могу только гадать, но это пустая трата времени.
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: OnExit  am_inc_battle
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
              БОЕВАЯ БИБЛИОТЕКА
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 27.05.2005
//:://///////////////////////////////////////////
// ФУНКЦИЯ ОЧИСТКИ РЕПУТАЦИИ И СМЕНА ВСЕХ НПС НА ЛОКАЦИИ ФРАКЦИИ ВРАГА
// НА НЕЙТРАЛЬНУЮ
// object oPlayer - Игрок к которому враждебен oEnemy
// object oNetral - Объект с новой фракцией
// Если не указать кто именно, просто очистит репутацию
void ChangeEnemyToNetral(object oPlayer, object oNetral);

void ChangeEnemyToNetral(object oPlayer, object oNetral)
{
    object oArea  = GetArea(oPlayer);
    object oEnemy = GetFirstObjectInArea(oArea);
    object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPlayer);
    object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPlayer);
    object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPlayer);
    object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPlayer);
    while (GetIsObjectValid(oEnemy))
            {
              if (GetIsEnemy(oPlayer,oEnemy)) //Если объект зол на игрока
                {
//----------------------- Обработка помощников -------------------------------//
                if(oAnimal != OBJECT_INVALID) {
                AssignCommand(oAnimal,ClearAllActions(TRUE));
                ClearPersonalReputation(oAnimal,oEnemy);}
                if(oDominated != OBJECT_INVALID){
                AssignCommand(oDominated,ClearAllActions(TRUE));
                ClearPersonalReputation(oDominated,oEnemy);}
                if(oFamiliar != OBJECT_INVALID){
                AssignCommand(oFamiliar,ClearAllActions(TRUE));
                ClearPersonalReputation(oFamiliar,oEnemy);}
                if(oSummoned != OBJECT_INVALID){
                AssignCommand(oSummoned,ClearAllActions(TRUE));
                ClearPersonalReputation(oSummoned,oEnemy);}
                int i = 1;
                object oHench = GetHenchman(oPlayer, i);
                  while(oHench != OBJECT_INVALID)
                    {
                    AssignCommand(oHench,ClearAllActions(TRUE));
                    ClearPersonalReputation(oHench,oEnemy);
                    i++;
                    oHench = GetHenchman(oPlayer, i);
                    }
                AssignCommand(oEnemy,ClearAllActions(TRUE));
                ClearPersonalReputation(oPlayer,oEnemy);
                AdjustReputation(oPlayer, oEnemy, 50); // Добавил для тебя нейтральные отношения
//              ChangeFaction(oEnemy,oNetral); // я заккоментировал смену фракции
                  }
            oEnemy = GetNextObjectInArea(oArea);
            }
}

//------------------------------------------------------------------------------
/*
void main(){}


У меня работает функция так: игрок идет в локу, к нему подходят НПС. Если игрок решил их завалитть, то происходит разборка, отслеживается НР игрока, если он почти при смерти врубается скрипт и главарь ждет 10 секунд, что бы закончился раунд (ведь игрок не начнет диалог раеньше) и если что -то отвлекло НПС главаря, то хертбит сигналит юзердефу и НПС всеравно вспоминает и идет к РС. В общем у игрока нет возможности смыться, так как в это время я врубаю катсцену ему. Происходит диалог и если РС решит еще драться, то все по новому. Вес протестировано и все пахает как китайские часы.

Neverwinter Script Source
//========================== HEARTBEAT EVENT  =================================
  if (nEvent == 1001// Стандартный сигнал
      {
//        Если в локации нет игрока, то скрипт блокируется.
//    if (GetArea(OBJECT_SELF)!=GetArea(GetNearestPC())) {return;}
      /*  Проверка для игры несколькими игроками. Разкомментируйте
        если вы собираетесь провести здесь партию. */

    if (GetArea(OBJECT_SELF)!=GetArea(GetFirstPC())) {return;}
    /* Работает это для одиночного режима игры. Так проще и быстрее. */
      Debug("EVENT_HEARTBEAT");
      if (GetLocalInt(OBJECT_SELF, "START_CONVERSATION")==FALSE)
        {
          Debug("RETURN");
          return;
          }
      object oEnemy = OBJECT_SELF;
      object oPC = GetNearestPC(oEnemy);
      if (GetIsInCombat(oPC) || GetIsInCombat(oEnemy) || IsInConversation(oPC))
          {
          Debug("РС или НПС занят, что то мешает им поговорить.");
          return;
          }
          if (GetLocalInt(oEnemy, "START_CONVERSATION")==TRUE
              && GetLocalInt(oEnemy, "REPEAT")==TRUE)
              {
              AssignCommand(oEnemy, ClearAllActions());
              AssignCommand(oEnemy, ActionForceMoveToObject(oPC,TRUE, 2.0, 15.0));
              AssignCommand(oEnemy, ActionStartConversation(oPC));
              Debug("Если главарь не смог подойти и поговорить, напомним об этом");
              SetLocalInt(oEnemy, "REPEAT", FALSE);
              DelayCommand(15.0, SetLocalInt(oEnemy, "REPEAT", TRUE));
              }
      }
Zirrex
Aiwan, я попробую поэкспериментировать с этими скриптами, но что идеально работает в одиночной игре, то плохо подходит в онлайновой, опробовано уже не раз, и поэтому требует иного решения. Даю ссылку на описание моей системы репутации на данный момент. Повозившись сегодня со скриптом, удалось добиться, чтобы игрок не мог начинать свой диалог, пока к нему подходит НПС, иначе просто получается, что тот подходит, видит открытый диалог, и не солоно хлебавши уходит. Возможности, как открытый диалог нейтрализовать, я не смог найти. Далее, переменная в скрипте переключилась, условие на харбите более не выполняется, убийца сбежал smile.gif

QUOTE
если он почти при смерти врубается скрипт и главарь ждет 10 секунд, что бы закончился раунд.

А зачем он это делает, если команда "ClearAllActions(TRUE)", описанная в твоей библиотеке, моментально затирает боевое состояние НПС и персонажа?

Описание.

Остается актуальной в этой системе одна довольно серьезная проблема, как узнать, кто прав, а кто виноват в произошедшем убийстве? Ведь, если посмотреть функции редактора, то там нельзя найти такую функцию, как "GetFirstAttacker", но зато есть "GetLastAttacker". Только вот она не очень подходит, потому что в ситуации с 1-го уровневым персонажем против 20-и уровневого всегда будет неправ последний. Но почему так, а не иначе, чувствуется, разработчики не задумавались о такой PvP ситуации? Ведь он может просто подбежать и ударить, а стоящий персонаж, совершив автоматическую атаку (знать бы, как ее отключить при определенных условиях), сделает хороший и быстрый труп из напавшего персонажа, автоматически при этом зарабатывая минус к репутации. Дальше описывать не буду, все и так понятно.

Пока что у меня это первоочередная проблема, остальное довольно решаемо, и работает вроде бы как надо, осталось только проработать сценку разговора НПС и игрока, и все будет работать как надо.
Aiwan
QUOTE (Zirrex @ Jul 13 2005, 00:08)
...но что идеально работает в одиночной игре, то плохо подходит в онлайновой, опробовано уже не раз, и поэтому требует иного решения.

Во превых, если бы ты делал сингл, я бы дал тебе тест-модуль где все это работает. Но так как ты затачиваешь под себя, то я дал тебе как раз куски кода с которым я возился.
QUOTE (Zirrex @ Jul 13 2005, 00:08)
А зачем он это делает, если команда "ClearAllActions(TRUE)", описанная в твоей библиотеке, моментально затирает боевое состояние НПС и персонажа?

А ты хочешь сказать, что РС после боя мгновенно может начать диалог? Потестируй и увидишь, дебаг мессагу, что сейчас Игрок не может начать диалог.... Или представь ситуацию, что на игрока скастовали спелл парализации или еще какой бяки. Он попросту не будет говорить пока действие не пропадет. Дальше. Твой страж может попросту ЗАБЫТЬ актион. Либо застрять где-то в пути, либо игрок может дернуться и ещ куча либо... та же амбиен анимация. Ну решать тебе biggrin.gif

QUOTE (Zirrex @ Jul 13 2005, 00:08)
Повозившись сегодня со скриптом, удалось добиться, чтобы игрок не мог начинать свой диалог, пока к нему подходит НПС, иначе просто получается, что тот подходит, видит открытый диалог, и не солоно хлебавши уходит.

Ну дак а я тебе на кой дал свой код? У меня в стандартном еванте на начало диалога стоит отмена локалки хертбита, вернее в самом диалоге. Нет отмены локалки, НПС будет бегать за тобой пока ты не ответишь. Но так как ты, а именно РС в катсцене... то никуда ты не денешься. Все что ты рассказываешь я делал себе для сингал месяц назад. Поэтому объясняю тебе что можеет быть за подводные камни.
dumbo
Zirrex
1. то, что я тебе написал в предыдущий раз ты опять не потрудился понять.
2. твой скрипт не работает, ибо не проходит первую же проверку -
QUOTE
From the 1.66 patch notes:
Fixed an issue with the scripting command GetStandardFactionReputation() returning -1 when called on the defender faction with a PC creature object specified

3. делать обращение дефендера к игроку надо иначе. причин для того, чтоб диалог не состоялся в случае твоего решения предостаточно: рядом нет неписей, идет бой, непись просто не догнал игрока итд итп. опять же, если крутая заварушка, твой говорун может сильно помешать. следует просто навешивать на игрока локалку ПК, а потом на OnPerception дефендеров(избегать их постоянно запаришься) проверять PC на предмет наличия локалки - если есть такая, то далее PC на бой, идущий диалог итд - если все путем, то просто врубаешь режим кут-сцены, EffectCutsceneImmobilize на PC, спокойно подваливаешь и заводишь непринужденную беседу - "убил ты надысь игрока фартового, падла - ответствуй за базар" итд итп...
4.
QUOTE (Zirrex @ Jul 12 2005, 10:28)
Aiwan, так если его не ставить, охранник начинает движение и тут же говорит фразу

проясняем память smile.gif - такое происходит, если использовать SpeakString без ActionDoCommand. ActionSpeakString = ActionDoCommand(SpeakString). точка.
5. "задержки": скрипт RiPPeR'a ты изменил, но, насколько я понял, изменил коряво - поэтому первый же хб игрока, у которого еще не прогрузилась стартовая лока, приводит к затиранию координат - он еще, так сказать, в "нигде".
6.
QUOTE (Zirrex @ Jul 12 2005, 10:28)
но если цель исчезает, то происходит переполнение стека этими командами, ведь они уже запущены, и в итоге ошибка по стеку
что есть "ошибка по стеку"? и покажи свой скрипт, который ее вызывает - угадать, что ты подразумеваешь под "стеком" и "командами" довольно затруднительно...
7.
QUOTE (Zirrex @ Jul 12 2005, 22:08)
как узнать, кто прав, а кто виноват в произошедшем убийстве?
никак. если магию и можно отследить, то физические атаки - пока никак.
Zirrex
dumbo, нет, я понял, просто приведенный мной выше скрипт старый, и он не изменен, а проверку он проходил, так как у меня сейчас не 1.66, но проходил ее криво, потому что на скрипт реагировали и другие фракции. Тот, что я давал раньше, выполнялся только один раз, и после активации диалога, можно было о нем забыть. А вот скрипт, который на хартбите, с ним все гораздо сложнее. Чувствую, что придется его оттуда убрать, и сделать гораздо проще, хотя на данный момент работает нормально, но не срабатывает сразу, и иногда приходиться ждать какое-то время. На OnPerception ему будет самое оно. Окончательный вариант на данный момент, если учесть, что он постоянно выполняется, и его как-то надо тормозить, такой:

Neverwinter Script Source
if ((GetLocalInt(oSpirit, "Carma_" + sID) < -100) && (GetLocalInt(oPlayer, "PkKiller") != 1) &&
        (GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oPlayer) > 10))
    {
        // Поискать в радиусе жертвы живое существо
        object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 15.0f, GetLocation(oPlayer), TRUE, OBJECT_TYPE_CREATURE);

        object oNpc;
        string sTarget = GetTag(oTarget);

        // Если живое существо есть, то продолжить
        while (GetIsObjectValid(oTarget) && (GetStringLeft(sTarget, 9) == "npc_guard"))
        {
            oNpc = oTarget;

            if (GetFactionEqual(oTarget, oNpc) && !IsInConversation(oTarget) && !GetIsInCombat(oTarget))
            {
                // Очистить действие игрока и НПС
                AssignCommand(oTarget, ClearAllActions(TRUE));
                AssignCommand(oPlayer, ClearAllActions(TRUE));

                // Сбросить открытый диалог у персонажа, если он есть
                AssignCommand(oPlayer, ActionStartConversation(oTarget));
                // Очистить все действия у персонажа
                DelayCommand(0.3, AssignCommand(oPlayer, ClearAllActions(TRUE)));
                // Начало сценки для персонажа
                DelayCommand(0.5, SetCutsceneMode(oPlayer, TRUE));

                // Изменение переменной 'PkKiller' на 1.
                if (GetLocalInt(oPlayer, "PkKiller") != 1)
                {
                    SetLocalInt(oPlayer, "PkKiller", 1);
                }

                // Стражник подбегает к персонажу
                AssignCommand(oTarget, ActionForceMoveToObject(oPlayer, TRUE, 1.0f, 15.0));
                // Стражник говорит фразу персонажу в общий канал
                AssignCommand(oTarget, ActionSpeakString("Эй, подожди, у меня к тебе неотложный разговор!", TALKVOLUME_TALK));
                // Стражник открывает персонажу диалог
                AssignCommand(oTarget, ActionStartConversation(oPlayer, "am_carma_system", TRUE));
                // Окончание сценки
                DelayCommand(10.0, SetCutsceneMode(oPlayer, FALSE));
                break;
            }
            // Поискать в радиусе жертвы еще живое существо
            oTarget = GetNextObjectInShape(SHAPE_SPHERE, 15.0f, GetLocation(oPlayer), TRUE, OBJECT_TYPE_CREATURE);
            AssignCommand(oTarget, ClearAllActions(TRUE));
        }
    }

Последовал примеру Айвана, добавил сценку в момент, когда НПС замечает персонажа с отрицательной репутацией. Теперь персонажу не удастся сбежать, как это было раньше.

С координатами я разобрался. Чувствуется, что RiPPeR' учитывал это, когда делал скрипт, одно но, его модификация не сохраняет координаты постоянно, а лишь на входе в локацию. Может быть так оно и лучше, надо проверить.

Если приводить весь скрипт, много места займет. Опишу на словах, если не понятно все же будет, потом внесу сам скрипт. Например, умирает персонаж, запускается скрипт смерти, создается на персонаже невидимый объект, в который помещается предмет тела, далее, через 7 секунд запускается через "ExecuteScript" еще один скрипт. Данный скрипт копирует облик персонажа и размещает на там, где лежит персонаж, совмещая его с оригиналом. Через 7.5 секунд персонаж переносится в фугу.

Теперь ситуация, которая вызывает ошибку. Умирает персонаж, и тут же выходит, следующий через 7 секунд скрипт натыкается на пустоту. Персонажа то нету, копировать не с чего. В итоге происходит ошибка. Хотя чаще она происходит немного иначе, игрок успевает выйти своим персонажем до момента создания даже невидимого объекта. Скрипт просто не знает, куда его разместить, что приводит к ошибке.

Все же я приведу скрипт, но он будет длинный. Наверняка в нем много лишнего, но не буду пока что убирать ничего:

Neverwinter Script Source
int PWS_PLAYER_STATE_ALIVE = 0;
int PWS_PLAYER_STATE_DYING = 1;
int PWS_PLAYER_STATE_DEAD = 2;
int PWS_PLAYER_STATE_STABLE = 3;
int PWS_PLAYER_STATE_STABLEHEAL = 6;
int PWS_PLAYER_STATE_RESURRECTED = 7;
int PWS_PLAYER_STATE_RESTRUE = 8;
int PWS_PLAYER_STATE_RAISEDEAD = 9;
int PWS_PLAYER_STATE_FUGUE = 10;

object oMod = GetModule();

int GPS(object oPC)
{
    string sID = GetName(oPC) + GetPCPublicCDKey(oPC);
    return GetLocalInt(oMod, "PlayerState" + sID);
}

void SPS(object oPC, int nPS)
{
    string sID = GetName(oPC) + GetPCPublicCDKey(oPC);
    SetLocalInt(oMod, "PlayerState" + sID, nPS);
}

// Обновление репутации стандартных фракций по отношению к игроку, если он их обидел
void ResetReputation(object oPC)
{
    if (GetStandardFactionReputation(STANDARD_FACTION_COMMONER, oPC) <= 10)
        SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 80, oPC);

    if (GetStandardFactionReputation(STANDARD_FACTION_MERCHANT, oPC) <= 10)
        SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 80, oPC);

    if (GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oPC) <= 10)
        SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 80, oPC);
}


// Перемещение и восстановление жизни у персонажа
void Resurrect(object oPC, object oTransfer)
{
    ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPC);
    ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPC)),oPC);
    ResetReputation(oPC);
    AssignCommand(oPC, ActionJumpToObject(oTransfer));
}


void NotFugue(object oPC)
{
    string sID = GetName(oPC) + GetPCPublicCDKey(oPC);
    AssignCommand(GetLocalObject(oMod, "DropBag" + sID), ClearAllActions());
    DeleteLocalInt(oPC, "NOTFUGUE");
    return;
}

void MovePlayer(object oPC, object oLimbo)
{
    string sID = GetName(oPC) + GetPCPublicCDKey(oPC);

    if (GetLocalInt(oMod, "LOOTSYSTEM") && GetLocalInt(oPC, "NOTFUGUE"))
    {
        NotFugue(oPC);
        return;
    }

    if (GetLocalInt(oMod,"LOOTSYSTEM") && (GPS(oPC) != PWS_PLAYER_STATE_DEAD))
    {
        AssignCommand(GetLocalObject(oMod, "DropBag" + sID), ClearAllActions());
    }

    Resurrect(oPC, oLimbo);
    ExecuteScript("ahs_spell_remove", oPC);
    SetLocalInt(oMod, "LastRest" + sID, 0);
    DeleteLocalInt(oPC, "LOGINDEATH");
}

int RessCheck(object oPC)
{
    if (GetLocalInt(oMod,"GODSYSTEM"))
    {
        int nPercent = GetLocalInt(oMod, "GODCHANCE") + (GetHitDice(oPC) / 2);

        if (GetLocalInt(oPC, "LOGINDEATH"))
        {
            return 0;
        }

        if (GetDeity(oPC) == "")
        {
            SendMessageToPC(oPC, "У вас нет божества, и он не сможет услышать ваших молитв!");
            return 0;
        }
        else if (d100() > nPercent)
        {
            if (GetDeity(oPC) != "")
            {
                SendMessageToPC(oPC, "Ваше божество не услышало ваших молитв!");
            }
            return 0;
        }
        SendMessageToPC(oPC, "Ваше божество услышало ваши молитвы, и даровало вам жизнь!");

        if (GetLocalInt(oMod, "BLEEDSYSTEM"))
        {
            SPS(oPC, PWS_PLAYER_STATE_ALIVE);
        }

        object oTransfer = GetObjectByTag("wp_hotel_djon_tom");
        DelayCommand(12.0, Resurrect(oPC, oTransfer));
        return 1;
    }
    return 0;
}

object DropBag(location lDiedHere, object oPC)
{
    object oDropBag;
    string sID = GetName(oPC) + GetPCPublicCDKey(oPC);
    location lLoc;

    if (GetLocalInt(oPC, "LOGINDEATH"))
    {
        lLoc = GetLocalLocation(oMod, "DiedHere" + sID);
    }
    else
    {
        lLoc = GetLocation(oPC);
    }
    vector vLootBag = GetPositionFromLocation(lLoc);

    float fFacing = GetFacing(oPC) + (Random(2)?90.0:-90.0);

    vLootBag.x += cos(fFacing) * 1.0f;
    vLootBag.y += sin(fFacing) * 1.0f;

    location lDropBag = Location(GetArea(oPC), vLootBag, fFacing + 180.0);

    oDropBag = CreateObject(OBJECT_TYPE_PLACEABLE, "DyingCorpse", lDropBag, FALSE, "DropBag" + sID);
    SetLocalObject(oPC, "DROPBAG", oDropBag);
    SetLocalString(oDropBag, "Pkey", sID);
    return oDropBag;
}

void CheckDropBag(object oDropBag)
{
    object oItem = GetFirstItemInInventory(oDropBag);

    if (!GetIsObjectValid(oItem))
    {
        DelayCommand(4.0, DestroyObject(oDropBag));
    }
}

void CreateCorpse(object oPC)
{
    string sID = GetName(oPC) + GetPCPublicCDKey(oPC);
    object oDC;
    location lLoc;

    if (GetLocalInt(oPC, "LOGINDEATH"))
    {
        lLoc = GetLocalLocation(oMod, "DiedHere" + sID);
        oDC = CopyObject(oPC, lLoc);
    }
    else
    {
        oDC = CopyObject(oPC, GetLocation(oPC));
    }
    DeleteLocalInt(oPC, "LOGINDEATH");

    ChangeToStandardFaction(oDC, STANDARD_FACTION_COMMONER);

    AssignCommand(oDC, SetIsDestroyable(FALSE, FALSE, FALSE));
    SetLocalObject(oMod, "Corpse" + sID, oDC);

    object oDeathCorpse = GetLocalObject(oMod, "DeathCorpse" + sID);
    SetLocalString(oDeathCorpse, "CorpseKey", sID);

    AssignCommand(oDC, TakeGoldFromCreature(GetGold(oDC), oDC, TRUE));

    object oItem = GetFirstItemInInventory(oDC);

    while (GetIsObjectValid(oItem))
    {
        DestroyObject(oItem);
        oItem = GetNextItemInInventory(oDC);
    }
}

void main()
{
    object oPC = GetLastPlayerDied();

    string sName = GetName(oPC);
    string sCDK = GetPCPublicCDKey(oPC);
    string sID = sName + sCDK;

    // переключение переменной, нужна, чтобы не могли воскресить персонажа,
    // пока тот переносится в фугу
    SetLocalInt(oPC, "MOVING", TRUE);

    object oHenchman = GetHenchman(oPC);

    // если есть помощник, отпустить
    if (GetIsObjectValid(oHenchman))
    {
        RemoveHenchman(oPC, oHenchman);
    }

    object oDeathCorpse, oPCCorpse, oDeadMan, oDropBag;
    location lDiedHere;

    // проверка божества, если боги смилуются, то выполнение дальнейшего скрипта запретить
    if (GetLocalInt(oMod, "GODSYSTEM"))
    {
        if (RessCheck(oPC))
        {
            return;
        }
    }

    // Это условие запускается только при входе персонажа на шард
    if (GetLocalInt(oPC, "LOGINDEATH") && GetIsObjectValid(oPC))
    {
        // на момент смерти эта переменная равна 1, поэтому условие не выполняется
        if (!GetLocalInt(oPC, "GRAVEYARD"))
        {
            lDiedHere = GetLocalLocation(oMod, "DiedHere" + sID);
        }
        // выполняется это, когда персонаж входит с Камнем души на шард
        else
        {
            DeleteLocalInt(oPC, "GRAVEYARD");

            // Случайный выбор могилы
            int iRnum = Random(72) + 1;
            // Тэг точки перехода
            string sBase = "wp_corpse_drop_";
            // Присоединение к тэгу точки перехода случайной цифры
            string sGoto = sBase + IntToString(iRnum);
            // Создание окончательной точки перехода
            lDiedHere = GetLocation(GetObjectByTag(sGoto));
            // Установка локации, где покоится тело персонажа
            SetLocalLocation(oMod, "DiedHere" + sID, lDiedHere);
        }
    }
    // Обычное выполнение условия, если персонаж умирает на шарде
    else if (GetIsObjectValid(oPC))
    {
        // Берется место смерти персонажи
        lDiedHere = GetLocation(oPC);
        // Сохраняется место смерти на переменную
        SetLocalLocation(oMod, "DiedHere" + sID, lDiedHere);
    }

    // Если включена система смерти с трупом, и есть персонаж, то выполнить
    if (GetLocalInt(oMod, "DEATHSYSTEM") && GetIsObjectValid(oPC))
    {
        // Переключение состояния персонажа
        SPS(oPC, PWS_PLAYER_STATE_DEAD);

        if (GetLocalInt(oPC, "LOGINDEATH"))
        {
            location lLoc = lDiedHere;
            object oObject = GetNearestObjectToLocation(OBJECT_TYPE_PLACEABLE, lLoc);

            if (GetTag(oObject) == "DeathCorpse")
            {
                // Окончательно определение места смерти с некоторыми подробностями
                lDiedHere = Location(GetArea(oObject), GetPositionFromLocation(lLoc), GetFacing(oPC));
            }
        }

        // Если включена Лут система, то продолжить и создать сумку, куда
        // сложить деньги. Не обрабатывать на нижеописанных локациях.
        if (GetLocalInt(oMod, "LOOTSYSTEM") && (GetHitDice(oPC) >= 8) &&
            (GetTag(GetArea(oPC)) != "amen_start_sm") &&
            (GetTag(GetArea(oPC)) != "amen_ht_arena") &&
            (GetTag(GetArea(oPC)) != "amen_dt_magepl") &&
            (GetTag(GetArea(oPC)) != "amen_fortress"))
        {
            oDropBag = GetLocalObject(oMod,"DropBag" + sID);

            // Если нет, сумки, создать новую
            if (!GetIsObjectValid(oDropBag))
            {
                oDropBag = DropBag(lDiedHere, oPC);
                SetLocalObject(oDropBag, "Owner", oPC);
                SetLocalString(oDropBag, "Name", sName);
                SetLocalString(oDropBag, "Key", sCDK);
                SetLocalString(oDropBag, "Pkey", sID);
                SetLocalObject(oMod, "DropBag" + sID, oDropBag);
            }

            // Если состояние персонажа "Мертв", создать деньги в сумке.
            if (GPS(oPC) != PWS_PLAYER_STATE_DYING)
            {
                int nAmtGold = GetGold(oPC);

                if (nAmtGold > 0 && GetIsObjectValid(oDropBag))
                {
                    object oBag = CreateItemOnObject("bagofgold", oDropBag);
                    SetLocalInt(oBag, "AmtGold", nAmtGold);
                    SetLocalInt(oDropBag, "AmtGold", nAmtGold);
                    AssignCommand(oDropBag, TakeGoldFromCreature(nAmtGold, oPC, TRUE));
                }
            }
        }

        // Проверить сумку, если она пуста, удалить
        CheckDropBag(oDropBag);

        // Создание тела персонажа, который уже умер, если умирает тот, кто несет это тело
        ExecuteScript("ahs_dc_corpse", oPC);

        // Создание контейнера телу персонажа
        if (!GetIsObjectValid(oDeathCorpse))
        {
            oDeathCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "DC", lDiedHere);

            // Присвоение данной переменной только на локации "Арена"
            if (GetTag(GetArea(oPC)) == "amen_ht_arena")
            {
                SetLocalObject(oDeathCorpse, "Arena", GetArea(oPC));
            }

            SetLocalObject(oDeathCorpse, "Owner", oPC);
            SetLocalString(oDeathCorpse, "Name", sName);
            SetLocalString(oDeathCorpse, "Key", sCDK);
            SetLocalString(oDeathCorpse, "Pkey", sID);
            SetLocalInt(oDeathCorpse, "Level", GetHitDice(oPC));
            SetLocalObject(oMod, "DeathCorpse" + sID, oDeathCorpse);
        }

        // В созданный контейнер вложить тело игрока. Облик зависит от пола персонажа
        oDeadMan = GetLocalObject(oMod, "PlayerCorpse" + sID);

        if (!GetIsObjectValid(oDeadMan))
        {
            oDeadMan = CreateItemOnObject(GetGender(oPC)?"femalecorpse":"malecorpse", oDeathCorpse);

            // Присвоение данной переменной только на локации "Арена"
            if (GetTag(GetArea(oPC)) == "amen_ht_arena")
            {
                SetLocalObject(oDeadMan, "Arena", GetArea(oPC));
            }

            SetLocalObject(oPC, "PlayerToken", oDeadMan);
            SetLocalObject(oDeadMan, "Owner", oPC);
            SetLocalString(oDeadMan, "Name", sName);
            SetLocalString(oDeadMan, "Key", sCDK);
            SetLocalString(oDeadMan, "PKey", sID);
            SetLocalInt(oDeadMan, "Level", GetHitDice(oPC));
            SetLocalInt(oDeadMan, "Alignment", GetAlignmentGoodEvil(oPC));
            SetLocalInt(oDeadMan, "Gender", GetGender(oPC));
            SetLocalString(oDeadMan, "Deity", GetDeity(oPC));
            SetLocalObject(oDeathCorpse, "PlayerCorpse", oDeadMan);

            SetLocalObject(oDeadMan, "DeathCorpse", oDeathCorpse);
            SetLocalObject(oMod, "PlayerCorpse" + sID, oDeadMan);
        }
        // Создание копии тела через 7.0 секунд на месте смерти персонажа
        DelayCommand(7.0, CreateCorpse(oPC));
    }

    // Затирание времени до следующего сна
    SetLocalInt(oMod, "LastRecCheck" + sID, 0);

    // Если включена система Лимбо и Смерти, продолжить
    if (GetLocalInt(oMod, "LIMBO") && GetLocalInt(oMod, "DEATHSYSTEM"))
    {
        // Последнее утверждение места смерти персонажа
        SetLocalLocation(oMod, "DiedHere" + sID, lDiedHere);

        // При смерти перемещают в фугу, а если есть камень Абисса, то в Абисс
        if (GetLocalInt(oMod, "CARMASYSTEM") &&
            (GetItemPossessedBy(oPC, "am_stn_abyss_2") != OBJECT_INVALID))
        {
            DelayCommand(7.2, MovePlayer(oPC, GetObjectByTag("wp_abyss")));
        }
        else
        {
            DelayCommand(7.2, MovePlayer(oPC, GetObjectByTag("wp_enter_fugue")));
        }
    }
}
GoingPro)
Хочу зделать так что бы игроку при заходе в модуль открывалось диологовое окно (ну это я знаю как)...
Что бы его нельзя было закрыть до завершения...Я знаю можно в настройках объекта ставить без прирывания, хотя я не пробовал это...А как через скрипты потому что он будет говорить сам smile.gif
И что бы он не мог ничего делать кроме как говорить, это нужно на него эффект кидать какой то типа стун или дэйз да?

И ещо какая команда на дроп игрока с модуля?


Заранее благодарен...
Добавлено в [mergetime]1121347240[/mergetime]
А bootPC(oPC) это на всегда? ну тоесть это бан игрока?
Добавлено в [mergetime]1121348960[/mergetime]
StringToLocation

Neverwinter Script Source
location StringToLocation(string sLocation)
{
    location lReturnValue;
    object oArea;
    vector vPosition;
    float fOrientation, fX, fY, fZ;

    int iPos, iCount;
    int iLen = GetStringLength(sLocation);

    if (iLen > 0)
    {
        iPos = FindSubString(sLocation, "#AREA#") + 6;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        oArea = GetObjectByTag(GetSubString(sLocation, iPos, iCount));

        iPos = FindSubString(sLocation, "#POSITION_X#") + 12;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fX = StringToFloat(GetSubString(sLocation, iPos, iCount));

        iPos = FindSubString(sLocation, "#POSITION_Y#") + 12;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fY = StringToFloat(GetSubString(sLocation, iPos, iCount));

        iPos = FindSubString(sLocation, "#POSITION_Z#") + 12;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fZ = StringToFloat(GetSubString(sLocation, iPos, iCount));

        vPosition = Vector(fX, fY, fZ);

        iPos = FindSubString(sLocation, "#ORIENTATION#") + 13;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fOrientation = StringToFloat(GetSubString(sLocation, iPos, iCount));

        lReturnValue = Location(oArea, vPosition, fOrientation);
    }

    return lReturnValue;
}



LocationToString

Neverwinter Script Source
string LocationToString(location lLocation)
{
    object oArea = GetAreaFromLocation(lLocation);
    vector vPosition = GetPositionFromLocation(lLocation);
    float fOrientation = GetFacingFromLocation(lLocation);
    string sReturnValue;

    if (GetIsObjectValid(oArea))
        sReturnValue = "#AREA#" + GetTag(oArea) + "#POSITION_X#" + FloatToString(vPosition.x) + "#POSITION_Y#" + FloatToString(vPosition.y) + "#POSITION_Z#" + FloatToString(vPosition.z) + "#ORIENTATION#" + FloatToString(fOrientation) + "#END#";

    return sReturnValue;
}



Объясните мне пожалуйсто безтолковому как это работает?
Добавлено в [mergetime]1121350562[/mergetime]
А точнее как их совместить, и зачем прибавлять числа типа:
Neverwinter Script Source
iPos = FindSubString(sLocation, "#AREA#") + 6;
Dik Morris
Народ! Пожалуйста помогите со скриптом, суть в нем такая: игрок наступает триггер, и НПС идут на свои места, последний НПС атакует врага. Все это я сделал но вот... НЕПОНЯТНОЕ УСЛОВИЕ КОМПИЛЯТОРА, на:
ActionDoCommand(AssignCommand(oNPC_16, ActionAttack(oPC);
Впрочем вот и сам скрипт:

void main()
{
object oPC = GetEnteringObject();
object oNPC_01 = GetObjectByTag("NPC_01");
object oNPC_02 = GetObjectByTag("NPC_02");
object oNPC_03 = GetObjectByTag("NPC_03");
object oNPC_04 = GetObjectByTag("NPC_04");
object oNPC_05 = GetObjectByTag("NPC_05");
object oNPC_06 = GetObjectByTag("NPC_06");
object oNPC_07 = GetObjectByTag("NPC_07");
object oNPC_08 = GetObjectByTag("NPC_08");
object oNPC_09 = GetObjectByTag("NPC_09");
object oNPC_10 = GetObjectByTag("NPC_10");
object oNPC_11 = GetObjectByTag("NPC_11");
object oNPC_12 = GetObjectByTag("NPC_12");
object oNPC_13 = GetObjectByTag("NPC_13");
object oNPC_14 = GetObjectByTag("NPC_14");
object oNPC_15 = GetObjectByTag("NPC_15");
object oNPC_16 = GetObjectByTag("NPC_16");
//Ýòî ñïèñîê, âñåõ ÍÏÑ êîòîðûå ó÷àñòâóþò â äàííîì ñêðèïòå
object oWP_NPC_01 = GetWaypointByTag("NW_WAYPOINT001");
object oWP_NPC_02 = GetWaypointByTag("NW_WAYPOINT002");
object oWP_NPC_03 = GetWaypointByTag("NW_WAYPOINT003");
object oWP_NPC_04 = GetWaypointByTag("NW_WAYPOINT004");
object oWP_NPC_05 = GetWaypointByTag("NW_WAYPOINT005");
object oWP_NPC_06 = GetWaypointByTag("NW_WAYPOINT006");
object oWP_NPC_07 = GetWaypointByTag("NW_WAYPOINT007");
object oWP_NPC_08 = GetWaypointByTag("NW_WAYPOINT008");
object oWP_NPC_09 = GetWaypointByTag("NW_WAYPOINT009");
object oWP_NPC_10 = GetWaypointByTag("NW_WAYPOINT010");
object oWP_NPC_11 = GetWaypointByTag("NW_WAYPOINT011");
object oWP_NPC_12 = GetWaypointByTag("NW_WAYPOINT012");
object oWP_NPC_13 = GetWaypointByTag("NW_WAYPOINT013");
object oWP_NPC_14 = GetWaypointByTag("NW_WAYPOINT014");
object oWP_NPC_15 = GetWaypointByTag("NW_WAYPOINT015");
object oWP_NPC_16 = GetWaypointByTag("NW_WAYPOINT016");

if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "TRIGGER") == 1)
return;
SetLocalInt(OBJECT_SELF,"TRIGGER",1);

ActionDoCommand(AssignCommand(oNPC_01, ActionMoveToObject(oWP_NPC_01)));
ActionDoCommand(AssignCommand(oNPC_02, ActionMoveToObject(oWP_NPC_02)));
ActionDoCommand(AssignCommand(oNPC_03, ActionMoveToObject(oWP_NPC_03)));
ActionDoCommand(AssignCommand(oNPC_04, ActionMoveToObject(oWP_NPC_04)));
ActionDoCommand(AssignCommand(oNPC_05, ActionMoveToObject(oWP_NPC_05)));
ActionDoCommand(AssignCommand(oNPC_06, ActionMoveToObject(oWP_NPC_06)));
ActionDoCommand(AssignCommand(oNPC_07, ActionMoveToObject(oWP_NPC_07)));
ActionDoCommand(AssignCommand(oNPC_08, ActionMoveToObject(oWP_NPC_08)));
ActionDoCommand(AssignCommand(oNPC_09, ActionMoveToObject(oWP_NPC_09)));
ActionDoCommand(AssignCommand(oNPC_10, ActionMoveToObject(oWP_NPC_10)));
ActionDoCommand(AssignCommand(oNPC_11, ActionMoveToObject(oWP_NPC_11)));
ActionDoCommand(AssignCommand(oNPC_12, ActionMoveToObject(oWP_NPC_12)));
ActionDoCommand(AssignCommand(oNPC_13, ActionMoveToObject(oWP_NPC_13)));
ActionDoCommand(AssignCommand(oNPC_14, ActionMoveToObject(oWP_NPC_14)));
ActionDoCommand(AssignCommand(oNPC_15, ActionMoveToObject(oWP_NPC_15)));
ActionDoCommand(AssignCommand(oNPC_16, ActionMoveToObject(oWP_NPC_16)));
ActionDoCommand(AssignCommand(oNPC_16, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE, 1.0, 5.0)));
ActionDoCommand(AssignCommand(oNPC_16, PlayVoiceChat(VOICE_CHAT_HELLO)));
ActionDoCommand(AssignCommand(oNPC_16, ActionSpeakString("×òî íàäî?")));


ActionDoCommand(AssignCommand(oNPC_01, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE, 1.0, 5.0)));
ActionDoCommand(AssignCommand(oNPC_02, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE, 1.0, 5.0)));
ActionDoCommand(AssignCommand(oNPC_03, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE, 1.0, 5.0)));
ActionDoCommand(AssignCommand(oNPC_04, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE, 1.0, 5.0)));
ActionDoCommand(AssignCommand(oNPC_05, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE, 1.0, 5.0)));
ActionDoCommand(AssignCommand(oNPC_06, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE, 1.0, 5.0)));
ActionDoCommand(AssignCommand(oNPC_07, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE, 1.0, 5.0)));
ActionDoCommand(AssignCommand(oNPC_08, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE, 1.0, 5.0)));
ActionDoCommand(AssignCommand(oNPC_09, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE, 1.0, 5.0)));
ActionDoCommand(AssignCommand(oNPC_10, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE, 1.0, 5.0)));
ActionDoCommand(AssignCommand(oNPC_11, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE, 1.0, 5.0)));
ActionDoCommand(AssignCommand(oNPC_12, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE, 1.0, 5.0)));
ActionDoCommand(AssignCommand(oNPC_13, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE, 1.0, 5.0)));
ActionDoCommand(AssignCommand(oNPC_14, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE, 1.0, 5.0)));
ActionDoCommand(AssignCommand(oNPC_15, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE, 1.0, 5.0)));
ActionDoCommand(AssignCommand(oNPC_16, ActionAttack(oPC);

}

dumbo
Dik Morris
на будущее: скрипт обрамляй тэгами nss:
CODE
[nss]скрипт[/nss]

и закрой скобки, чудо! crazy.gif
ActionDoCommand(AssignCommand(oNPC_16, ActionAttack(oPC)));
-fenix-
Все дело в кол-ве скобок - в конце нужно 3 закрывающихся скобки.

Пользуйся кнопкой NSS, для написания скриптов!

Эм, дамбо, сорри за повтор, но когда я первый раз обновлял, тебя тут не было biggrin.gif
dumbo
QUOTE (GoingPro) @ Jul 14 2005, 17:05)
Хочу зделать так что бы игроку при заходе в модуль открывалось диологовое окно (ну это я знаю как)... Что бы его нельзя было закрыть до завершения
слово "Сделать" пишется только так и никак иначе. над твоим постом находится пост Zirrex'a, в котором первый скрипт содержит кусок кода, делающий невозможной отмену диалога. суть - SetCutsceneMode(oPlayer, TRUE)); только окончание кут-сцены надо вешать на скрипты самого диалога, а не просто задержкой на 10 секунд. хотя, если у тебя просто будет непись что-то рассказывать, тогда можно и так, только время подсчитать, чтоб успел выговориться.
QUOTE (GoingPro) @ Jul 14 2005, 17:05)
А bootPC(oPC) это на всегда? ну тоесть это бан игрока?
BootPC просто выкидывает игрока. он может тут же перезайти.
QUOTE (GoingPro) @ Jul 14 2005, 17:05)
Объясните мне пожалуйсто безтолковому как это работает?
это библиотечные функции - необязательно знать как они работают: их просто нужно использовать. получил локацию игрока, перевел в строку путем LocationToString, сохранил где-то(в базе, например). когда нужно восстановить - прочитал из базы строку, вызвал StringToLocation - получил локацию. осталось только отправить туда игрока.
GoingPro)
dumbo Спасибо за ответы, а в библиотечных функциях уже разобрался, но тоже спасибо.
Добавлено в [mergetime]1121360001[/mergetime]
Ага единственное что я не понял так это почему прибовляют числа +6 +12 и т.д.... dntknw.gif
dumbo
GoingPro)
строка возвращаемая LocationToString имеет вид:
#AREA#big_hell#POSITION_X#12.0#POSITION_Y#35.0#POSITION_Z#0.0#ORIENTATION#12.5#END#
функция FindSubString находит подстроку в строке и возвращает ее позицию.
т.е. FindSubString(sLocation, "#POSITION_X#") вернет в данном случае 14. но тебя то интересуют данные записанные после строки #POSITION_X#! - поэтому к найденному числу прибавляется длина строки "#POSITION_X#" - 12. т.е. данные находятся в строке на позиции 14+12 = 26.
надеюсь, внятно расписал? lazy.gif

Zirrex
сперва правильный вариант скрипта(и с хб его надо снимать):
Neverwinter Script Source
object oDefender = GetObjectByTag("самый главный дефендер");
// сидящий где-нибудь в темном углу и трясущийся от страха =]
if ((GetLocalInt(oSpirit, "Carma_" + sID) < -100) &&
    (GetLocalInt(oPlayer, "PkKiller") != 1) &&
//(GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oPlayer)
// ^^^ это всегда возвращает -1 В ВЕРСИЯХ ДО 1.66! - читай внимательней.
    (GetReputation(oPlayer, oDefender) > 10))
{
    // Поискать в радиусе жертвы живое существо
    object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 15.0f,
                      GetLocation(oPlayer), TRUE, OBJECT_TYPE_CREATURE);
    // Если живое существо есть, то продолжить
    // while (GetIsObjectValid(oTarget) && (GetStringLeft(sTarget, 9) == "npc_guard"))
    // ^^^ такая проверка приводит к тому, что если первый попавшийся
    // непись не будет дефендером, цикл прекращается. таким образом
    // ты будешь курить бамбук, пока первым объектом не попадется дефендер
    while (GetIsObjectValid(oTarget))
    {
            //oNpc = oTarget;
            //if (GetFactionEqual(oTarget, oNpc) &&...
            // ^^^ вот этот кусок - это... это...
        if (GetFactionEqual(oTarget, oDefender) &&
            !IsInConversation(oTarget) && !GetIsInCombat(oTarget))
        {
            // Очистить действие игрока и НПС
            AssignCommand(oTarget, ClearAllActions(TRUE));
            AssignCommand(oPlayer, ClearAllActions(TRUE));

            // Сбросить открытый диалог у персонажа, если он есть
            AssignCommand(oPlayer, ActionStartConversation(oTarget));
            // Очистить все действия у персонажа
            DelayCommand(0.3, AssignCommand(oPlayer, ClearAllActions(TRUE)));
            // Начало сценки для персонажа
            DelayCommand(0.5, SetCutsceneMode(oPlayer, TRUE));

            // Изменение переменной 'PkKiller' на 1.
            if (GetLocalInt(oPlayer, "PkKiller") != 1)
            {
                SetLocalInt(oPlayer, "PkKiller", 1);
            }

            // Стражник подбегает к персонажу
            AssignCommand(oTarget, ActionForceMoveToObject(oPlayer, TRUE, 1.0f, 15.0));
            // Стражник говорит фразу персонажу в общий канал
            AssignCommand(oTarget, ActionSpeakString("Эй, подожди, у меня к тебе неотложный разговор!", TALKVOLUME_TALK));
            // Стражник открывает персонажу диалог
            AssignCommand(oTarget, ActionStartConversation(oPlayer, "am_carma_system", TRUE));
            // Окончание сценки
            DelayCommand(10.0, SetCutsceneMode(oPlayer, FALSE));
            break;
        }
        // Поискать в радиусе жертвы еще живое существо
        oTarget = GetNextObjectInShape(SHAPE_SPHERE, 15.0f, GetLocation(oPlayer), TRUE, OBJECT_TYPE_CREATURE);
        //AssignCommand(oTarget, ClearAllActions(TRUE));
        // ^^^ зачем всех чистить?! - тем более, что чистятся только те, кто попался раньше дефендера...
    }
}

QUOTE (Zirrex @ Jul 14 2005, 10:18)
Теперь персонажу не удастся сбежать, как это было раньше.
подождет 10 секунд и сбежит yes.gif

скрипт смерти: на мой взгляд, скрипт сильно запущен, хоть и трепыхается... crazy.gif
очень много лишнего, очень запутанно. а теперь основное: в скриптах смерти никто никогда не делает задержек при работе с объектом игрока - это верный путь к багам. если и надо что-то задержать, то соскреби с игрока все, что тебе нужно, отложи в сторонку, а потом уже делай задержки. работать потом, естественно, только с тем, что сохранил "в сторонке". вывод: убирай нах все delay свои!
Zirrex
dumbo, с хартбита я его убрал, и повесил на OnPerception, несколько изменив, и убрав цикл, потому что на самом НПС он уже не нужен.

Один вопрос, если же оставлять скрипт с циклом, как же мне определить правильно "oDefender", если мне не нужен какой-то определенный НПС, а именно НПС, у которого в имени тэга которого только эти слова "npc_guard"? Воспримется ли нормально такой вид тэга?

Neverwinter Script Source
object oDefender = GetObjectByTag(GetStringLeft("npc_guard", 9));

Новый скрипт, не всегда срабатывает, потому что условие по расстоянию, но если его не делать, то НПС бежит с очень далекого расстояния. Можно опять же сделать цикл по сфере, но что не хочется громоздить лишний код.

Neverwinter Script Source
#include "ahs_sp_spirit"

void main()
{
    object oPercep = GetLastPerceived();

    object oGuard = OBJECT_SELF;
    object oSpirit = GetPlayerSpirit(oPercep);

    string sID = GetName(oPercep) + GetPCPublicCDKey(oPercep);

    // проверка репутации между персонажем и стражником
    if (GetReputation(oPercep, oGuard) > 10)
    {
        // проверка репутации персонажа, если выше -100, остановить
        if (GetLocalInt(oSpirit, "Carma_" + sID) > -100) return;

        // если в имени тэга нет этих слова, остановить
        if (GetStringLeft(GetTag(oGuard), 9) != "npc_guard") return;

        // если персонаж в этих локациях, остановить
        // думаю, лишнее, ибо в этих локациях нет стражников.
        if ((GetTag(GetArea(oPercep)) == "amen_start_sm") ||
            (GetTag(GetArea(oPercep)) == "am_lost_souls_w_sm") ||
            (GetTag(GetArea(oPercep)) == "amen_ht_arena") ||
            (GetTag(GetArea(oPercep)) == "amen_dt_magepl") ||
            (GetTag(GetArea(oPercep)) == "amen_fortress") ||
            (GetTag(GetArea(oPercep)) == "amen_ht_prison"))
        {
            return;
        }

        // проверка дистанции стражника до цели, если больше 10, остановить
        if (GetDistanceToObject(oPercep) > 10.0) return;

        // если переменная существует, остановить
        if (GetLocalInt(oPercep, "PkKiller") == TRUE) return;

        // если стражник не сражается и не говорит, продолжить
        if (!IsInConversation(oGuard) && !GetIsInCombat(oGuard))
        {
            string sMessage;
            int iRandom = d12();

            switch (iRandom)
            {
                case 1: sMessage = "Эй, подождите, у меня к вам неотложный разговор!"; break;
                case 2: sMessage = "Эй, что-то мне лицо ваше не нравится?!"; break;
                case 3: sMessage = "Охрана не дремлет! Оставаться на месте, и не двигаться!"; break;
                case 4: sMessage = "Стоять! Вы арестованы!"; break;
                case 5: sMessage = "Стоять! Малейшее движение, и вы пожалеете, что я вообще вас заметил!"; break;
                case 6: sMessage = "Оставайтесь на месте! Вот так. А теперь поговорим."; break;
                case 7: sMessage = "Погодите, не спешите, надо поговорить."; break;
                case 8: sMessage = "Вот ведь мне как везет сегодня, вы то мне и нужны."; break;
                case 9: sMessage = "Что-то ходят слухи, что вы нарушаете закон!"; break;
                case 10: sMessage = "По-моему я вас где-то видел? Ах да, вы то мне и нужны..."; break;
                case 11: sMessage = "Сегодня у меня удачный день, а у вас видимо, нет..."; break;
                case 12: sMessage = "Кто это тут у нас? Хе-хе, как я погляжу, у вас руки уже дрожат!"; break;
            }

            // Очистить действие игрока и НПС
            AssignCommand(oGuard, ClearAllActions(TRUE));
            AssignCommand(oPercep, ClearAllActions(TRUE));

            // Сбросить открытый диалог у персонажа, если он есть
            AssignCommand(oPercep, ActionStartConversation(oGuard));
            // Очистить все действия у персонажа
            DelayCommand(0.1, AssignCommand(oPercep, ClearAllActions(TRUE)));
            // Начало сценки для персонажа
            DelayCommand(0.2, SetCutsceneMode(oPercep, TRUE));

            // Изменение переменной 'PkKiller' на 1.
            if (GetLocalInt(oPercep, "PkKiller") != TRUE)
            {
                SetLocalInt(oPercep, "PkKiller", TRUE);
            }

            // Стражник подбегает к персонажу
            AssignCommand(oGuard, ActionForceMoveToObject(oPercep, TRUE, 1.0f, 5.0));
            // Стражник говорит фразу персонажу в общий канал
            AssignCommand(oGuard, ActionSpeakString(sMessage, TALKVOLUME_TALK));
            // Стражник открывает персонажу диалог
            AssignCommand(oGuard, ActionStartConversation(oPercep, "am_carma_system", TRUE));
        }
    }
}

Не нашел иного пути, как сбросить открытый диалог у персонажа, поэтому стираю ему действия и пытаюсь завязывать этим персонажем диалог со стражником, быстро останавливаю, включаю кутсцену, а дальше уже по скрипту.

Не сбежит, диалог то уже запущен. А на выходе и входе в модуль у меня проверяется переменная, если она равна TRUE, то удалить, соответственно НПС снова обратится к персонажу игрока. Если же попробует просто скинуть диалог, отбежав подальше, опять-таки, на данный момент, обижается вся фракция "Defender". Мне такой путь не очень нравится, но пока по-другому не реализовал.

Скрипт смерти был такой изначально, и даже хуже, когда я взялся за модуль. Работая с ним, начал доводить до идеальной работы, и от того скрипта мало уже что осталось. Запутанный он, потому что много всего, что надо учитывать при смерти. К тому же я взял все инклуды, и включил в один кусок скрипта, чтобы легче было разобраться. Буду еще отлаживать, главное, он работает, пока игрок не делает ничего, что может привести к ошибке.
minion
Компилятор выдает мне ошибку: ОШИБКА: МНОГОКРАТНЫЙ СЛУЧАЙ ПОСТОЯННОГО УТВЕРЖДЕНИЯ В ПРЕДЕЛАХ ВЫКЛЮЧАТЕЛЯ в скрипте (место отмечено //*****):
Neverwinter Script Source
/*
Function return the new property of item
*/

itemproperty ReturnNewProperty (object oItem, int nProperty)
{
    object oPlayer = GetFirstPC ();
    itemproperty itemprop;
    switch (nProperty)
    {
        case IP_CONST_DAMAGETYPE_ACID:
        case IP_CONST_DAMAGETYPE_FIRE:
        case IP_CONST_DAMAGETYPE_COLD:
        case IP_CONST_DAMAGETYPE_ELECTRICAL:
        case IP_CONST_DAMAGETYPE_MAGICAL:
        case IP_CONST_DAMAGETYPE_NEGATIVE:
        case IP_CONST_DAMAGETYPE_POSITIVE:
        {
            int nDamBonus = GetLocalInt (oPlayer, "DAMAGE_BONUS");
            itemprop = ItemPropertyDamageBonus (nType, nDamBonus);
            break;
        }
        case CONST_ATTACK_BONUS:
        {
            int nCount = GetLocalInt (oPlayer, "COUNT");
            itemprop = ItemPropertyAttackBonus (nCount);
            break;
        }
        case CONST_KEEN:
        {
            itemprop = ItemPropertyKeen ();
            break;
        }
        case CONST_SPELL_RESISTANCE:
        {
            int nResist = GetLocalInt (oPlayer, "SPELL_RESIST");
            itemprop = ItemPropertyBonusSpellResistance (nResist);
            break;
        }
        case CONST_TRUE_SEEING:
        {
            itemprop = ItemPropertyTrueSeeing ();
            break;
        }
        case CONST_REGENERATION:
        {
            int nReg = GetLocalInt (oPlayer, "COUNT");
            itemprop = ItemPropertyRegeneration (nReg);
            break;
        }
        case IP_CONST_ABILITY_CHA: //*****
        case IP_CONST_ABILITY_CON:
        case IP_CONST_ABILITY_DEX:
        case IP_CONST_ABILITY_INT:
        case IP_CONST_ABILITY_STR:
        case IP_CONST_ABILITY_WIS:
        {
            int nCount = GetLocalInt (oPlayer, "COUNT");
            itemprop = ItemPropertyAbilityBonus (nProperty, nCount);
            break;
        }
        case CONST_HASTE:
        {
            itemprop = ItemPropertyHaste ();
            break;
        }
/*
        case CONST_SPELL_IMMUNE_LEVEL:
        {
            int nCount = GetLocalInt (oPlayer, "COUNT");
            itemprop = ItemPropertyImmuneToSpellLevel (nCount);
            break;
        }
*/

        case CONST_ONHIT_PROPS:
        {
            int nSaveDC = GetLocalInt (oPlayer, "SAVE_DC");
            int nSpecial = GetLocalInt (oPlayer, "SPECIAL");
            itemprop = ItemPropertyOnHitProps (nProperty, nSaveDC, nSpecial);
            break;
        }
        case CONST_VAMPIRIC_REGENERATION:
        {
            int nVampReg = GetLocalInt (oPlayer, "COUNT");
            itemprop = ItemPropertyVampiricRegeneration (nVampReg);
            break;
        }
        case ITEM_VISUAL_ACID:
        case ITEM_VISUAL_COLD:
        case ITEM_VISUAL_ELECTRICAL:
        case ITEM_VISUAL_EVIL:
        case ITEM_VISUAL_FIRE:
        case ITEM_VISUAL_HOLY:
        case ITEM_VISUAL_SONIC:
        {
            itemprop = ItemPropertyVisualEffect (nProperty);
            break;
        }
        case CONST_DARKVISION:
        {
            itemprop = ItemPropertyDarkvision ();
            break;
        }
    }
}

Ему не нравится что у меня слишком много case?
Добавлено в [mergetime]1121408064[/mergetime]
И еще. Пусть меч дает бонус силы +12. Могу я получить это +12 следующей ф-ей?
[NSS]
int GetAbilityBonus (object oItem, int nAbility)
{
itemproperty ip = GetFirstItemProperty (oItem);
while (GetIsItemPropertyValid (ip))
{
if (GetItemPropertyType (ip) == nAbility)
{
return GetItemPropertySubType (ip);
}
ip = GetNextItemProperty (oItem);
}
}
Добавлено в [mergetime]1121408138[/mergetime]
И еще. Пусть меч дает бонус силы +12. Могу я получить это +12 следующей ф-ей?
Neverwinter Script Source
int GetAbilityBonus (object oItem, int nAbility)
{
    itemproperty ip = GetFirstItemProperty (oItem);
    while (GetIsItemPropertyValid (ip))
    {
        if (GetItemPropertyType (ip) == nAbility)
        {
            return GetItemPropertySubType (ip);
        }
        ip = GetNextItemProperty (oItem);
    }
}
GoingPro)
dumboДа расписал отлично, только я уже понял, метот похож на паскаль smile.gif
Уже все зделал, значение стринг прилипил к предмету невыкидываемуму, затем одтуда счатываю перевожу в Локайшен и кидаю перса туда....Поидеи должно сохраниться после рэбута на шмотке, дома прийду проверю.

А тебе спасибо! good.gif
Zirrex
minion, ну и скрипт, ты хотя бы привел инклуд с константами, где ты их определяешь, а то часть констант даже и не значится среди стандартных. Ошибку он тебе эту пишет только лишь потому, что у тебя разный тип констант в одном переключателе. И используй английский редактор, а то понять, что означает твоя ошибка в переводе, очень тяжко.

Объясни подробнее, что именно ты хочешь сделать?

Если желаешь бонус силы от меча, так пропиши подобное на модульные скрипты. Там есть эвент, который обрабатывает одеваемые и снимаемые вещи. Например так:

На эвент модуля "OnPlayerEquipItem"
Neverwinter Script Source
void main()
{
    object oPC = GetPCItemLastEquippedBy();
    object oItem = GetPCItemLastEquipped();
    string sTag = GetTag(oItem);

    if (sTag == "am_it_sword")
    {
        effect eStrength = SupernaturalEffect(EffectAbilityIncrease(ABILITY_STRENGTH, 12));
        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eStrength, oPC);
    }
}


На эвент модуля "OnPlayerUnEquipItem"
Neverwinter Script Source
void main()
{
    object oPC = GetPCItemLastUnequippedBy();
    object oItem = GetPCItemLastUnequipped();
    string sTag = GetTag(oItem);

    if (sTag == "am_it_sword")
    {
        effect eEff = GetFirstEffect(oPC);

        while (GetIsEffectValid(eEff))
        {
            if (GetEffectType(eEff) == EFFECT_TYPE_ABILITY_INCREASE &&
                GetEffectSubType(eEff) == SUBTYPE_SUPERNATURAL)
            {
                RemoveEffect(oPC, eEff);
            }
            eEff = GetNextEffect(oPC);
        }
    }

Тут я немного не разобрался, как снять определенный эффект, т.е. в нашем случае снять только эффект изменной силы, поэтому скрипт снятия эффекта универсальный.
minion
Zirrex я хочу сделать кузнеца, который будет зачаровывать вещи за определенную плату. Нечто подобное есть в ХотУ. Но там не зачаровывает характеристики. Вот мне и пришла в голову идея. У меня не получается только зачарование Харизмы и проверка на уже зачарованный бонус (скажем +12 силы на мече).
Вот выкладываю весь инклуд:
Neverwinter Script Source
//::///////////////////////////////////////////////
//:: Name UpdateWeapon.nss
//:: Copyright DSS
//:://////////////////////////////////////////////
/*
        БИБЛИОТЕКА ДЛЯ УЛУЧШЕНИЯ ОРУЖИЯ
*/

//:://////////////////////////////////////////////
//:: Created By:  minion
//:: Created On:  july 2005
//:://////////////////////////////////////////////

//////////////////////////////////////////////////
//                CONSTANTS
//////////////////////////////////////////////////
const int CONST_ATTACK_BONUS = 19000;
const int CONST_KEEN = 19003;
const int CONST_TRUE_SEEING = 19005;
const int CONST_SPELL_RESISTANCE = 19006;
const int CONST_REGENERATION = 19007;
const int CONST_HASTE = 19002;
const int CONST_SPELL_IMMUNE_LEVEL = 18100;
const int CONST_ONHIT_PROPS = 18101;
const int CONST_VAMPIRIC_REGENERATION = 18102;
const int CONST_DARKVISION = 18103;
//////////////////////////////////////////////////
//              FUNCTIONS
//////////////////////////////////////////////////
/*
Вывод отладочного сообщения
*/

void debug (string sMes)
{
    object oPlayer = GetFirstPC ();
    SendMessageToPC (oPlayer, sMes);
}
/*
Function delete all temporary properties from item
*/

void RemoveTemporaryProperties (object oItem, int nDurType = DURATION_TYPE_TEMPORARY)
{
    itemproperty itemprop = GetFirstItemProperty (oItem);
    int nPropDurType;
    while (GetIsItemPropertyValid (itemprop))
    {
        nPropDurType = GetItemPropertyDurationType (itemprop);
        if (nPropDurType == nDurType) RemoveItemProperty (oItem, itemprop);
        itemprop = GetNextItemProperty (oItem);
    }
}
/*
Function return the new property of item
*/

itemproperty ReturnNewProperty (object oItem, int nProperty)
{
    object oPlayer = GetFirstPC ();
    itemproperty itemprop;
    int nCount, nSaveDC, nSpecial;
    if ((nProperty == IP_CONST_DAMAGETYPE_ACID) || (nProperty == IP_CONST_DAMAGETYPE_FIRE) || (nProperty == IP_CONST_DAMAGETYPE_COLD) || (nProperty == IP_CONST_DAMAGETYPE_ELECTRICAL))
    {
        nCount = GetLocalInt (oPlayer, "DAMAGE_BONUS");
        itemprop = ItemPropertyDamageBonus (nProperty, nCount);
    }
    else if ((nProperty == IP_CONST_DAMAGETYPE_MAGICAL) || (nProperty == IP_CONST_DAMAGETYPE_NEGATIVE) || (nProperty == IP_CONST_DAMAGETYPE_POSITIVE))
    {
        nCount = GetLocalInt (oPlayer, "DAMAGE_BONUS");
        itemprop = ItemPropertyDamageBonus (nProperty, nCount);
    }
    else if (nProperty == CONST_ATTACK_BONUS)
    {
        nCount = GetLocalInt (oPlayer, "COUNT");
        itemprop = ItemPropertyAttackBonus (nCount);
    }
    else if (nProperty == CONST_KEEN)
    {
        itemprop = ItemPropertyKeen ();
    }
    else if (nProperty == CONST_SPELL_RESISTANCE)
    {
        nCount = GetLocalInt (oPlayer, "SPELL_RESIST");
        itemprop = ItemPropertyBonusSpellResistance (nCount);
    }
    else if (nProperty == CONST_TRUE_SEEING)
    {
        itemprop = ItemPropertyTrueSeeing ();
    }
    else if (nProperty == CONST_REGENERATION)
    {
        nCount = GetLocalInt (oPlayer, "COUNT");
        itemprop = ItemPropertyRegeneration (nCount);
    }
    else if ((nProperty == IP_CONST_ABILITY_CHA) || (nProperty == IP_CONST_ABILITY_CON) ||
            (nProperty == IP_CONST_ABILITY_DEX) || (nProperty == IP_CONST_ABILITY_INT) ||
            (nProperty == IP_CONST_ABILITY_STR) || (nProperty == IP_CONST_ABILITY_WIS))
    {
        nCount = GetLocalInt (oPlayer, "COUNT");
        itemprop = ItemPropertyAbilityBonus (nProperty, nCount);
    }
    else if (nProperty == CONST_HASTE)
    {
        itemprop = ItemPropertyHaste ();
    }
/*
    else if (nProperty == CONST_SPELL_IMMUNE_LEVEL)
    {
        nCount = GetLocalInt (oPlayer, "COUNT");
        itemprop = ItemPropertyImmuneToSpellLevel (nCount);
    }
*/

    else if (nProperty == CONST_ONHIT_PROPS)
    {
        nSaveDC = GetLocalInt (oPlayer, "SAVE_DC");
        nSpecial = GetLocalInt (oPlayer, "SPECIAL");
        itemprop = ItemPropertyOnHitProps (nProperty, nSaveDC, nSpecial);
    }
    else if (nProperty == CONST_VAMPIRIC_REGENERATION)
    {
        nCount = GetLocalInt (oPlayer, "COUNT");
        itemprop = ItemPropertyVampiricRegeneration (nCount);
    }
    else // По умолчанию будет CONST_DARKVISION
    {
            itemprop = ItemPropertyDarkvision ();
    }
    return itemprop;
}
/*
Function removing matching properties from item
*/

void RemoveMatchingProperties (object oItem, int nType, int nSubType)
{
    itemproperty itemp = GetFirstItemProperty (oItem);
    while (GetIsItemPropertyValid (itemp))
    {
        if (GetItemPropertyType (itemp) == nType)
        {
            if (GetItemPropertySubType (itemp) == nSubType)
            {
                RemoveItemProperty (oItem, itemp);
            }
        }
        itemp = GetNextItemProperty (oItem);
    }
}
/*
Function check PC gold needed for service
*/

int GetGoldForService (int nServ)
{
    int nGoldNeed, nCount, nSaveDC, nSpecial;
    object oPlayer = GetFirstPC ();
    int nMN = GetLocalInt (oPlayer, "MN");
    if ((nServ == IP_CONST_DAMAGETYPE_ACID) || (nServ == IP_CONST_DAMAGETYPE_FIRE) || (nServ == IP_CONST_DAMAGETYPE_COLD) || (nServ == IP_CONST_DAMAGETYPE_ELECTRICAL))
    {
            nCount = GetLocalInt (oPlayer, "COUNT");
            nGoldNeed = nCount*nMN;
    }
    else if ((nServ == IP_CONST_DAMAGETYPE_MAGICAL) || (nServ == IP_CONST_DAMAGETYPE_NEGATIVE) || (nServ == IP_CONST_DAMAGETYPE_POSITIVE))
    {
            nCount = GetLocalInt (oPlayer, "COUNT");
            nGoldNeed = nCount*nMN;
    }
    else if (nServ == CONST_ATTACK_BONUS)
    {
            nCount = GetLocalInt (oPlayer, "COUNT");
            nGoldNeed = nCount*nMN;
    }
    else if (nServ == CONST_KEEN)
    {
            nGoldNeed = 70000;
    }
    else if (nServ == CONST_SPELL_RESISTANCE)
    {
            nCount = GetLocalInt (oPlayer, "SPELL_RESIST");
            nGoldNeed = nCount*nMN;
    }
    else if (nServ == CONST_TRUE_SEEING)
    {
            nGoldNeed = 70000;
    }
    else if (nServ == CONST_REGENERATION)
    {
            nCount = GetLocalInt (oPlayer, "COUNT");
            nGoldNeed = nCount*nMN;
    }
    else if ((nServ == IP_CONST_ABILITY_CHA) || (nServ == IP_CONST_ABILITY_CON) ||
            (nServ == IP_CONST_ABILITY_DEX) || (nServ == IP_CONST_ABILITY_INT) ||
            (nServ == IP_CONST_ABILITY_STR) || (nServ == IP_CONST_ABILITY_WIS))
    {
            nCount = GetLocalInt (oPlayer, "COUNT");
            nGoldNeed = nCount*nMN;
    }
    else if (nServ == CONST_HASTE)
    {
            nGoldNeed = 150000;
    }
/*
    else if (nServ == CONST_SPELL_IMMUNE_LEVEL)
    {
            nCount = GetLocalInt (oPlayer, "COUNT");
            nGoldNeed = nCount*nMN;
    }
*/

    else if (nServ == CONST_ONHIT_PROPS)
    {
            nSaveDC = GetLocalInt (oPlayer, "SAVE_DC");
            nSpecial = GetLocalInt (oPlayer, "SPECIAL");
            nGoldNeed = (nSaveDC + nSpecial) * nMN / 50;
    }
    else if (nServ == CONST_VAMPIRIC_REGENERATION)
    {
            nCount = GetLocalInt (oPlayer, "COUNT");
            nGoldNeed = nCount*nMN;
    }
    else // По умолчанию будет CONST_DARKVISION
    {
            nGoldNeed = 50000;
    }
    return nGoldNeed;
}
/*
Function add the new property to the item
*/

void AddNewProperty (object oItem, itemproperty itemp)
{
    int nType = GetItemPropertyType (itemp);
    int nSubType = GetItemPropertySubType (itemp);
    RemoveMatchingProperties (oItem, nType, nSubType);
    AddItemProperty (DURATION_TYPE_PERMANENT, itemp, oItem);
    debug ("costtable : " + IntToString (GetItemPropertyCostTable(itemp)));
    debug ("value : " + IntToString (GetItemPropertyCostTableValue (itemp)));
}
/*
Функция проверяет наличие свойства. Если такового
нет возвращает FALSE.
*/

int GetItemHasProperty (object oItem, itemproperty ip)
{
    itemproperty itemp = GetFirstItemProperty (oItem);
    while (GetIsItemPropertyValid (itemp))
    {
        if (GetItemPropertyType (itemp) == GetItemPropertyType (ip))
        {
            if (GetItemPropertySubType (itemp) == GetItemPropertySubType (ip))
            {
                return TRUE;
            }
        }
        itemp = GetNextItemProperty (oItem);
    }
    return FALSE;
}
/*
Функция возвращает бонус характеристики. Если такового
нет, то возвращает -1.
*/

int GetAbilityBonus (object oItem, int nAbility)
{
    int n;
    itemproperty itemp;
    for (n == 1; n < 13; n++)
    {
        itemp = ItemPropertyAbilityBonus (nAbility, n);
        if (GetItemHasProperty (oItem, itemp)) return TRUE;
    }
    return -1;
}

Найдете ошибки пишите.
Batkom
сделал простенькую систему вархаузов, стоит сундук,оа onOpen стоит
Neverwinter Script Source
void main()
{
SetLocked(OBJECT_SELF, TRUE);
object oPC = GetLastUsedBy();
int kItems = GetCampaignInt(GetModuleName(), "kwares" + GetPCPlayerName(oPC) + GetPCPublicCDKey(oPC));
while (kItems > 0)
    {
    string sItem = GetCampaignString(GetModuleName(), "wares" + GetPCPlayerName(oPC) + GetPCPublicCDKey(oPC) + IntToString(kItems));
    CreateItemOnObject(sItem, OBJECT_SELF, 1);
    kItems = kItems -1;
    }
}


на onClose
Neverwinter Script Source
void main()
{
object oPC = GetLastUsedBy();
int kItems = 0;
object oItem = GetFirstItemInInventory(OBJECT_SELF);
SetLocked(OBJECT_SELF, TRUE);
while(GetIsObjectValid(oItem) == TRUE)
    {
        kItems = kItems + 1;
        string sRes = GetResRef(oItem);
        SetCampaignString(GetModuleName(), "wares" + GetPCPlayerName(oPC) + GetPCPublicCDKey(oPC) + IntToString(kItems), sRes);
        DestroyObject(oItem);
        oItem = GetNextItemInInventory(OBJECT_SELF);
    }
    SetCampaignInt(GetModuleName(), "kwares" + GetPCPlayerName(oPC) + GetPCPublicCDKey(oPC), kItems);
}

ве вроди бы работает, только есть две проблемы, во первых траблы со стак предметами, во вторых иногда исчезает какая нибудь одна вещь
GoingPro)
Помогите не работает чете =\....Вот скрипт:
На ОнЕкзит
Neverwinter Script Source
string LocationToString(location lLocation)
{
    object oArea = GetAreaFromLocation(lLocation);
    vector vPosition = GetPositionFromLocation(lLocation);
    float fOrientation = GetFacingFromLocation(lLocation);
    string sReturnValue;

    if (GetIsObjectValid(oArea))
        sReturnValue = "#AREA#" + GetTag(oArea) + "#POSITION_X#" + FloatToString(vPosition.x) + "#POSITION_Y#" + FloatToString(vPosition.y) + "#POSITION_Z#" + FloatToString(vPosition.z) + "#ORIENTATION#" + FloatToString(fOrientation) + "#END#";
    return sReturnValue;
}



void main()
{
  object oPC = GetExitingObject();
  object oItem = GetItemPossessedBy(oPC, "tag_of_item");
  string sReturnValue;
  location lLocation = GetLocation(oPC);
  if (GetIsPC(oPC))
  {
    LocationToString(lLocation);
    SetLocalString(oItem, "Location" + GetPCPlayerName(oPC), sReturnValue);
  }
}


И на ОнЕнтер
Neverwinter Script Source
location StringToLocation(string sLocation)
{
    location lReturnValue;
    object oArea;
    vector vPosition;
    float fOrientation, fX, fY, fZ;

    int iPos, iCount;
    int iLen = GetStringLength(sLocation);

    if (iLen > 0)
    {
        iPos = FindSubString(sLocation, "#AREA#") + 6;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        oArea = GetObjectByTag(GetSubString(sLocation, iPos, iCount));

        iPos = FindSubString(sLocation, "#POSITION_X#") + 12;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fX = StringToFloat(GetSubString(sLocation, iPos, iCount));

        iPos = FindSubString(sLocation, "#POSITION_Y#") + 12;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fY = StringToFloat(GetSubString(sLocation, iPos, iCount));

        iPos = FindSubString(sLocation, "#POSITION_Z#") + 12;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fZ = StringToFloat(GetSubString(sLocation, iPos, iCount));

        vPosition = Vector(fX, fY, fZ);

        iPos = FindSubString(sLocation, "#ORIENTATION#") + 13;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fOrientation = StringToFloat(GetSubString(sLocation, iPos, iCount));

        lReturnValue = Location(oArea, vPosition, fOrientation);
    }

    return lReturnValue;
}


void main()
{
  object oPC = GetEnteringObject();
  object oItem = GetItemPossessedBy(oPC, "tag_of_item");
  location lReturnValue;
  string sLocation = GetLocalString(oItem, "Location" + GetPCPlayerName(oPC));
  if (GetIsPC(oPC))
  {
      StringToLocation(sLocation);
      AssignCommand(oPC, ActionJumpToLocation(lReturnValue));
  }
}


Скрипты упростил на максимум что бы было проще разобраться...
Непонемаю почему он не работает, вроде бы все правильно по логике...
dumbo
QUOTE (GoingPro) @ Jul 18 2005, 11:30)
На ОнЕкзит

выражайся точнее. судя по всему, это таки "ОнКлиентЛив" и "ОнКлиентЕнтер"...
что такое Lexicon знаешь? цитата оттуда:
QUOTE
All data that pertains to the player is unavailable (GetPCPlayerName, GetPCPublicCDKey, GetPCIPAddress) and the player has become detatched from the character object, hence GetIsPC returns false. If you want any of this information at time of client leave, you must have already stored this information (on client enter is a good time to do this). Also, due to this, no locals can be stored on the PC at this time.

да и ошибок в скриптах куча. yes.gif особенно затейливо у тебя используются переменные, содержащие в имени ReturnValue. crazy.gif короче, вот твои main'ы:
OnClientLeave:
Neverwinter Script Source
object oPC = GetExitingObject();
  object oItem = GetItemPossessedBy(oPC, "tag_of_item");
  SetLocalString(oItem, "Location",LocationToString(GetLocation(oPC)));

OnClientEnter:
Neverwinter Script Source
object oPC = GetEnteringObject();
  object oItem = GetItemPossessedBy(oPC, "tag_of_item");
  if (oItem == OBJECT_INVALID)
    // если еще нету, создаем.
    CreateItemOnObject("tag_of_item", oPC);
  else
    ActionJumpToLocation(StringToLocation(GetLocalString(oItem, "Location")));

Batkom
Так и не нашел скрипта смерти(ну точно видел, но повторнео найти так и не смог)
написал свой код
Neverwinter Script Source
//ôëàã
    SetCampaignString("deathsystem", "flag" + GetPCPlayerName(oPlayer),"yes");
    //ëîêàöèÿ
    location lDeath = GetLocation(oPlayer);
    SetCampaignLocation("deathsystem", "location" + GetPCPlayerName(oPlayer), lDeath);
    //âàðï â ôóãó
    Raise(oPlayer);
    AssignCommand(oPlayer, ActionJumpToLocation(GetLocation(GetObjectByTag("fugue"))));
     //òðóï
    object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "blueprint032", lDeath);
    object oItemcorpse = CreateItemOnObject("item369", oCorpse, 1);
    //óñòàíîâêà ïåðåìåííûõ
    SetLocalString(oCorpse, "master", GetPCPlayerName(oPlayer));
    SetLocalString(oItemcorpse, "master", GetPCPlayerName(oPlayer));
    //ãîëä
    int iGP = GetGold(oPlayer);
    TakeGoldFromCreature(iGP, oPlayer, TRUE);
    CreateItemOnObject("NW_IT_GOLD001", oCorpse, iGP);
    //ëóò
    int iSlot;
    int iLoot = d10(1);
    switch (iLoot){
    case 1: iSlot = INVENTORY_SLOT_ARMS;         break;
    case 2: iSlot = INVENTORY_SLOT_BELT;         break;
    case 3: iSlot = INVENTORY_SLOT_BOOTS;        break;
    case 4: iSlot = INVENTORY_SLOT_CLOAK;        break;
    case 5: iSlot = INVENTORY_SLOT_HEAD;         break;
    case 6: iSlot = INVENTORY_SLOT_LEFTHAND;     break;
    case 7: iSlot = INVENTORY_SLOT_LEFTRING;     break;
    case 8: iSlot = INVENTORY_SLOT_NECK;         break;
    case 9: iSlot = INVENTORY_SLOT_RIGHTHAND;    break;
    case 10: iSlot = INVENTORY_SLOT_RIGHTRING;   break;
    default: break;   }

    if (d10(1)>5)             {
object oLoot = GetItemInSlot(iSlot, oPlayer);
     CreateItemOnObject(GetResRef(oLoot), oCorpse);
     DestroyObject(oLoot);

Все компилируется, но отказывается работать, создается труп, в нем лежит итим труп и голд, который у игрока не изымается, игрок воскрешается и остается стоять около трупа crazy.gif
-fenix-
Batkom, сорри, там на второй странице - вот код.
QUOTE (Lex @ Jan 27 2005, 22:14)
Скрипт на смерть НПС. НПС исчезает, а на его месте появляется труп на который переносятся все вещи покойного. Сам труп исчезает через 250 секунд.

"low_plc_loot" - резреф трупа в палитре.


Neverwinter Script Source
//::Created by      Лито
//::Modificated by  Lex
void Clear(object oBag = OBJECT_SELF)
{
object oItem = GetFirstItemInInventory(oBag);
while (GetIsObjectValid(oItem))
  {
  DestroyObject(oItem);
  oItem = GetNextItemInInventory(oBag);
  }
DestroyObject(oBag,1.0);
}
void main()
{
string sTemplate = "low_plc_loot";
string sTag = GetTag(OBJECT_SELF);
location lLoc = GetLocation(OBJECT_SELF);
object oloot = CreateObject(OBJECT_TYPE_PLACEABLE, sTemplate, lLoc, TRUE, sTag);
int i = 0;
object oItem = GetFirstItemInInventory(OBJECT_SELF);
while (GetIsObjectValid(oItem))
    {
    if (GetDroppableFlag(oItem))
      CopyObject(oItem,lLoc,oloot);
    DestoyObject(oItem);
    oItem = GetNextItemInInventory(OBJECT_SELF);
    }
oItem = GetItemInSlot(i,OBJECT_SELF);
while (i<14)
    {
    if (GetDroppableFlag(oItem))
      CopyObject(oItem,lLoc,oloot);
    DestoyObject(oItem);
    i++;
    oItem = GetItemInSlot(i,OBJECT_SELF);
    }
AssignCommand(oloot,DelayCommand(250.0,Clear(oloot)));
}
Batkom
Сделал шардовую деф систему: это первая более менее серьезная взаимосвязаная система скриптов которую я написал, потому может не работать(еще не проверял, всевроде компилируется)
Если найдете ошибки, пишите, если все будет работать, выложу в базу скриптов.
Поехали:
Хертбит(работает):
Neverwinter Script Source
//игрока козявит, пока тот окончательно не умрет, козявит в принципе не особо долго, но успеть хелнуть можно
void main()
{
object oPC = GetFirstPC();
effect eDam = EffectDamage(1);
while (GetIsObjectValid(oPC) == TRUE)
{
int iHits = GetCurrentHitPoints(oPC);
if (iHits < 1)
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oPC);
oPC = GetNextPC();
}
}

onDying(совсем просто, тоже работает)
Neverwinter Script Source
//игроку выдается токен винвентарь, ибо случались попытки альта во время даинга, с последующим созданием нового чара и восстановления хит поинтов старому при совпаденииимен(баг игры, практиковался на gem of the north) при ентере игрок умерщвляется за альт
void main()
{

object oPC = GetLastPlayerDying();
CreateItemOnObject("item034", oPC, 1);

}


onPlayerDeath(как не странно, тоже работает)
Neverwinter Script Source
#include "nw_i0_plot"


void Raise(object oPlayer)
{
        effect eVisual = EffectVisualEffect(VFX_IMP_RESTORATION);

        effect eBad = GetFirstEffect(oPlayer);
        ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPlayer);
        ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPlayer)), oPlayer);

        //Search for negative effects
        while(GetIsEffectValid(eBad))
        {
            if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS ||
                GetEffectType(eBad) == EFFECT_TYPE_DEAF ||
                GetEffectType(eBad) == EFFECT_TYPE_PARALYZE ||
                GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL)
                {
                    //Remove effect if it is negative.
                    RemoveEffect(oPlayer, eBad);
                }
            eBad = GetNextEffect(oPlayer);
        }

        SignalEvent(oPlayer, EventSpellCastAt(OBJECT_SELF, SPELL_RESTORATION, FALSE));
        ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oPlayer);
}

void main()
{

    object oPlayer = GetLastPlayerDied();
    string sArea = GetTag(GetArea(oPlayer));
//если наарене, то варпает к флажку arenaspawn
    if (sArea == "arena")
    {

        Raise(oPlayer);

        object oSpawnPoint = GetObjectByTag("arenaspawn");
        AssignCommand(oPlayer, DelayCommand(1.0, JumpToLocation(GetLocation(oSpawnPoint))));

        return;
    }

  
    //Флажок
    SetCampaignString("deathsystem", "flag" + GetPCPlayerName(oPlayer),"yes");
    //Локация
    location lDeath = GetLocation(oPlayer);
    SetCampaignLocation("deathsystem", "location" + GetPCPlayerName(oPlayer), lDeath);
    //Варп в фугу, флажок respawn
    Raise(oPlayer);
    AssignCommand(oPlayer, DelayCommand(1.0, ActionJumpToLocation(GetLocation(GetObjectByTag("respawn")))));
     //Создание трупака и итима трупака в нем
    object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "blueprint032", lDeath);
    object oItemcorpse = CreateItemOnObject("item369", oCorpse, 1);
    //Установка переменных
    SetLocalString(oCorpse, "master", GetPCPlayerName(oPlayer));
    SetLocalString(oItemcorpse, "master", GetPCPlayerName(oPlayer));
    SetLocalString(GetModule(), "hascorpse" + GetPCPlayerName(oPlayer), "yes");
    //Взять золото и положить в труп
    int iGP = GetGold(oPlayer);
    AssignCommand(oPlayer, TakeGoldFromCreature(iGP, oPlayer, TRUE));
    CreateItemOnObject("NW_IT_GOLD001", oCorpse, iGP);
    //Вывалить рандомную вещичку из екиперовки если не повезет
    int iSlot;
    int iLoot = d10(1);
    switch (iLoot){
    case 1: iSlot = INVENTORY_SLOT_ARMS;         break;
    case 2: iSlot = INVENTORY_SLOT_BELT;         break;
    case 3: iSlot = INVENTORY_SLOT_BOOTS;        break;
    case 4: iSlot = INVENTORY_SLOT_CLOAK;        break;
    case 5: iSlot = INVENTORY_SLOT_HEAD;         break;
    case 6: iSlot = INVENTORY_SLOT_LEFTHAND;     break;
    case 7: iSlot = INVENTORY_SLOT_LEFTRING;     break;
    case 8: iSlot = INVENTORY_SLOT_NECK;         break;
    case 9: iSlot = INVENTORY_SLOT_RIGHTHAND;    break;
    case 10: iSlot = INVENTORY_SLOT_RIGHTRING;   break;
    default: break;   }

    if (d10(1)>5)             {
object oLoot = GetItemInSlot(iSlot, oPlayer);
     CreateItemOnObject(GetResRef(oLoot), oCorpse);
     DestroyObject(oLoot);
     }}

OnEnter в фуге
Neverwinter Script Source
void main()
{
object oPC = GetEnteringObject();
if(GetIsPC(oPC))
{
//превращаем игрока в духа
effect eGhost = EffectPolymorph(POLYMORPH_TYPE_SPECTRE, TRUE);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oPC);
//отбираем токен если он есть
object oItem = GetItemPossessedBy(oPC, "deathtoken");
if (GetIsObjectValid(oItem)) DestroyObject(oItem);
}
}


на OnExit в фуге
Neverwinter Script Source
void main()
{
object oPC = GetExitingObject();
effect eEf = GetFirstEffect(oPC);
//снимаем полиморф а заодно и все остальное
while (GetIsEffectValid(eEf))
{
RemoveEffect(oPC, eEf);
eEf = GetNextEffect(oPC);
}
//ищем труп с запомненойлокации и дестроим трупак в инвентаре пласибла, а потом сам пласибл, по умолчанию лут выпадает в виде мешочка
location lCorpse = GetCampaignLocation("deathsystem", "location" + GetPCPlayerName(oPC));
object oCorpse = GetNearestObjectToLocation(OBJECT_TYPE_PLACEABLE, lCorpse, 1);
if (GetTag(oCorpse) == "playercorpse")
    {
    object oItemcorpse = GetFirstItemInInventory(oCorpse);
    while(GetIsObjectValid(oItemcorpse))
        {
        if(GetTag(oItemcorpse) == "corpseitem") DestroyObject(oItemcorpse);
        oItemcorpse = GetNextItemInInventory(oCorpse);
        }
    }
    DelayCommand(1.0, DestroyObject(oCorpse));
//ставим флажок в выключеное состояние
SetCampaignString("deathsystem", "flag" + GetPCPlayerName(oPC),"no");
//говорим, что больше у игрока нет трупа
SetLocalString(GetModule(), "hascorpse" + GetPCPlayerName(oPC), "no");

на onenter в модуль
Neverwinter Script Source
void main()
{
//проверяем альтнулся ли игрок, если да, умерщвляем
object oPC = GetEnteringObject();
if (HasItem(oPC, "deathtocken"))
{
effect death = EffectDeath(TRUE);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, death, oPC);
}
//проверяем флажок и наличие у игрока трупа(в теории локальные переменные после рестарта обнуляются)
if((GetCampaignString("deathsystem", "flag" + GetPCPlayerName(oPC)) == "yes")&&(GetLocalString(GetModule(), "hascorpse" + GetPCPlayerName(oPC))!="yes"))
{
//летим в фугу
AssignCommand(oPC, DelayCommand(1.0, ActionJumpToLocation(GetLocation(GetObjectByTag("respawn")))));
    //создаем трупак и итем трупак
    location lDeath = GetCampaignLocation("deathsystem", "location" + GetPCPlayerName(oPC));
    object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "blueprint032", lDeath);
    object oItemcorpse = CreateItemOnObject("item369", oCorpse, 1);
    //показываем кто хозяин всего этого великолепия
    SetLocalString(oCorpse, "master", GetPCPlayerName(oPC));
    SetLocalString(oItemcorpse, "master", GetPCPlayerName(oPC));
}
}

при открытии инвентаря трупа
Neverwinter Script Source
void main()
{
string sMaster = GetLocalString(OBJECT_SELF, "master");
SpeakString("Здесь покоится " + sMaster, TALKVOLUME_TALK);
}

на закрытие инвентаря трупа
Neverwinter Script Source
void main()
{
//проверяем инвентарь трупа, если итем труп есть, дестроим плесибл труп
int i = 0;
object oItemcorpse = GetFirstItemInInventory(OBJECT_SELF);
while (GetIsObjectValid(oItemcorpse))
    {
    if(GetTag(oItemcorpse) == "corpseitem") i=1;
    oItemcorpse = GetNextItemInInventory(OBJECT_SELF);
    }
    if(i=0) DestroyObject(OBJECT_SELF);
}

Ну помоему стандартный скрипт на OnActivateItem
Neverwinter Script Source
void main()
{
    ExecuteScript(GetTag(GetItemActivated()), OBJECT_SELF);
}

Предмет трупак имеет свойство ыть использованным один раз скрипт называется в честь тега предмета а именно corpseitem
Neverwinter Script Source
void main()
{
//если не было рестарта, то происходит уже выше описанная процедура создания трупа, если был, ничего не происходит и труп просто исчезает, нужно бежать за нормальным
location lPlace = GetItemActivatedTargetLocation();
string sMaster = GetLocalString(GetItemActivated(), "master");
if (sMaster != "")
    {
    object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "blueprint032", lPlace);
    object oItemcorpse = CreateItemOnObject("item369", oCorpse, 1);
    SetLocalString(oCorpse, "master", sMaster);
    SetLocalString(oItemcorpse, "master", sMaster);
    }
}

Кусок райздеда(nw_s0_raisdead)
Neverwinter Script Source
object oTarget = GetSpellTargetObject();
    string sMaster = GetLocalString(oTarget, "master");
if ((sMaster != "")&& (GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE))
    {
    object oRaise = GetFirstPC();
    while(GetIsObjectValid(oRaise))
        {
        if(GetPCPlayerName(oRaise) == sMaster)
            {
            AssignCommand(oRaise, ActionJumpToLocation(GetLocation(oTarget)));
            DelayCommand(1.0, DestroyObject(oTarget));
            effect eDamage = EffectDamage(GetCurrentHitPoints(oRaise)-1);
            ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oRaise);
            }
          object oRaise = GetNextPC();
        }
    }

Кусок ресуректа(nw_s0_resserec)
Neverwinter Script Source
object oTarget = GetSpellTargetObject();
    string sMaster = GetLocalString(oTarget, "master");
if ((sMaster != "")&& (GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE))
    {
    object oRaise = GetFirstPC();
    while(GetIsObjectValid(oRaise))
        {
        if(GetPCPlayerName(oRaise) == sMaster)
            {
            AssignCommand(oRaise, ActionJumpToLocation(GetLocation(oTarget)));
            DelayCommand(1.0, DestroyObject(oTarget));
            }
          object oRaise = GetNextPC();
        }
    }


Вот собственно и все, надеюсь ничего не пропустил.
Не судите строго, не идеально, зато сам biggrin.gif .
dumbo
Batkom, тут пока негде искать ошибки. советую таки не изобретать велосипед, а вопользоватся готовыми(которые, правда, порой оказываются инвалидными колясками): идешь сюда вводишь в поле title слово death и жмешь enter.
Batkom
сорри за то, что было сначала, теперь все полностью
Добавлено в [mergetime]1121767396[/mergetime]
тестинг показал, что при выходе из игры попутно выполняется скрипт выходаиз фуги....это не хорошо, можно ли сделать из него инклуд? (я правда никогда инклуды не делал)
Добавлено в [mergetime]1121773445[/mergetime]
игрок не воскрешается unsure.gif
пишет, что ошибка скрипта реса, слишком много инструкций

Добавлено в [mergetime]1121777505[/mergetime]
не работают флажки, что не делай, игрок либо все время в фуге, либо все время живой при перезаходе и рестарте
zmey
Люди! Мне нужна такая хреновина: Например, с моим персом идет напарник. Мне надо, чтобы в определенном месте он остановился, и сказав типа "Я дальше не пойду" выбыл из компаниии уже НЕ ПРИСОЕДИНЯЛСЯ НИКОГДА.

и ещё: как сделать, чтобы непись после диалога ушёл В ДРУГУЮ ЛОКАЦИЮ, НЕ СМЕЖНУЮ С ИСХОДНОЙ?

......(я маг начинающий, в скриптах разбираюсь кое-как) заранее спасибо crazy.gif
-fenix-
zmey, есть функция
Neverwinter Script Source
void RemoveHenchman(object oMaster, object oHenchman=OBJECT_SELF)

где
oMaster - это тот от кого уходит хенчмен
oHenchman - это хенчмен, каторый уходит

То, что ты хочешь можно сделать с помощью тригера и скрипта на нем проверяющего кто наступил. Рисуешь тригер и на ОнЭнтер ставишь скрипт
Neverwinter Script Source
void main()
{
object oMaster = GetEnteringObject();
object oHenchman = GetHenchman(oMaster);

if (GetIsPC (oMaster) && !GetLocalInt(OBJECT_SELF, "TRIGER") == 1)
  {
  AssignCommand(oHenchman, ActionSpeakString("Я дальше не пойду"));
  RemoveHenchman(oMaster, oHenchman);
  SetLocalInt(OBJECT_SELF, "TRIGER", 1);
  SetLocalInt(oHenchman, "TRUS", 1); // устанавливаем локалку, а на ветке   
  // диалога, где хенча можно обратно взять, ставим проверку на эту локалку
  }
}

QUOTE (zmey @ Jul 21 2005, 11:01)
как сделать, чтобы непись после диалога ушёл В ДРУГУЮ ЛОКАЦИЮ, НЕ СМЕЖНУЮ С ИСХОДНОЙ?

Вот функция

Neverwinter Script Source
void ActionMoveToLocation(location lDestination, int bRun=FALSE)
// location lDestination - задается сама локация, куда идти
// int bRun - собственно TRUE включает бег, FALSE отключает бег...

С помощью нее кидаешь непися куда хочешь.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2025 Invision Power Services, Inc.