Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > 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
Zirrex
azathoth, да, я думал про такой вариант, тем более, что он работает отлично, но что случилось с нашим циклом, вот что я хотел узнать. Ведь работал он раньше правильно, теперь же нет.

Aiwan, может быть оно и так, только не для варианта с циклом. Потом, если делать задержку на действие, то это лишит код цикла, и придется все 13 вещей, если они есть, перечислить в одинаковом коде, только каждая строчка будет выполняться с некоторой задержкой. Что, согласись, все же не очень здорово, потому что аналогичную операцию может выполнить и цикл, если бы не одно но. Ладно, если иных вариантов нету, я остановлюсь на своем, потому что он работает нормально.

Вообще странно, если максимально действий может быть 75, то куда же они деваются, или просто не успевают выполняться?
virusman
QUOTE(Dik Morris @ Jul 12 2006, 09:36) [snapback]87631[/snapback]

Читать эту ссылку.
От себя, как известно такие свойства появляются на эпическом уровне, у определенных классов, (например, светящиеся глаза, у монаха) значит попробуй добавить NPC несколько лишних уровней.
Ссылка совсем не в тему. Там обсуждение читов, а не скриптов.
Крылья: SetCreatureWingType
Хвост: SetCreatureTailType
Рука/нога/голова/всё остальное: SetCreatureBodyPart
Работает только в 1.67.
Aiwan
2 Zirrex. Они не успевают выполниться.
Лично я копирую все шмотки в сундук и оттуда назад. Все остальное геммор, так как многие события вшиты в движок. Я это говорю к тому что столкнулся с проблемой одеть-снять проклятые вещи в модуле.
gennady
Zirrex, функции одевания и снятия шмоток сами по себе длинные, наверно в движок вшита сопутствующая анимация. Можно попробовать блокировать стек, чтобы исключить возможность сбоя кода. Но все же лучше через Copy и Destroy. Эти функции более быстрые, и можно использовать даже в бою. А вот одеть в бою шмотку – большой геморрой!
NSS
void main()
{
object oPC = GetFirstPC();
int i;
object oItem = GetItemInSlot(i, oPC);

for (i = 0; i < NUM_INVENTORY_SLOTS; i++)
{
  oItem = GetItemInSlot(i, oPC);

  if (GetIsObjectValid(oItem))
     {
      CopyItem(oItem, oPC);
      DestroyObject(oItem);
     }
}
}
  // Снимаем все шмотки с героя ему в рюкзак
Zirrex
gennady, в такой цепочке есть один недостаток, если скрипт начнет выполняться, а игрок в этот момент покинет сервер, может произойти известная неприятность, а именно, размножение вещей. Мой вариант хоть и не идеален, потому что заставляет выполняться цикл 4 раза, но, если его немного модифицировать, добавив проверку, а есть ли вообще цель, с которой надо работать, то цикл лишь остановится на полпути, когда цель исчезнет. Вещи же останутся либо на персонаже, либо в инвентаре, но не размножатся.

Чтобы правильно работала такая цепочка, как копирование и удаление, необходимо делать метки на удаляемые вещи, и в момент входа на сервер, проверять, есть ли у персонажа подобные вещи. Если есть, удалять.

Скрипт можно укоротить:

NSS
void main()
{
    object oPC = // тому-то, GetFirstPC не подходит, потому что модуль мультиплейерный
    int i;
    object oItem;

//    object oItem = GetItemInSlot(i, oPC); // лишняя строчка

    for (i = 0; i < 14; i++) // невидимые объекты нам проверять не нужно, поэтому граница на 14 вещи.
    {
        oItem = GetItemInSlot(i, oPC);

        if (GetIsObjectValid(oItem))
        {
            CopyItem(oItem, oPC);
            DestroyObject(oItem);
        }
    }
}


Aiwan, осуществляешь копирование через сундук, чтобы персонажу не выводились надписи, что вещь потеряна? Тоже вариант.
OxCom
Опять же доброго времени суток. Бился я с SQLGetData - так ничего и не получилось. Скрипт все время выдает "пусто", что я не так сделал? Почему скрипт не работает?
NSS
#include "aps_include"

void main()
{
    object oPC = GetLastUsedBy();
    string sPlayer=SQLEncodeSpecialChars(GetPCPlayerName(oPC));
    string sChar=SQLEncodeSpecialChars(GetName(oPC));
    string sSQL="SELECT * FROM `nwn_stast` WHERE playername = '"+sPlayer+"' AND charname = '"+sChar+"'";
    SQLExecDirect(sSQL);
    string sName = SQLGetData(0);
    string sName1 = SQLGetData(1);
if(SQLFetch())
{
    if (sName == sPlayer)
    {
    SendMessageToPC(oPC, "sName 0");
    }
        if (sName1 == sPlayer)
    {
    SendMessageToPC(oPC, "sName 1");
    }
} else {SendMessageToPC(oPC, "Пусто");}

}
virusman
QUOTE(OxCom @ Jul 12 2006, 18:01) [snapback]87663[/snapback]

Опять же доброго времени суток. Бился я с SQLGetData - так ничего и не получилось. Скрипт все время выдает "пусто", что я не так сделал? Почему скрипт не работает?
NSS
#include "aps_include"

void main()
{
    object oPC = GetLastUsedBy();
    string sPlayer=SQLEncodeSpecialChars(GetPCPlayerName(oPC));
    string sChar=SQLEncodeSpecialChars(GetName(oPC));
    string sSQL="SELECT * FROM `nwn_stast` WHERE playername = '"+sPlayer+"' AND charname = '"+sChar+"'";
    SQLExecDirect(sSQL);
    string sName = SQLGetData(0);
    string sName1 = SQLGetData(1);
if(SQLFetch())
{
    if (sName == sPlayer)
    {
    SendMessageToPC(oPC, "sName 0");
    }
        if (sName1 == sPlayer)
    {
    SendMessageToPC(oPC, "sName 1");
    }
} else {SendMessageToPC(oPC, "Пусто");}

}


1. Посмотри лог nwnx_odbc.
2. Повтори тот же самый запрос вне НВНа.
OxCom
В логе только запрос. Получения инфы там не записано. Вне НВНа все работает.
virusman
QUOTE(OxCom @ Jul 12 2006, 19:36) [snapback]87668[/snapback]

В логе только запрос. Получения инфы там не записано. Вне НВНа все работает.

Поставь в nwnx.ini debuglevel в разделе этого плагина побольше.
NWNX инициализируется в модуле?
OxCom
Вот жеж я балда. самое главное и забыл smile.gif) SQLInit();
Спасибо.
Артём
Мне нужно чтобы после смерти всех врагов в области заработал нужный мне скрипт.
Может, кто выложите, если нетрудно?

Waromon
После убийства 10 врагов, открывается нужный скрипт. (Число измени, по желанию)
На onDeath мобов:

NSS
void main()
{
object oKiller = GetLastKiller();

// Проверка, если НПЦ убил игрок, или хенч,
if (GetIsPC(oKiller) || GetIsPC(GetHenchman(oKiller)))
{
if (GetLocalInt(oKiller, "Death_hostile") == 10)
{
ExecuteScript("Название нужного скрипта", Тот кто открывает его);
}
SetLocalInt(oKiller, "Death_hostile", GetLocalInt(oKiller, "Death_hostile")+1);
}
}



ЗЫ: не проверял, но по идеи все должно работать. biggrin.gif
[MoF]Darth_Nick
QUOTE
Мне нужно чтобы после смерти всех врагов в области заработал нужный мне скрипт.

QUOTE
После убийства 10 врагов, открывается нужный скрипт. (Число измени, по желанию)

геморой(а если динамичное число? О_о)..GetFirstObjectInArea,GetNextObjectInArea проще
2_advanced
лучше на он_спавн всех врагов добавлять в какой-то список, и потом проверять их существование..
а не GetFirstObjectInArea ./ GetObjectByTag / ets
особенно для PW o_O загрузка проца прыгает до <цензура> shok.gif
kreon
на onspawn мобов в локе
NSS
object oArea = GetArea(OBJECT_SELF);
SetLocalInt(oArea, "mob_count", GetLocalInt(oArea, "mob_count")+1);

на ondeath моба
NSS
object oArea = GetArea(OBJECT_SELF);
int mob_count = GetLocalInt(oArea, "mob_count")-1; // 1 was killed now
SetLocalInt(oArea, "mob_count", mob_count);
if(mob_count <= 0) SendMessageToPC(GetLastDamager(OBJECT_SELF), "You killed all!");

xHageN
Всем доброго времени суток! Делая свой модуль сегодня, я столкнулся с проблемкой..
В самом модуле у меня идёт стандартное пенальти на экспу и деньги при смерти, но мне нужно, чтоб в определеннойй арее за смерть ничего не снимали. Сколько не парился, никак не получилось, чар респавнится с потерей опыта и денег и в стандартном месте (мне нужно, чтоб он воскресал в той арее где смерть не дает пенальти). По сему решил я к вам обратиться, может наставите на путь истинный declare.gif )))

Вот собственно финальный вариант того, что у меня получилось (вернее не получилось!)

NSS
void main()
{
    object oRespawner = GetLastRespawnButtonPresser();
    object oSpawnPoint = GetObjectByTag("portal");
    object oSpawnPoint2 = GetObjectByTag("soznanie_portal");
    object oArea = GetArea(oSpawnPoint2);


  if  (GetArea(oRespawner) == oArea)
  {
    AssignCommand(oRespawner,JumpToLocation(GetLocation(oSpawnPoint2)));
    ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oRespawner);
    ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oRespawner)), oRespawner);
    RemoveEffect(oRespawner, EffectDeath());
  }
    else;
    int nXP = GetXP(oRespawner);
    int nPenalty = 50 * GetHitDice(oRespawner);
    int nHD = GetHitDice(oRespawner);
    int nMin = ((nHD * (nHD - 1)) / 2) * 1000;
    int nNewXP = nXP - nPenalty;
    if (nNewXP < nMin)
      nNewXP = nMin;
    SetXP(oRespawner, nNewXP);
    int nGoldToTake =    FloatToInt(0.10 * GetGold(oRespawner));
    if (nGoldToTake > 10000)
    {
        nGoldToTake = 10000;
    }
    AssignCommand(oRespawner,JumpToLocation(GetLocation(oSpawnPoint)));
    AssignCommand(oRespawner, TakeGoldFromCreature(nGoldToTake, oRespawner, TRUE));
    DelayCommand(4.0, FloatingTextStrRefOnCreature(58299, oRespawner, FALSE));
    DelayCommand(4.8, FloatingTextStrRefOnCreature(58300, oRespawner, FALSE));

    ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oRespawner);
    ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oRespawner)), oRespawner);
    RemoveEffect(oRespawner, EffectDeath());
}
dumbo
NSS
RemoveEffect(oRespawner, EffectDeath());
  }
    else;
//^i-m_so_happy.gif^ мдя

обрами скобочками блок скрипта с выдачей пенальти и убери ";" после else.
либо в первом блоке после RemoveEffect(..) поставь "return;".


морду какую-то самодовольную вставило вместо пары галочек(^)...
Waromon
Первое что увидал:

NSS
else;


Делай так:

NSS
else
{
// Выражение
}


dumbo, пардон не заметил. pleasantry.gif biggrin.gif
kreon
NSS
RemoveEffect(oRespawner, EffectDeath());
- лишнее
а так - вместо елсе лучше поставь
NSS
if  (GetArea(oRespawner) == oArea) {
...
return;
}
// тут было else;
xHageN
От спасибо вам, все работает! Ещё один маленький шажок для меня в познаниях скриптинга))

А, вот ещё никак не могу разобраться:
Скрипт на ОнДэф одного перца. Когда он умирает, должны исчезнуть плэйсеблы лучи (иметируют своего рода клетку) и ловушка. Так же другой перец, находящийся в самой как бы клетке должен подбежать ко мне и сдестроиться.
Из этого всего почему-то работает только ActionForceMoveToObject и DestroyObject oRad.. Ну и переменная начисляется.

NSS
void main()
{
object oKiller = GetLastKiller();
object oRays = GetObjectByTag("gore_ray");
object oTrap = GetObjectByTag("gore_trap");
object oRad = GetObjectByTag("radost");

AssignCommand(oRays, ActionDoCommand(DestroyObject(oRays)));
AssignCommand(oTrap, ActionDoCommand(DestroyObject(oTrap)));
AssignCommand(oRad, ActionForceMoveToObject(oKiller, TRUE, 1.0, 5.0));
AssignCommand(oRad, ActionDoCommand(DestroyObject(oRad)));
DelayCommand(0.5, SetCommandable(FALSE, oRad));
DelayCommand(0.5, SetCommandable(FALSE, oRays));
DelayCommand(0.5, SetCommandable(FALSE, oTrap));
SetLocalInt(oKiller, "cleanmind", GetLocalInt(oKiller, "cleanmind") + 1);
}
kreon
NSS
void main() {
object oKiller = GetLastKiller();
object oRays = GetObjectByTag("gore_ray");
object oTrap = GetObjectByTag("gore_trap");
object oRad = GetObjectByTag("radost");
DestroyObject(oRays);
DestroyObject(oTrap);
AssignCommand(oRad, ActionForceMoveToObject(oKiller, TRUE, 1.0, 5.0));
DelayCommand(10.0f, DestroyObject(oRad)); // 10.0 заменить на время, за которое он добегает.
SetLocalInt(oKiller, "cleanmind", GetLocalInt(oKiller, "cleanmind") + 1);
}

P.S.
NSS
AssignCommand(oRays, ActionDoCommand(DestroyObject(oRays)));
- не надо. Достаточно
NSS
DestroyObject(oRays);

Waromon
[quote name='kreon' date='Aug 4 2006, 15:19' post='89089']
NSS
DelayCommand(10.0f, DestroyObject(oRad)); // 10.0 заменить на время, за которое он добегает.


Команда идет из стека трупа, то бишь, ничего не получится. Время нужно указывать в DestroyObject(oRad, 10.0f)
Mandrake
NSS
#include "X0_I0_SPELLS"
#include "x2_inc_spellhook"
void main()
{
    object oPC = GetFirstPC();
    int nDamage;
    float fDelay;
    effect eDam;
    string sArea = GetTag(GetArea(oPC));
    effect eVis = EffectVisualEffect(VFX_IMP_FROST_S);
    object oCampfire = GetObjectByTag("CAMPFIRE101");

    if((GetIsDay())== FALSE)
    {
    if ((GetDistanceBetween(oCampfire, oPC))> 2.0)
    {
    if (sArea == "highmounts001" || sArea == "highmounts002" || sArea == "highmounts003"||
        sArea == "capitolofgom" || sArea == "ncapitolspart" || sArea == "narnpass001"
        ||sArea == "iceland001")
    {

    nDamage = Random(15) + 1;


    if(/*Fort Save*/ MySavingThrow(SAVING_THROW_FORT, oPC, 25, SAVING_THROW_TYPE_COLD, OBJECT_SELF, fDelay))
    {
      nDamage = 0;
    }


    eDam = EffectDamage(nDamage, DAMAGE_TYPE_COLD);
    DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oPC));
    //ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oPC, 1.7);

    }
    }
    }
oPC = GetNextPC();
}


Такая ситуация: Когда игрок находится в некоторых особо "холодных локациях" , он должен делать чек на стойкость против холода, или же будет получать урон. Недавно хотел внести проверку, на наличие костра рядом(тогда урон не наносится), но получил следующее. Чек на форту не делается, только с костром, который стоял ближе к игроку, во время его появления на локации, а рядом с другими желаемый результат не происходит. Пробывал через функцию GetNearestObjectByTag(), но результат тот же, подскажите пожалуйста, как научить скрипт брать в расчет и другие костры.

Скрипт стоит на ХБ локации, если что.
kreon
2Waromon: afair, команды создания\уничтожения объектов не идут в стек, как и DelayCommand.
В стек их пихает только AssignCommand. А Delay все равно выполняется после(!) окончания скрипта. Надо проверить будет.
2Mandrake:
NSS
#include "X0_I0_SPELLS"
#include "x2_inc_spellhook"
void DmgColdIfNotNearCampfire(object oPC) {
    object oCamp = GetFirstObjectInShape(SHAPE_SPHERE, 2.0, GetLocation(oPC), FALSE, OBJECT_TYPE_PLACEABLE);
    while(GetIsObjectValid(oCamp)) {
        if(GetTag(oCamp) == "CAMPFIRE101") return;
        oCamp = GetNextObjectInShape(SHAPE_SPHERE, 2.0, GetLocation(oPC), FALSE, OBJECT_TYPE_PLACEABLE);
    }
    int nDamage = Random(15) + 1;
    if(MySavingThrow(SAVING_THROW_FORT, oPC, 25, SAVING_THROW_TYPE_COLD, OBJECT_SELF, 0.0)) nDamage = 0;
    effect eDam = EffectDamage(nDamage, DAMAGE_TYPE_COLD);
    ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oPC);
}
void main() {
object oPC = GetFirstPC();
string sArea = GetTag(GetArea(oPC));
if(!GetIsDay() && (sArea == "highmounts001" || sArea == "highmounts002" || sArea == "highmounts003"||
        sArea == "capitolofgom" || sArea == "ncapitolspart" || sArea == "narnpass001"
        ||sArea == "iceland001")) DmgColdIfNotNearCampfire(oPC);
}
Waromon
QUOTE(kreon @ Aug 4 2006, 16:40) [snapback]89102[/snapback]

2Waromon: afair, команды создания\уничтожения объектов не идут в стек, как и DelayCommand.
В стек их пихает только AssignCommand. А Delay все равно выполняется после(!) окончания скрипта. Надо проверить будет.


Просто, если NPC умрет - то и DelayCommand пропадет вместе с ним, проверь. wink3.gif
По поводу стека ошибся, не так выразился.

QUOTE
Начинающий скриптер.


friends.gif
Mandrake
kreon, большое спасибо thank_you.gif
xHageN
QUOTE(kreon @ Aug 4 2006, 16:19) [snapback]89089[/snapback]

NSS
void main() {
object oKiller = GetLastKiller();
object oRays = GetObjectByTag("gore_ray");
object oTrap = GetObjectByTag("gore_trap");
object oRad = GetObjectByTag("radost");
DestroyObject(oRays);
DestroyObject(oTrap);
AssignCommand(oRad, ActionForceMoveToObject(oKiller, TRUE, 1.0, 5.0));
DelayCommand(10.0f, DestroyObject(oRad)); // 10.0 заменить на время, за которое он добегает.
SetLocalInt(oKiller, "cleanmind", GetLocalInt(oKiller, "cleanmind") + 1);
}

P.S.
NSS
AssignCommand(oRays, ActionDoCommand(DestroyObject(oRays)));
- не надо. Достаточно
NSS
DestroyObject(oRays);




Пробовал.. Таким оброзам лучи не дестроятся и не дестроится oRad. Вобщем я переписал скрипт, остались только эти лучи, незнаю как их заставить исчезнуть.. Может визуальные плэйсеблы не поддаются обычным командам типа дестроя? Или в свойствах их надо поковыряться.. я вот думаю насчет пункта Шум(статик) влияет он на скрипты или нет..
---
Ага, не влияет. Дело в самом обьекте чтоли? Не берёт его ничё... Их захайдить какнить можно?
-fenix-
Хех, распространенная проблема. Убери галку "статик" с объекта и будет счастье. wink3.gif
xHageN
QUOTE(-fenix- @ Aug 4 2006, 19:27) [snapback]89117[/snapback]

Хех, распространенная проблема. Убери галку "статик" с объекта и будет счастье. wink3.gif


Так я в предыдушем посте написал свою мысль про статик... Включал, убирал - не дестоится луч!
-----
Я понял свою ошибку. Действительно, без статика обьект дестроится.. Просто я задал один таг группе лучей и они не исчезали. Попробовал сейчас одному поставить и он исчес. Похоже придется всем этим лучам уникальные теги писать и утолщать скрипт... ё моё nea.gif
dumbo
QUOTE(xHageN @ Aug 4 2006, 19:30) [snapback]89118[/snapback]
Похоже придется всем этим лучам уникальные теги писать и утолщать скрипт... ё моё


wizard.gif
NSS
//--- удалить все объекты с тэгом "gore_ray"
  object oObj;
  int nIdx = 0;
  while (GetIsObjectValid(oObj = GetObjectByTag("gore_ray", nIdx)))
  {
    DestroyObject(oObj);
    nIdx++;
  }
//---
Waromon
Перед основной фун-цией поставь:

NSS
void DestroyRays()
{
int i=0;
object oObject = GetObjectByTag("gore_ray", i);

while (GetIsObjectValid(oObject))
    {
    DestroyObject(oObject);
    ++i;
    oObject = GetObjectByTag("gore_ray", i);
    }
}
xHageN
Эээх, а я уже все по геморному сделал, поторопился видать.. А эти скриптины я на будущее учту declare.gif Спасибо за помощь, столько нового сегодня узнал! yahoo.gif
Noob_scripter
Помогите!

Первое : Обновил игру до версии 1.62. Скачал конвертер MP3 to BMU - запускаю - пишет, что не может запустить, нужен какой-то патч 76. Что странно - до этого я его запускал, потом игру переустановил - и не запускается.

Второе : Как покрасить текст в меню диалога в : Синий, зеленый, красный.
Третье : У меня в редакторе не хватает много фоновых звуков (гроза, ливень и т.д.) Где их можно найти?

Заранее спасибо. Извините, если такие вопросы были - найти на 98 страницах уже ничего невозможно...
Zirrex
Noob_scripter, не 76, а 67. Если быть точным, то 1.67. Обнови игру до версии 1.67, тогда утилита у тебя должна заработать.

В диалоговом редакторе есть токены, которые можно ставить в любой части текста, чтобы выделить его другим цветом (<StartAction><StartHighlight><StartCheck>). Все они закрываются токеном "</Start>".

<StartAction> - красный
<StartHighlight> - синий
<StartCheck> - зеленый

Пример: <StartCheck>Убеждение</Start> Я думаю, что вы все же согласитесь на мое предложение!

А у тебя в каком порядке установлена игра? Есть ли в наличие Sou (первый аддон к игре)?
xHageN
Скажите пожалуйста:

1. Решил в модуле сделать эпизод тюремного заключения. В сявязи с этим появился вопрос - можно ли из
инвентаря перса как бы "скопировать" все шмотки, чтобы при попадании в тюрьму можно было очистить инвентарь, а потом перекинуть все, что было на персе в какойнить сундук (типа покидать в комнату отобранных вещей, чтоб их забрать можно было при побеге))? Если можно, пару команд скрипта. На запоминание вещей и закидвание их в сундук (ну или просто на землю).

2. Хотел еще сделать турнир. Нужно чтобы при смерти перса все начиналось заного. То есть появлялись все мобы, запирались все двери, кароче все приводилось к первоначальному виду. Можно такое провернуть? Если да, то подскажите опять же команды. bb.gif
Waromon
Первый вопрос:

NSS
object oPC = ... // Игрок
object oBox = .... // Сундук

object oItem = GetFirstItemInInventory(oPC);
while (GetIsObjectValid(oItem))
{
   if(GetBaseItemType(oItem) == BASE_ITEM_LARGEBOX)    
   {
     CreateItemOnObject(GetResRef(oItem), oBox, 1);
     DestroyObject(oItem, 0.5);
   }
   else
   {
     CopyItem(oItem, oBox, TRUE);
     DestroyObject(oItem);
   }
oItem = GetNextItemInInventory(oPC);
}

int i=0;
for (i=0; i<14; i++)
{
     CopyItem(GetItemInSlot(i, oPC), oBox, TRUE);
    DestroyObject(GetItemInSlot(i, oPC));
}


Второй,

Гм... Команд то много каких есть, опиши подробнее, и из всего че ты перечислил:

Закрыть двери:
NSS
ActionCloseDoor(object oDoor)
// на замок: SetLocked(object oTarget, int bLocked))



Создать моба:
NSS
object CreateObject(int nObjectType, string sTemplate, location lLocation, int bUseAppearAnimation=FALSE, string sNewTag="")
xHageN
Подробнее:
Начинается турнир. Проходишь одно, задание, второе и тд. Во время турнира тебя убили. появляешься в самом начале турнирной локации и все заного. Тоесть все задания, что пройдены, все убитые мобы и тд, возврашаются к первоночальному виду. То есть чтобы после смерти все пройденное пришлось заного проходить.
Я понимаю, можно сделать так, как ты написал. Но это довольно геморойно, запирать все двери, крейтить мобов.. Вот я и спросил, можно ли как-то, ну незнаю... сохранить чтоли локацию в первозданном виде, чтоб при смерти грузилась она, а не та, где уже что-то успел пройти.

А насчет первого вопроса спасиб большое!
Только есть одно но.
CreateItemOnObject(GetResRef(oItem), oBox, 1); на этой строке редактор ошибку выдает. Как я понял, ему не нравится GetResRef, у меня такой команды в списке редактора нет..
И тоже самое по отношению к команде CopyItem
Waromon
Насчет второго вопроса, у тебя версия игры какая ??? ТОЧНО знаю что в 1.66 ети функции присутствуют. wink3.gif
Тогда, сделаем так:

NSS
object oPC = ...// Игрок
object oBox = ... // Сундук

object oItem = GetFirstItemInInventory(oPC);
while (GetIsObjectValid(oItem))
{
  AssignCommand(oBox, ActionTakeItem(oItem, oPC));

  oItem = GetNextItemInInventory(oPC);
}

int i=0;
for (i=0; i<14; i++)
{
    AssignCommand(oBox, ActionTakeItem(GetItemInSlot(i, oPC), oPC));
}


(да и вообще ниже 1.66 имхо нет смысла чтото делать... Патчись. wink3.gif
Milfes
Waromon, ты забыл в первом случае дестроить обьекты используемые игроком(они появляються в сундуке, но и остаються одеты на игрока) smile.gif

NSS
int i=0;
for (i=0; i<14; i++)
{
    CopyItem(GetItemInSlot(i, oPC), oBox, TRUE);
    DestroyObject(GetItemInSlot(i, oPC));
}


Извиняюсь, сам тоже ошибся. biggrin.gif
Waromon
Функция ActionTakeItem, ЗАБИРАЕТ айтемы, т.е как они могут остатся если их заберут у игрока...? оО crazy.gif

Понял о чем ты - исправил.
Noob_scripter
HELP !

Я сделал диалог и четырех веток. В первой ветке при первом же сообщении говорю ,чтоб дали (set) PC Speaker'у локальную переменную voodoo равное константе 1.

Вторую ветку сказал, чтоб проверили: ifGetLocalInt(GetPCSpeaker() "voodoo", == 1); Return false Return TRUE ,короче использовал скрипты разработчиков прямо в диалоге (галочки ставил - дать переменную, проверить переменную).

В итоге (мой диалог полностью на английском, версия игры 1.67) ничо не работает. Сколько раз к челу не подходи - все равно кидает первую ветку. Что делать? Да еще, у меня пара надписей (записи в журнале, несколько надписей на "знаках" (предметы) они на русском и в игры выглядят как абракадабра, однако например скрип сидения на стуле работает, да и ваще все скрипты компилируются, а вот ета переменная не работает! HELP!!!!
Waromon
QUOTE
Вторую ветку сказал, чтоб проверили: ifGetLocalInt(GetPCSpeaker() "voodoo", == 1); Return false Return TRUE ,


Тут надо наоборот,

NSS
if (GetLocalInt(GetPCSpeaker(), "voodoo")==1)
   return TRUE;
return FALSE;


Кстати, ветки в диалоге нужно распологать в таком порядке,
"2 фраза" - проверка переменной,
"1 фраза" - установка переменной.


QUOTE
Да еще, у меня пара надписей (записи в журнале, несколько надписей на "знаках" (предметы) они на русском и в игры выглядят как абракадабра


А ты не забыл кинуть русские шрифты в папку ovveride ?


ЗЫ: чуть не забыл, скрипты написанные визардом могут не работать из-за наличия русских комментариев, поэтому удали их.
xHageN
QUOTE(Waromon @ Aug 11 2006, 11:25) [snapback]89423[/snapback]

(да и вообще ниже 1.66 имхо нет смысла чтото делать... Патчись. wink3.gif


Нашел. Скачал. Поставил. Теперь не представляю, как без него жил biggrin.gif
Noob_scripter
Все комментарии английские, пробоовал менять местами return FaLse и return TRUE - все равно не работает. Вообщем визардовские скрипты не работают. Где можнео посмотреть пример такого диалога?
Zirrex
Noob_scripter, а в каком порядке размещаешь ветки диалога? Вначале первый ответ НПС, потом второй ответ НПС. Я правильно описываю? Если оно так, то это неверный подход. Ветку, которая проверяется скриптом, необходимо ставить выше ветки диалога, которую произносит НПС при первой встрече. Когда у тебя переменная переключится на 1, то после повторного обращения к НПС будет видна именно та ветка, которая проверяет твою переменную.

Если на всех ветках диалога стоят скрипты, которые проверяют те или иные условия, то они расставляются по приоритету обращения, когда же одна из веток ответа НПС не имеет скриптов вообще, то всегда должна быть ниже всех остальных его ответов.

Чтобы было понятно, и отложилось в голове, представь, что диалог у тебя дерево условий:
NSS
if (voodoo == 2)
{
// то такое-то будет
}
else if (voodoo == 1)
{
// то такое-то будет
}
else
{
// все остальные значения. В нашем случае, первый ответ НПС.
}

Waromon, ты не совсем верно ему объяснил smile.gif Просто есть один нюанс. Как правильно, я описал выше.
Waromon
Мдя... Я ведь говорил - диалог должен строится по такому принципу:

QUOTE
"2 фраза" - проверка переменной
"1 фраза" - установка переменной


Читай: http://www.city-of-masters.ru/forums/index...?showtopic=1752

Zirrex, опередил. pardon.gif

Гммм... Это просто пример. Грубый простой пример. Но РАБОЧИЙ что самое главное.

З.Ы: Noob_scripter, кстати визардские скрипты могут не работать, если строки в диалоге будут состоять из 1 ответа НПЦ, поэтому лучше все делать самому. "Ручками, ручками!" (с)
(просто там локалка вешается на игрока, который в свою очередь определен как GetPCSpeaker)
windhover
Доброго времени суток.
Назрело два вопроса:
1. Можно ли отключить миникарту(или сделать ее "темной") с помощью скриптов, или только редактированием контента?
2. Можно ли плейс статик сделать юзебл и наооборот с помощью скриптов, если да подскажите куда копать?
Спасибо.
Aiwan
1. Нет.
2. Опиши задачу. Нафик такое надо? Можно просто Удалить/Создать. Свойства соотвественно разные.
windhover
QUOTE(Aiwan @ Aug 15 2006, 22:18) [snapback]89697[/snapback]

1. Нет.
2. Опиши задачу. Нафик такое надо? Можно просто Удалить/Создать. Свойства соотвественно разные.


1. Тоесть только hak'ами? Или вообще нельзя? (На Сиале в ДБ карта не отображается)
2. Вопрос отпал.. действительно можно ведь удалить/создать rolleyes.gif
Спасибо.
Zirrex
windhover, карта при этом белого цвета? Если да, то использован набор тайлов "Микросет". Иначе же можно карту затирать постоянно у персонажа, который вошел на локацию. Это делается с помощью функции:

NSS
// Expose/Hide the entire map of oArea for oPlayer.
// - oArea: The area that the map will be exposed/hidden for.
// - oPlayer: The player the map will be exposed/hidden for.
// - bExplored: TRUE/FALSE. Whether the map should be completely explored or hidden.
void ExploreAreaForPlayer(object oArea, object oPlayer, int bExplored=TRUE)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.