Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

 Правила этого форума ПРАВИЛА РАЗДЕЛА
147 страниц V  « < 53 54 55 56 57 > »   
Ответить в эту темуОткрыть новую тему
> Скрипты, Все вопросы и ответы по скриптам
Aiwan
сообщение Jul 6 2005, 07:54
Сообщение #1351


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



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);
            }
}

Не притендую на работостпособность кода. Пишгу на форуме. Потести сам ;)
Потом попросту, сделай его не плотовым. Удали и все дела.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
dumbo
сообщение Jul 6 2005, 08:08
Сообщение #1352


Level 9
Иконки Групп

Класс: Фея
Характер: Chaotic Evil
Раса: Тварь
NWN: Скриптинг [PW]



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

насчет противодействия смене оружия ничего не слышал, хотя сам в свое время заметил, что не только количество атак за раунд повышается, но и, похоже, пересчитываются шансы попадания. понимаю, что по идее там обычный рандом должен быть, но вот мне показалось, что попадает чаще, если "передергивать" оружие... :xz:
если твой скрипт пашет, то и хорошо ;) если только подоптимизировать его может быть немного стоит - сложилось впечатление, что это можно сделать, хотя и не всматривался... :crazy:
Добавлено в [mergetime]1120627258[/mergetime]
да, стоит добавить, что сказанное о полиморфе действительно для версии 1.65, потому как в предыдущих версиях он сильно баговал, и как там работает этот скрипт одному биовару известно...
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
-fenix-
сообщение Jul 6 2005, 09:58
Сообщение #1353


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [Sn]



Вот кутсценка
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
сообщение Jul 6 2005, 18:55
Сообщение #1354


Level 9
Иконки Групп

Класс: Фея
Характер: Chaotic Evil
Раса: Тварь
NWN: Скриптинг [PW]



QUOTE (-fenix- @ Jul 6 2005, 10:58)
Neverwinter Script Source
object oBarmen = GetObjectByTag("OBJECT_SELF");

это что за...?! :this:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
-fenix-
сообщение Jul 6 2005, 20:31
Сообщение #1355


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [Sn]



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

Не знаю! Кот на клаве полежал :oops: :)

Отлично, машутся, только каряво - это выглядет, как тырканье, дерганье, но уж точно не как драка. Так это и должно выглядеть?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 6 2005, 20:46
Сообщение #1356


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



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-, забавный у тебя Бармен :) Не стоит вешать такие тэги на Барменов, во-первых, это некрасиво, во-вторых, нету шаблона названий. У меня например есть разделение по названиям. Скрипты начинаются: ahs_имя; тэги НПС: npc_имя; монстры: am_bst_имя и т.д.

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

Neverwinter Script Source
object oBarmen = OBJECT_SELF;

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

Сообщение отредактировал Zirrex - Jul 6 2005, 20:53
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Мефистофель
сообщение Jul 6 2005, 20:49
Сообщение #1357


Level 6
Иконки Групп

Класс: Страж Тьмы
Характер: Lawful Good
Раса: Баатезу



Скажите пожалуйста, мне нужно организовать большую бойню, но напихать кучу НПК враждебных и Дружественных, Имхо глупо, движок не позволит,
дак вот мне хотелось бы чтобы было две стороны ну тоесть хорошая и плохая, и они дрались, ну война короче, дык вот. как сделать скрипт чтобы например злобные появлялись, примерно по 5-10 человек с разных точек карты и бежали уничтожать базу хороших.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 6 2005, 20:58
Сообщение #1358


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



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

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

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

Neverwinter Script Source
DelayCommand(6.0, WalkWayPoints());
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
-fenix-
сообщение Jul 6 2005, 23:03
Сообщение #1359


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [Sn]



Zirrex, с разделениями все ясно, это у меня левый скрипт - мой 2 мультик, на катором я решил испытать битву.

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

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

Они полюбому кревляются, хоть интелект обоим повышай, хоть что делай (остальные способы тупые и делались мной от безисходности). Значит, чтоб они не дергались мне нужно на другую версию перейти?
Ты делал кутсцены с потычками, мож простенькую кинешь мне в ПМ. :)

Сообщение отредактировал -fenix- - Jul 7 2005, 00:19
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
dumbo
сообщение Jul 6 2005, 23:24
Сообщение #1360


Level 9
Иконки Групп

Класс: Фея
Характер: Chaotic Evil
Раса: Тварь
NWN: Скриптинг [PW]



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:
я не просто так упомянул версию - какая версия у тебя?
перечитай еще раз мой пост.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 6 2005, 23:43
Сообщение #1361


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



dumbo, так как работаю с шардом, то 1.65. Иначе быть просто и не может. В скором времени перейдем на 1.66, но подобный баг там все равно не исправлен. Ладно, все отговорки. Основную идею я понял, тем более этим скриптом пользовался уже.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jul 7 2005, 00:22
Сообщение #1362


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Zirrex не работал с полимерфами, к тому же ты ж просил найи способы снять эффекты... =) звиняй!
Если ты говоришь что все нормально становится после сна или отдыха, то воткни на перезаход проверку, если в инвентаре контейнер полимерфа с тонной иммунов, раскорячь игрока на небольшой перекур. Вообще спроси лучше шардовиков. Им наверное тоже приходилось сталкиваться.

Мефистофель 5-10 это уже много. Вернее 5 еще ничего, но 10 нападающих... :crazy:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Мефистофель
сообщение Jul 7 2005, 00:29
Сообщение #1363


Level 6
Иконки Групп

Класс: Страж Тьмы
Характер: Lawful Good
Раса: Баатезу



"Спрошу" А скрипт должен вроде так делатся. Создать персов с Рест Рефом, Добрых и плохих, далее приказать им джампится на точки! а как сделать чтоб они моявлялись каждые 5 минут например?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
dumbo
сообщение Jul 7 2005, 00:58
Сообщение #1364


Level 9
Иконки Групп

Класс: Фея
Характер: Chaotic Evil
Раса: Тварь
NWN: Скриптинг [PW]



Zirrex
если уж совсем ничего не поможет(что странно - у меня все пашет как часы), то убивай полиморфера на входе! :DB: запомни его состояние, убивай, оживляй... ;)
Добавлено в [mergetime]1120687397[/mergetime]
Мефистофель
твои словесные выкладки сюжета настолько неконкретны, что смысла не имеют - их можно рассматривать только как "стон", провоцирующий на написание вместо тебя этого скрипта. ты сначала напиши что-то, а потом уже вопросы задавай. "каждые 5 минут" - либо декрементный счетчик хертбитов (5*60 / 6 = 50), либо DelayCommand(300.0, ...);
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 7 2005, 09:03
Сообщение #1365


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



-fenix-, у тебя чистый Соу, даже нету Хоту, причем сам Соу можно было бы обновить и до более высшей версии, например 1.65. Вообще, я тебе советую установить Хоту и посмотреть его одиночное прохождение. Почти в самом начале есть стычка между Дроу и остальными. Они не дерутся до потери пульса, обмениваются парой ударов, заклинаний, и умирают те, в кого это попадает. Ролики должны показывать завязку, а не целую битву, длинною в бесконечные раунды.

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

dumbo, попробую, правда если его убить, то запустится скрипт смерти, который создает тело и переносит персонажа в фугу. Хотя там можно сделать мелкое условие, если входящий имеет полиморф, то его не проверять, а просто оживлять.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
dumbo
сообщение Jul 7 2005, 09:45
Сообщение #1366


Level 9
Иконки Групп

Класс: Фея
Характер: Chaotic Evil
Раса: Тварь
NWN: Скриптинг [PW]



Zirrex, вешай локалку еще при убиении и проверяй ее в ondeath - зачем плодить циклические проверки на полиморф?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
-fenix-
сообщение Jul 7 2005, 11:26
Сообщение #1367


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [Sn]



Zirrex, что бы обновиться до 1.65 нужно качать 70 метров, пока я это не могу :( . А Хоту и ПЛ я пытаюся щаз найти и купить.

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


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

Сообщение отредактировал -fenix- - Jul 7 2005, 17:16
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 7 2005, 19:09
Сообщение #1368


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



-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
сообщение Jul 8 2005, 07:18
Сообщение #1369


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Zirrex выложи пожалуйста скрипт с описанием в базе скриптов этого форума. И укажи версию и прочее.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 9 2005, 14:26
Сообщение #1370


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



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

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

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

Вот я и думаю, каждый игрок на шард входит 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);
}


Сообщение отредактировал Zirrex - Jul 9 2005, 14:38
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
dumbo
сообщение Jul 11 2005, 12:23
Сообщение #1371


Level 9
Иконки Групп

Класс: Фея
Характер: Chaotic Evil
Раса: Тварь
NWN: Скриптинг [PW]



QUOTE (Zirrex @ Jul 9 2005, 15:26)
Гм... сейчас протестировал без удаления невидимых предметов, все снимается
то, что тебе предложили сделать в самом начале... :yes:
при сохранении для избежания глюков(хе-хе) биовары снимают полиморф, сэйвят, и надевают обратно - это было наиболее простое решение для лечения глюка, когда эффекты при сохранении переносились на самого игрока. :swoon: если используется своя система автосохранения(скрипты), то лучше вообще не сохранять полиморфов. если у тебя товарищ гибнет, то либо вы где-то намудрили с восстановлением актуальных на момент выхода хитов, либо полиморф(что сомнительно, этот баг биовары исправили довольно давно, вроде).
"скрипта отмены полиморфа" нет - это движковое.
так и не понял твои выкладки про "задержки". время входа игрока если и меняется, то очень незначительно - событие OnClientEnter происходит где-то в самом начале загрузки локации. работа правильных скриптов никогда не зависит от всяких "задержек"...

GetStandardFactionReputation дает тебе отношение стандартной фракции к фракции объекта, т.е. в твоем случае ты выясняешь отношение дефендеров к перечисляемым объектам. а дефендеры, между прочим, очень уважают (100) и коммонеров и мерчантов, ну и себя, любимых, конечно тоже... мало того, ты проверяешь не значение функции, а отличие оного от 0... :swoon:
короче, в данном случае тебе нужно пользоваться GetFactionEqual:
Neverwinter Script Source
object oDefender = GetObjectByTag("tag kakogo-libo defendera");
...
if (GetFactionEqual(oDefender, oTarget))
{
  // oTarget тоже дефендер
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jul 11 2005, 14:32
Сообщение #1372


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



У тебя 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
сообщение Jul 12 2005, 09:28
Сообщение #1373


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



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".

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

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

И вот еще такой вопрос, чуть не забыл написать, если выполняется ряд команд, например создается копия тела персонажа, но создается только лишь потому, что есть цель, но если цель исчезает, то происходит переполнение стека этими командами, ведь они уже запущены, и в итоге ошибка по стеку. Я и подумал, можно ли как-то очистить стек, если цель неожиданно исчезает, но команды уже запустились. У меня они так запускаются в момент смерти, и через 7 секунд создают на земле копию тела персонажа, а потом оригинального персонажа переносят в фугу.

Сообщение отредактировал Zirrex - Jul 12 2005, 09:35
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jul 12 2005, 18:10
Сообщение #1374


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



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
сообщение Jul 12 2005, 21:08
Сообщение #1375


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



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

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

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

Описание.

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

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

Сообщение отредактировал Zirrex - Jul 12 2005, 21:13
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

147 страниц V  « < 53 54 55 56 57 > » 
Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 29th April 2025 - 17:02