Помощь - Поиск - Пользователи - Календарь
Полная версия: База скриптов
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights Aurora Toolset
Страницы: 1, 2, 3
Lex
Сюда выкладывать ваши скрипты и системы скриптов с описанием.
ОБСУЖДЕНИЕ, ВОПРОСЫ И ПРОСЬБЫ О ПОМОЩИ НЕ В ЭТОЙ ТЕМЕ.

ОГЛАВЛЕНИЕ:

-- страница 1 --

* дамаг НПС: Кровь + Вопли
* скрипт смерть: Крики о помощи и смерть
* Фраза при невозможности открыть дверь
* Запрет для всех, кроме игрока покидать локацию
* Создание стены из плейсов
* Субрасы: выдача уникальных вещей
* Дача опыта за обезвреживание и открытие замка
* Скачок времени в разговоре
* Дайсы
* Запираем двери на ночь
* Набор скриптов для AI проверок. Типы оружия, магия и тд.
* Работа с эффектами (скан и удаление)
* Бой с остановкой перед смертью* Отчистка торговцев от лишних вещей
*Работа с цветами
*Кодовая дверь
*Банковская система
*Падежи и работа с текстом
*Работа со свойствами вещей: устранение дисбаланса

-- страница 2 --

*если НПС отойдет от своего POST_-а дальше 15 метров, то появится строка в диалоге
*Отмена Rest через кнопку
*Алкоголь+Отрава. + Шпаргалка Айвана + Болото от Валео
*Что то навроде, как в кино: "Прошло два года..."
* респаунинг NPC по событию их смерти, без использования энкаунтеров
* Когда в городе наступит ночь - зажгуться факелы и будут освещать территорию
* Визуалки при LevelUp согласно элайменту
* Система отдыха от Авадона (в дикой местности)
* Делает из длинной лавки 3-х местный диван
* Скрипты авторегистрации для сервера использующего APS/NWNX 2 + MySQL
* Ловушка от (MoF)Darth_Nick
* Система смерти от Лито
* Запись смерти игрока в БД
* Спаунер/анспаунер для гвардов: выход на патруль утром и уход вечером
* Сервер-статус-чекер с помощью APS/NWNX2 и базы данных MySQL
* Система отдыха от Авадона (в таверне)
* Пара функций для сохранения и восстановления всех свойств предмета
* систему захода игрока на сервер + выдача вещей
* Скрипт на смерть НПС. НПС исчезает, а на его месте появляется труп
* Ведет игрока за НПС по точкам
* Разговор 2 и более НПС меж собой. + взрывоопасные бочки.
* позволяет при наличии надетой брони с определенным ТЕГом ходить во вражественном лагере + два скрипта для запуска диалога в котором участвует НПС которого вы атакуете и диалог начинается с определенного нр у НПС + Запрет выхода из локации монстров за игроком

-- страница 3 --

* Система смерти + Температурный скрипт + тягловые животные + гильдия убийц + система отдыха + скрипт ветра + скрипт осадков
* Спавн монстров + призрак
* защита чаров по CDKey + Скрипт для магазинов + pеализация кольца духа + Расцветка сообщений, выводимых SendMessageToPC() + Простейшая реализация двумерного массива
* управление дверью через рычаг + холодная локация + скрипт капитана (подчиненные отдают честь) + всплывающая строка на триггере
* буква "я" в скриптах (эпоха до патча dumbo) + автопереход на триггере
* дестрой всех вещей игрока + часы + подсчет количества items у объекта
* случайная точка на определенном удалении от цели
* Функция определяет, можно ли надеть указанный армор (по левелу)
* запоминаем время для шардов, чтобы после рестарта выставить правильно
* скрипт для уборщика + определение кол-ва жизней цели в процентах + Скрипт на автооткрывание дверей + код позволяет создать "случайную локацию", как например в БГ + скрипт для переноса всех обьектов
* красивая работа с визуалками и плейсами
* реализация болота + личный код на проверку скилла Persuade
* Скрипт на воскрешение и зомби + скрипт на то чтобы после смерти находится в бессознательном состоянии 10 едениц + телепорт + превращение НПC в предмет
* Скрипт смены погоды
* Скрипт лута для класса в после выполнения квеста + генерация лута по элайменту и проверке скила + ночное привидение + фразы дверей "закрыто" на основе вейпов + Рандомный лут в КВЕСТОВЫЙ сундук
* скрипты для магазинов
* получение лвла по алайменту (на 2 странице этот скрипт доработан Авадоном) + веселая ловушка (повтор)
* Крафт брони +1 к АС, Крафт оружия +1энчант бонус, либо елси это лук или арбалет +1 атак бонус
* Скриптовая система из "Проклятия Левора", предназначенная для переноса вещей хенчмана в следующий модуль
* скрипт чтобы NPC шел за игроком. Будет идти даже после окончания боя.
* пара простых, но очень полезный скриптов для шардов, на них "нанизываются" все остальные примочки
* Система факелов в городах
* Координатная система перехода
* Выдает любому уровню процент ХР заданный вами
* Вот маленький инклюд с функцией makeTrace изображает дымную трассу (типа как от ракеты) между двумя точками + функции устанавливают заданное числовое значение аляймента

-- страница 4 --
* Построение "лучевой" конструкции на локации
* Альтернативный отдых от 2_advanced + работа с игровым временем
* Скрипт запрета игры в модуль определенными расами/классами и тд
* посадка на стул с учетом того, что игрока может выкинуть из модуля (актуально для шардов)
* Скрипт отодвигания НПС с прохода через диалог
* Автоматическое переключение дневных и ночных энкаунтеров
* Тестовый триггер для присвоения нужных локалок. Полезен при отладке синглов
* Выдача опыта в зависимости от нанесенного дамага
* Библиотека для работы с цветами (возможность делать цвета самостоятельно на основе RGB)
* Скрипт построения НПС в колонны, шеренги, ромбы и другие виды построений
* Библиотека для работы со строками, шаблонами и тд.
* Работа с инвентарем (передача инвенторя от 1 НПС другому, взятие нескольких стекованных предметов) + определение лучшего класса в мультиклассе
* Скрипт "резервирования" нескольких мест на сервере под DM'ов (kreon)
* Скрипт "резервирования" нескольких мест на сервере под DM'ов (Zirrex)
* Восстановление заклинаний через молитвы
* Раскидывание заходящих игроков по точкам (например для автоматического раскидывания игроков по камерам в тюрьме)
* Функция, определяющая лучшее оружие ближнего боя для указаного персонажа. (с учетом фитов и многого другого)
* После убийства НПС его вещи копируются в плейсбл, который потом грабится игроком
* Cкрипт для разных таверн. Официантка ходит по таверне подходит к разнам клиентам ,спрашивает заказ
* Дерево, которое можно рубить только специальным топором и после некоторых мучений отрубить таки сук. Другое оружие тупится об это дерево.



Tarre T.
Скрипт мой, все совпадения случайны. Синьки: "blood"-пятно крови.
Так как в ДнД не описано, при каком дамаге и сколько должно выливаться крови у ПС, я буду руководствоваться практическими соображениямиsmile.gif
На онДамагет неписи:
Neverwinter Script Source
#include "damage_system"
void main()
{
BloodEffect();
Talking();
}
.
.................................................
cам инклюд:
..................................................
Neverwinter Script Source
location RandomLocation(object oTarget, float fRadius, int iLine = TRUE)
{
if(!iLine)
fRadius=IntToFloat(Random(FloatToInt(fRadius)));
float iXO=VectorMagnitude(GetPosition(oTarget))*cos(VectorToAngle(GetPosition(oTarget)));
float iYO=VectorMagnitude(GetPosition(oTarget))*sin(VectorToAngle(GetPosition(oTarget)));
float fRndomAngle=IntToFloat(Random(360));
location lNewLoc=Location(GetArea(oTarget),Vector(iXO+fRadius*cos(fRndomAngle), iYO+fRadius*sin(fRndomAngle)), 360.0);
return lNewLoc;}

void BloodEffect()
{
location lRandom1 = RandomLocation(OBJECT_SELF, 4.4, TRUE);
location lRandom2 = RandomLocation(OBJECT_SELF, 3.5, TRUE);
location lRandom3 = RandomLocation(OBJECT_SELF, 1.9, TRUE);
location lOS = GetLocation(OBJECT_SELF);
int iChL;
int iChM;
int iChS;
int iBS;
if (GetRacialType(OBJECT_SELF)==RACIAL_TYPE_HALFORC||
RACIAL_TYPE_HUMANOID_ORC||
RACIAL_TYPE_ABERRATION)
{
iChL = 99;
iChM = 49;
iChS = 19;
iBS = 9;}
else if (GetRacialType(OBJECT_SELF)==RACIAL_TYPE_HUMAN||
RACIAL_TYPE_GNOME||
RACIAL_TYPE_HALFELF)
{
iChL = 131;
iChM = 46;
iChS = 17;
iBS = 6;}
else if (GetRacialType(OBJECT_SELF)==RACIAL_TYPE_ELF||
RACIAL_TYPE_FEY||
RACIAL_TYPE_HALFLING||
RACIAL_TYPE_DWARF)
{
iChL = 9999;
iChM = 43;
iChS = 11;
iBS = 5;}
else
{
iChL = 99;
iChM = 49;
iChS = 19;
iBS = 9;
}
if (GetTotalDamageDealt()>iChL)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_CHUNK_RED_LARGE), OBJECT_SELF);
CreateObject(OBJECT_TYPE_PLACEABLE, "blood", lRandom1);
}
if (GetTotalDamageDealt()>iChM)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_CHUNK_RED_MEDIUM), OBJECT_SELF);
CreateObject(OBJECT_TYPE_PLACEABLE, "blood", lRandom2);
}
if (GetTotalDamageDealt()>iChS)
{
switch (Random(2))
{
case 1:
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL), OBJECT_SELF);break;
}
case 2:
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_BLOOD_SPARK_MEDIUM), OBJECT_SELF);
break;
}
}
CreateObject(OBJECT_TYPE_PLACEABLE, "blood", lRandom3);
}
if (GetTotalDamageDealt()>iBS)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_BLOOD_SPARK_SMALL), OBJECT_SELF);
}
}

void Talking()
{
string iP;
string sYa = GetName(GetObjectByTag("ax_letter_ya"));
if (GetAlignmentGoodEvil(OBJECT_SELF)==ALIGNMENT_EVIL)
{
switch(Random(6))
{
case 1: iP = "Твои кишки будут мне гарниром!"; break;
case 2: iP = "Тебе не одолеть менz, тварь!"; break;
case 3: iP = "Аа! Мои ноги!Z сдеру с тебz твою шкуру!"; break;
case 4: iP = "Ублюдок, мое лицо!"; break;
case 5: iP = "Сасфанеф! Мои фубы!!"; break;
case 6: iP = "А, рука, рука!"; break;
}
}
else if (GetAlignmentGoodEvil(OBJECT_SELF)==ALIGNMENT_GOOD)
{
switch(Random(6))
{
case 1: iP = "Ааа! Зло будет повержено!"; break;
case 2: iP = "Свет добра обратит тебz в пепел!"; break;
case 3: iP = "Каждаz царапина на мне будет твоей мукой!"; break;
case 4: iP = "Боль! Мне больно! Боги света, взываю к вам!"; break;
case 5: iP = "Ах! моz нога! Латандер накажет тебz за это! "; break;
case 6: iP = "А, рука, рука!"; break;
}
}
if (GetAlignmentLawChaos(OBJECT_SELF)==ALIGNMENT_LAWFUL)
{
switch(Random(6))
{
case 1: iP = "Ааа! эта рана будет стоить тебе дорого!"; break;
case 2: iP = "Мои фубы! Ты отфетеф за это!"; break;
case 3: iP = "Аа! Мои ноги!Z сдеру с тебz твою шкуру!"; break;
case 4: iP = "Гад! Только женщины бьют в пах!"; break;
case 5: iP = "Сасфанеф! Мои фубы!!"; break;
case 6: iP = "А, рука, рука! Где твой здравый смысл?!"; break;
}
}
else if (GetAlignmentLawChaos(OBJECT_SELF)==ALIGNMENT_CHAOTIC)
{
switch(Random(6))
{
case 1: iP = "Твои кишки будут мне гарниром!"; break;
case 2: iP = "Тебе не одолеть менz"; break;
case 3: iP = "Аа! Мои ноги!Z сдеру с тебz твою шкуру!"; break;
case 4: iP = "Гад! мое лицо!"; break;
case 5: iP = "Сасфанеф! Мои фубы!!"; break;
case 6: iP = "А, рука, рука!"; break;
}
}
else if (GetAlignmentLawChaos(OBJECT_SELF)==ALIGNMENT_NEUTRAL)
{
switch (Random(6))
{
case 1: iP = "ааа! Ты нарушаешь равновесие и умрешь за это!"; break;
case 2: iP = "Тебе не одолеть менz"; break;
case 3: iP = "Аа! Мои ноги!Z сдеру с тебz шкуру!"; break;
case 4: iP = "мое лицо! Тир покарает тебz за это!"; break;
case 5: iP = "Нелюфь, мои фубы!!"; break;
case 6: iP = "А, рука, моz рука!!"; break;
}
}
switch (Random(2))
{
case 0: SpeakString(iP);break;
case 1: SpeakString(iP);break;
case 2: break;
}}
Bot
Да, РэндомЛокэйшн в предыдущем скрипте взят с форумов рилмс.ру.
Lex: RandomLocation - Бааловский скрипт.
Еще один скрипт. Посмертныйsmile.gifСкрипт мой, все совпадения случайны. Ставится на онДайинг модуля. При смерти ПС ложится на землю и орет, чтобы его лечили. Лечат - выфил, нелечат - постепенно погибает. Когда хп остается меньше (-10) - менять по желанию.

Neverwinter Script Source
void bleed(int iBleedAmt)
{
    effect eBleedEff;
    if (GetCurrentHitPoints() <= 0) {
        if (iBleedAmt > 0) {
            eBleedEff = EffectDamage(iBleedAmt);
        } else {
            eBleedEff = EffectDamage(iBleedAmt);
        }
        ApplyEffectToObject(DURATION_TYPE_INSTANT, eBleedEff, OBJECT_SELF);
        if (GetCurrentHitPoints() <= -10) {
            PlayVoiceChat(VOICE_CHAT_DEATH);
            ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DEATH), OBJECT_SELF);
            ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), OBJECT_SELF);
            return;
        }

        if (iBleedAmt > 0) {
            if (d10(1) == 1) {
                iBleedAmt = -iBleedAmt;
                PlayVoiceChat(VOICE_CHAT_LAUGH);
            } else {
                switch (d6()) {
                    case 1: PlayVoiceChat(VOICE_CHAT_PAIN1); break;
                    case 2: PlayVoiceChat(VOICE_CHAT_PAIN2); break;
                    case 3: PlayVoiceChat(VOICE_CHAT_PAIN3); break;
                    case 4: PlayVoiceChat(VOICE_CHAT_HEALME); break;
                    case 5: PlayVoiceChat(VOICE_CHAT_NEARDEATH); break;
                    case 6: PlayVoiceChat(VOICE_CHAT_HELP);
                }
            }
        }
        DelayCommand(6.0,bleed(iBleedAmt));
    }
}
void main()
{
    object oDying = GetLastPlayerDying();
    AssignCommand(oDying, ClearAllActions());
    AssignCommand(oDying, bleed(1));
    CreateObject(OBJECT_TYPE_CREATURE, "blood", GetLocation(oDying));
}


'blood' -синька крови.

ДЛЯ ВСЕХ: Просьба пользоваться кнопкой NSS. Так удобнее читать и разбираться в скриптах.
Aiwan
В общем простой скриптик, экономящий кучу времени и ресурсов. На OnFailToOpen двери. Если дверь закрыта, то при попытке открыть будет стринг из имени вейпоинта WP_DOOR_TXT. Желательно ставить сразу под дверь. Если вы забудете его поставить, то будет сообщение об ошибке.

Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2004 WRG!
//:: OnFailToOpen
//:://////////////////////////////////////////////
/*
  WP_DOOR_TXT - вейп с именем нашего текста.
     Ставим его сразу перед нужной дверью.
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 10.01.2004
//:://////////////////////////////////////////////
void main()
{
object oWp = GetNearestObjectByTag("WP_DOOR_TXT"); // БЕРЕМ БЛИЖАЙШИЙ
string sDoor = GetName(oWp);

    if (GetIsObjectValid(oWp) && GetDistanceBetween(oWp, OBJECT_SELF) <= 10.0f)
        //  ЕСЛИ ЕСТЬ ТАКОЙ WP И ОН НЕ ДАЛЬШЕ 10 МЕТРОВ
        {
        SpeakString(sDoor); // ПРОИЗНОСИМ ЕГО ИМЯ
         return;
        }
        else
           {
           SpeakString("Ошибка! Не могу найти WP_DOOR_TXT!");// ЕСЛИ МЫ ЗАБЫЛИ ПОСТАВИТЬ
           return;
           }
}
Aiwan
Я тут задумался о пиратах, выползающих из шахт и убивающих мирных жителей Андра-Дуна. :cruel: Вот простенький скрипт на OnAreaTransitionClick . Теперь пираты ждут вас и курят бамбук там где должны biggrin.gif

Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2004 WRG!  [URL=http://wrg.ru]http://wrg.ru[/URL]
//:: am_oa_stop
//:://////////////////////////////////////////////
/*
     СКРИПТ ЗАПРЕЩАЮЩИЙ МОНСТРАМ ВЫХОДИТЬ
         ИЗ ЛОКАЦИИ ВСЛЕД ЗА ИГРОКОМ
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan    Aiwan@e-mail.ru
//:: Created On: 21.04.2004
//:://////////////////////////////////////////////
void main()
{
  object oPC = GetEnteringObject();
  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);
  object oJamp = GetTransitionTarget(OBJECT_SELF);

  if (GetIsPC(oPC))
  {
  AssignCommand(oPC, JumpToObject(oJamp));
  AssignCommand(oAnimal, JumpToObject(oJamp));
  AssignCommand(oDominated, JumpToObject(oJamp));
  AssignCommand(oFamiliar, JumpToObject(oJamp));
  AssignCommand(oHenchman, JumpToObject(oJamp));
  AssignCommand(oSummoned, JumpToObject(oJamp));
  }
}
Baal
Neverwinter Script Source
float GetX(location lTarget)
{
return GetPositionFromLocation(lTarget).x;
}

float GetY(location lTarget)
{
return GetPositionFromLocation(lTarget).y;
}

float GetZ(location lTarget)
{
return GetPositionFromLocation(lTarget).z;
}

// lWizLoc - ЛОКАЦИЯ КАСТУЮЩЕГО
// lSpelLoc - ЛОКАЦИЯ ЦЕНТРА СТЕНЫ
// nCount - КОЛЛИЧЕСТВО СИГМЕНТОВ - ПЛЭЙСИБЛОВ
// fSpellTime - ПРОДОЛЖИТЕЛЬНОСТЬ СПЕЛЛА
void IceWallSpell(location lWizLoc, location lSpelLoc, int nCount, float fSpellTime)
{
vector vAB = GetPositionFromLocation(lSpelLoc) - GetPositionFromLocation(lWizLoc);
vAB = Vector(vAB.x,vAB.y);
float fAlfa = VectorToAngle(vAB);
float fAB = VectorMagnitude(vAB);
float fBC = 0.0;
float fX1, fX2, fY1, fY2;
location lLoc1, lLoc2;
object oPlaceable1, oPlaceable2;
string sVR;
int bTrueFalse = TRUE;
///  РЕСРЕФЫ ПЛЭЙСИБЛОВ
string sResRef1 = "plc_box2";
string sResRef2 = "plc_box3";
///  РАЗМЕР ПЛЭЙСИБЛА (РАССТОЯНИЕ МЕЖДУ ЛОКАЦИЯМИ)
float fSize = 1.1;
nCount--;
while(nCount >= 0)
  {
  fBC = fSize*nCount/2;
  fX1 = GetX(lWizLoc) + fAB*cos(fAlfa) + fBC*sin(fAlfa);
  fX2 = GetX(lWizLoc) + fAB*cos(fAlfa) - fBC*sin(fAlfa);
  fY1 = GetY(lWizLoc) + fAB*sin(fAlfa) - fBC*cos(fAlfa);
  fY2 = GetY(lWizLoc) + fAB*sin(fAlfa) + fBC*cos(fAlfa);
  sVR = (bTrueFalse) ? sResRef1 : sResRef2;
  bTrueFalse = !bTrueFalse;
  /// ЛОКАЦИИ
  lLoc1 = Location(GetAreaFromLocation(lWizLoc), Vector(fX1, fY1, GetZ(lSpelLoc)), fAlfa);
  oPlaceable1 = CreateObject(OBJECT_TYPE_PLACEABLE, sVR, lLoc1);
  AssignCommand(oPlaceable1, DelayCommand(fSpellTime, DestroyObject(OBJECT_SELF)));
  if(nCount !=0)
    {
    /// ЛОКАЦИИ
    lLoc2 = Location(GetAreaFromLocation(lWizLoc), Vector(fX2, fY2, GetZ(lSpelLoc)), fAlfa);
    oPlaceable2 = CreateObject(OBJECT_TYPE_PLACEABLE, sVR, lLoc2);
    AssignCommand(oPlaceable2, DelayCommand(fSpellTime, DestroyObject(OBJECT_SELF)));
    }
  nCount = nCount - 2;
  }
return;
}


Этот скрипт я писал для Айс Блэйда, для его проекта ледяной стены. Скрипт должен создавать заданное количество плэйсиблов (сигментов ледяной стены) напротив игрока и дестроить их через заданное время. Пока я использовал синьки сдандартных ящиков smile.gif Всего два вида чередующихся плэйсиблов.
Lord of V@MPIRES
Вы хотите добавить суб-расы в игру ? Пожайлуста ! Пока я еще не добавил им доп. умений, но скоро сделаю... надеюсь... Пока скрипт дает только спец-предмет в зависимости от суб-расы.
Инклуд суб-рас:
Neverwinter Script Source
void GiveSubRaceCWeaponL(string sSubRaceWeapon, object oPC)
{
    object oPC = GetEnteringObject();
    object oRacialWeapon = CreateItemOnObject(sSubRaceWeapon, oPC);
    AssignCommand(oPC, ActionEquipItem(oRacialWeapon, INVENTORY_SLOT_CWEAPON_R));
}

string SR_SubRace(object oPC)
{
    if (GetIsPC(oPC)) {
        object oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oPC);
        if (GetIsObjectValid(oItem))
        string sSubRace = GetSubRace(oPC);
        string sSRItem = "None";
        int iRace = GetRacialType(oPC);
        if (iRace == RACIAL_TYPE_DWARF) {
            if (sSubRace == "Gold Dwarf") {
                sSRItem = "golddwarfsubitem";
                GiveSubRaceCWeaponL(sSRItem, oPC);
                return sSRItem;
            }
            if (sSubRace == "Gray Dwarf") {
                sSRItem = "graydwarfsubitem";
                GiveSubRaceCWeaponL(sSRItem, oPC);
                return sSRItem;
            }
            if (sSubRace == "Shield Dwarf")
                return sSRItem;
        } // Dwarf
        if (iRace == RACIAL_TYPE_ELF) {
            if (sSubRace == "Moon Elf")
                return sSRItem;
            if (sSubRace == "Sun Elf") {
                sSRItem = "sunelfsubitem";
                GiveSubRaceCWeaponL(sSRItem, oPC);
                return sSRItem;
            }
            if (sSubRace == "Wild Elf") {
                sSRItem = "wildelfsubitem";
                GiveSubRaceCWeaponL(sSRItem, oPC);
                return sSRItem;
            }
            if (sSubRace == "Wood Elf") {
                sSRItem = "woodelfsubitem";
                GiveSubRaceCWeaponL(sSRItem, oPC);
                return sSRItem;
            }
            if (sSubRace == "Drow Elf") {
                sSRItem = "drowsubitem";
                GiveSubRaceCWeaponL(sSRItem, oPC);
                return sSRItem;
            }
        } // Elf
        if (iRace == RACIAL_TYPE_HALFLING) {
            if (sSubRace == "Strongheart Halfling") {
                sSRItem = "";
                GiveSubRaceCWeaponL(sSRItem, oPC);
                return sSRItem;
            }
            if (sSubRace == "Ghostwise Halfling") {
                sSRItem = "";
                GiveSubRaceCWeaponL(sSRItem, oPC);
                return sSRItem;
            }
            if (sSubRace == "Lightfoot Halfling")
                return sSRItem;
        } // Halfling
        if (iRace == RACIAL_TYPE_GNOME) {
            if (sSubRace == "Deep Gnome") {
                sSRItem = "deepgnomesubitem";
                GiveSubRaceCWeaponL(sSRItem, oPC);
                return sSRItem;
            }
            if (sSubRace == "Rock Gnome")
                return sSRItem;
        } // Gnome
     }
    return "None";
}


Теперь скрипт, который ложится в onClientEnter модуля:
Neverwinter Script Source
#include "subrace"
void main()
{
    object oPC = GetEnteringObject();
    AddJournalQuestEntry("sub",0001, oPC);
    string sSubItem = SR_SubRace(oPC);
    if (sSubItem != "None")
    {
    SendMessageToPC(oPC, "Ваш персонаж получает под-расу " + GetSubRace(oPC));
    }
}


Вся фишка моего скрипта суб-расы в том, что он не дает оружие или предмет, а экиптрует, т.е. он на тебе, но в инвентаре его нет ! Например делаем предмет для суб-расы дроу (это темные эльфы, кто не знает):
Создаем кинжал и наделяем его +2 Ловкость, -1 Харизма и -1 Сила.
После этого он одевается ему в слот, которого в интвентаре нет, а х-ки остаются на персонаже.
Aiwan
Вот небольшой скрипт дающий экспу за открытие двери или обезвреживание ловушки. Специально сделан так, что если за вас работает хеньчман, то много экспы не ждите. blum3.gif

Вешается это добро на разные слоты, либо на OnUnlocked либо на OnDisarm ловушки.

Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2004 WRG!  www.wrg.ru
//:://////////////////////////////////////////////
/*
    РАЗДЕЛЕНИЕ ХР ЗА ОТКРЫТИЕ - ОБЕЗВРЕЖИВАНИЕ
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan    Aiwan@e-mail.ru
//:: Created On: 09.05.2004
//:://////////////////////////////////////////////

#include "nw_i0_tool"
void main()
{
//================ ОТКРЫВАЕМ ЗАМОК ================
object oUnlocked = GetLastUnlocked();
if (!GetLocalInt(OBJECT_SELF, "UNLOCKED"))
{
   if (GetIsPC(oUnlocked))
    {
    SetLocalInt(OBJECT_SELF, "UNLOCKED", TRUE);
    GiveXPToCreature(oUnlocked, 100);
    return;
    }
    else
    RewardPartyXP(10, GetFirstPC());
}
//=============== ОБЕЗВРЕЖИВАЕМ ЛОВУШКУ ============
      object oDisarmed = GetLastDisarmed();
      if (!GetLocalInt(OBJECT_SELF, "DISARMED"))
        {
        if (GetIsPC(oDisarmed))
          {
          SetLocalInt(OBJECT_SELF, "DISARMED", TRUE);
          GiveXPToCreature(oDisarmed, 100);
          return;
          }
          else
          RewardPartyXP(10, GetFirstPC());
       }
}
Aiwan
Вот немного переделанный скрипт, кому то понравится больше чем первый.
LEX:Айв, тут у тебя пара косяков есть в коде. Я исправил и дополнил. Не сердись.
СПАСИБО ДБу за идею! good.gif

Neverwinter Script Source
#include "nw_i0_tool"
void main()
{
int iL = GetLockUnlockDC(OBJECT_SELF);
int iT = GetTrapDisarmDC(OBJECT_SELF);
object oDisarmed = GetLastDisarmed();
object oUnlocked = GetLastUnlocked();

//================ ОТКРЫВАЕМ ЗАМОК ================
if ((!GetLocalInt(OBJECT_SELF, "UNLOCKED"))&&(GetIsObjectValid(oUnlocked)))
   {
   SetLocalInt(OBJECT_SELF, "UNLOCKED", TRUE);
   if (HasItem(oUnlocked,GetLockKeyTag(OBJECT_SELF))) return;
   if (GetIsPC(oUnlocked)) // Если замок вскрыл РС
    {
    GiveXPToCreature(oUnlocked, (iL * GetHitDice(oUnlocked)/3));
    // XP = DC двери умноженное на 1/3 уровень РС
    return;
    }
   else // Если замок вскрыл Henchman
    RewardPartyXP((iL*2), GetMaster(oUnlocked));
    // XP = DC двери умноженное на 2
   return;
   }
//=============== ОБЕЗВРЕЖИВАЕМ ЛОВУШКУ ============
if ((!GetLocalInt(OBJECT_SELF, "DISARMED"))&&(GetIsObjectValid(oDisarmed)))
   {
   SetLocalInt(OBJECT_SELF, "DISARMED", TRUE);
   if (HasItem(oDisarmed,GetTrapKeyTag(OBJECT_SELF))) return;
   if (GetIsPC(oDisarmed)) // Если ловушку обезвредил РС
    {
    GiveXPToCreature(oDisarmed, (iT * GetHitDice(oDisarmed)/3));
    // XP = DC ловушки умноженное на 1/3 уровень РС
    return;
    }
   else // Если ловушку обезвредил Henchman
    RewardPartyXP((iT*2), GetMaster(oDisarmed));
    // XP = DC ловушки умноженное на 2
   }
}
Aiwan
Удалить не получается.... smile.gif
Tarre Talliorne
В процессе всем нам часто приходится кидать дайсы. А юзать Рандом+1 неудобно в случае, когда надо, скажем, бросить 3д5. Решил написать скриптину:

Neverwinter Script Source
int XdY(int nX, int nY)
{
int iN=0;
int iResult=0;
    while (iN<nX)
    {
    iResult=iResult+Random(nY)+1;
    iN++;
    }
return iResult;
}

<small>Добавлено в 15:30</small>
Прототип:
Neverwinter Script Source
// get the total from rolling [1]- [nX*Random(xY)+1]
// scripted by TARRE T.
int XdY(int nX, int nY);
Aiwan
Если у вас не очень много дверей, которые закрываются на ночь, то можно вставить такой скриптик на OnHeartbeat этой двери.

Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2004 WRG!  www.wrg.ru
//:: Name: am_doorlock_d_n
//:://////////////////////////////////////////////
/*
           ЗАПИРАЕТ ДВЕРЬ НА НОЧЬ
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan    Aiwan@e-mail.ru
//:: Created On: 21.05.2004
//:://////////////////////////////////////////////
void main()
{
if((GetIsNight() && GetLocked(OBJECT_SELF))||(GetIsDay() && !GetLocked(OBJECT_SELF)))
      {
      return;
      }
    if (GetIsNight())
        {
        SetLocked(OBJECT_SELF, TRUE);
        return;
        }
      if (GetIsDay())
           {
           SetLocked(OBJECT_SELF, FALSE);
           return;
           }
}
DBColl
Поправлю.
Код
//:://////////////////////////////////////////////
//:: Copyright (c) 2004 WRG!  www.wrg.ru
//:: Name: am_doorlock_d_n
//:://////////////////////////////////////////////
/*
          ЗАПИРАЕТ ДВЕРЬ НА НОЧЬ
*/
//:://////////////////////////////////////////////
//:: Created By: Aiwan    Aiwan@e-mail.ru
//:: Created On: 21.05.2004
//:://////////////////////////////////////////////
void main()
{
  if (GetArea(OBJECT_SELF) != GetArea(GetFirstPC())) //
       return;  // PS. ТОЛЬКО ДЛЯ СИНГЛОВ!!!
// if((GetIsNight() && GetLocked(OBJECT_SELF))||(GetIsDay() && !GetLocked(OBJECT_SELF)))
//     {
//     return;   // [b]Эта проверка 4-х условий будет жрать больше ресурсов, чем "перезакрытие" дверей!
//     }         // Так что она не нужна.[/b]
   if (GetIsNight())
       {
       SetLocked(OBJECT_SELF, TRUE);
       return;
       }
     if (GetIsDay())
          {
          SetLocked(OBJECT_SELF, FALSE);
          return;
          }
}
Sir_Sarles
Цитата

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


Имхо, логичнее экспу уменьшать с уровнем. Обосновать? А за хенчмена - чисто
формальные 10 очков. smile.gif Все цифры взяты наобум, тут надо корректировать.

Neverwinter Script Source
void main()
{
int iL = GetLockUnlockDC(OBJECT_SELF);
object oUnlocked = GetLastUnlocked();
int iDice;

if GetHitDice(oUnlocked) < 15
  {
  iDice = 15 - GetHitDice(oUnlocked);
  }
else
  {
  iDice = 1;
  }


//================ ОТКРЫВАЕМ ЗАМОК ================
if (!GetLocalInt(OBJECT_SELF, "UNLOCKED"))
{
  SetLocalInt(OBJECT_SELF, "UNLOCKED", TRUE);
  if (GetIsPC(oUnlocked)) // Если замок вскрыл РС
  {
//  GiveXPToCreature(oUnlocked, (iL * GetHitDice(oUnlocked)/3));
  GiveXPToCreature(oUnlocked, (iL * iDice/3));
  return;
  }
  else // Если замок вскрыл Henchman
  // RewardPartyXP((iL*2), GetMaster(oUnlocked));
  GiveXPToCreature(oUnlocked, 10);
}

}


------
Что касается ловушек, то Ой! Разве воришка не может ставить и обезвреживать
собственные ловушки? wink3.gif (Вспоминается Jagged Alliance, где можно было поднять
саперское умение с 1 до 100, с одной миной. smile.gif ) Проверку на Hostile?
Tarre Talliorne
Очередная порция скриптов(начал писать АИ, вот, так сказать, начальные наработки, может, кому-нить и пригодится). Как всегда все(кроме 7 - этот скрипт взят из кампании СоУ) мое, совпадения случайны.

1. Проверяет, оружие ли вещь oWeapon. Можно использовать в скрипте-проверке, вооружен ли обьект(ведь при простом перебирании обьектов в руках у ПС(НПС) как оружие возвращается и факел).

Neverwinter Script Source
int GetIsWeapon(object oWeapon)
{
    int iType = GetBaseItemType(oWeapon);
    if (GetIsObjectValid(oWeapon)&&iType!=BASE_ITEM_INVALID)
    {
        if (iType == BASE_ITEM_BASTARDSWORD ||
            iType == BASE_ITEM_BATTLEAXE ||
            iType == BASE_ITEM_CLUB ||
            iType == BASE_ITEM_DAGGER ||
            iType == BASE_ITEM_DART ||
            iType == BASE_ITEM_DIREMACE ||
            iType == BASE_ITEM_DOUBLEAXE ||
            iType == BASE_ITEM_GREATAXE ||
            iType == BASE_ITEM_GREATSWORD ||
            iType == BASE_ITEM_HALBERD ||
            iType == BASE_ITEM_HANDAXE ||
            iType == BASE_ITEM_HEAVYCROSSBOW ||
            iType == BASE_ITEM_HEAVYFLAIL ||
            iType == BASE_ITEM_KAMA ||
            iType == BASE_ITEM_KATANA ||
            iType == BASE_ITEM_KUKRI ||
            iType == BASE_ITEM_LIGHTFLAIL ||
            iType == BASE_ITEM_LIGHTHAMMER ||
            iType == BASE_ITEM_LIGHTMACE ||
            iType == BASE_ITEM_LONGBOW ||
            iType == BASE_ITEM_LONGSWORD ||
            iType == BASE_ITEM_MAGICSTAFF ||
            iType == BASE_ITEM_MORNINGSTAR ||
            iType == BASE_ITEM_QUARTERSTAFF ||
            iType == BASE_ITEM_RAPIER ||
            iType == BASE_ITEM_SCIMITAR ||
            iType == BASE_ITEM_SCYTHE ||
            iType == BASE_ITEM_SHORTBOW ||
            iType == BASE_ITEM_SHORTSPEAR ||
            iType == BASE_ITEM_SHORTSWORD ||
            iType == BASE_ITEM_SHURIKEN ||
            iType == BASE_ITEM_SICKLE ||
            iType == BASE_ITEM_SLING ||
            iType == BASE_ITEM_THROWINGAXE ||
            iType == BASE_ITEM_TORCH ||
            iType == BASE_ITEM_TWOBLADEDSWORD ||
            iType == BASE_ITEM_WARHAMMER
            )
        {
            return TRUE;
        }
    }
}


2. Проверяет способность обьекта oObject(=OBJECT_SELF) произносить заклинания.

Neverwinter Script Source
int GetIsCaster(object oObject=OBJECT_SELF)
{
    if((GetLevelByClass(CLASS_TYPE_BARD, oObject)||
        GetLevelByClass(CLASS_TYPE_CLERIC, oObject)||
        GetLevelByClass(CLASS_TYPE_DRUID, oObject)||
        GetLevelByClass(CLASS_TYPE_PALADIN, oObject)> 4||
        GetLevelByClass(CLASS_TYPE_RANGER, oObject)> 4||
        GetLevelByClass(CLASS_TYPE_SORCERER, oObject)||
        GetLevelByClass(CLASS_TYPE_WIZARD, oObject))&&
        GetObjectType(oObject)==OBJECT_TYPE_CREATURE)
    {
        return TRUE;
    }
}


3. Возвращает ближайшее энеми-создание, способное творить заклы. Использует скрипт 2. Из этого скрипта вытекает скрипт 4.

Neverwinter Script Source
object GetNearestEnemyCaster(int iMaxLvl=20, int iMinLvl=1, object oObject=OBJECT_SELF)
{
    int i = 1;
    object oCreature = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, oObject, i++, CREATURE_TYPE_IS_ALIVE, TRUE);
    while (GetIsObjectValid(oCreature))
    {
        if (GetIsCaster(oCreature)&&
            GetPCLevel(oCreature)>=iMinLvl&&
            GetPCLevel(oCreature)<=iMaxLvl)
        {
            break;
        }
        oCreature = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, oObject, i++, CREATURE_TYPE_IS_ALIVE, TRUE);
    }
    return oCreature;
}


4. См. 3.

Neverwinter Script Source
object GetNearestFriedlyCaster(int iMaxLvl=20, int iMinLvl=1, object oObject=OBJECT_SELF)
{
    int i = 1;
    object oCreature = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_FRIEND, oObject, i++, CREATURE_TYPE_IS_ALIVE, TRUE);
    while (GetIsObjectValid(oCreature))
    {
        if (GetIsCaster(oCreature)&&
            GetPCLevel(oCreature)>=iMinLvl&&
            GetPCLevel(oCreature)<=iMaxLvl)
        {
            break;
        }
        oCreature = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_FRIEND, oObject, i++, CREATURE_TYPE_IS_ALIVE, TRUE);
    }
    return oCreature;
}



5. Проверяет, метательное ли оружие oWeapon.

Neverwinter Script Source
int GetIsRangedWeapon(object oWeapon)
{
    if (GetIsObjectValid(oWeapon))
    {
        int iBIT = GetBaseItemType(oWeapon);
        if (iBIT == BASE_ITEM_DART||
            iBIT == BASE_ITEM_HEAVYCROSSBOW||
            iBIT == BASE_ITEM_LIGHTCROSSBOW||
            iBIT == BASE_ITEM_LONGBOW||
            iBIT == BASE_ITEM_SHORTBOW||
            iBIT == BASE_ITEM_SHURIKEN||
            iBIT == BASE_ITEM_SLING||
            iBIT == BASE_ITEM_THROWINGAXE)
        {
            return TRUE;
        }
    }
}


6. Скрипт, вытекающий из скрипта 1: если стоит 0 (по умолч.) проверяет у обьекта наличие оружитя в слотах инвентаря, если 1- в инвентаре, если 2 - и там, и там.

Neverwinter Script Source
int GetHasWeapon(object oTarget, int nType)
{
    int WInv = FALSE;
    int WSlot= FALSE;
    int iResult;
    object oItem = GetFirstItemInInventory(oTarget);
    while (GetIsObjectValid(oItem))
    {
        if (GetIsWeapon(oItem))
        {
        WInv = TRUE;
        break;
        }
    oItem = GetNextItemInInventory(oTarget);
    }
    int i;
    for (i=4; i<=5; i++)
    {
    oItem = GetItemInSlot(i, oTarget);
        if (GetIsWeapon(oItem))
        {
        iWSlot = TRUE;
        break;
        }
    }
    if (nType==0) { iResult = iWSlot;         }
    else
    if (nType==1) { iResult = iWInv;          }
    else
    if (nType==2)
    {
        if (iWSLot==TRUE||iWInv==TRUE)
        { return TRUE; } else { return FALSE; }
    }
    else { return -1; }
    return iResult;
}


7. Скрипт, аналогичный второму: определяет, присутствуют ли в его классах классы бойца.

Neverwinter Script Source
int GetHasFighterClass(object oObject)
{
    int nClass1 = GetLevelByClass(CLASS_TYPE_BARBARIAN, GetPCSpeaker());
    int nClass2 = GetLevelByClass(CLASS_TYPE_FIGHTER, GetPCSpeaker());
    int nClass3 = GetLevelByClass(CLASS_TYPE_MONK, GetPCSpeaker());
    int nClass4 = GetLevelByClass(CLASS_TYPE_RANGER, GetPCSpeaker());
    if ((nClass1 > 0) || (nClass2 > 0) || (nClass3 > 0) || (nClass4 > 0))
    {
        return TRUE;
    }
    else return FALSE;
}


8. Рэндомная задержка. Вообще может использоваться для генерации случайного флоата.

Neverwinter Script Source
float GetRandomDelay(float fMinimumTime = 0.4, float MaximumTime = 1.1)
{
    float fRandom = MaximumTime - fMinimumTime;
    int nRandom;
    if(fRandom < 0.0)
    {
        return 0.0;
    }
    else
    {
        nRandom = FloatToInt(fRandom  * 10.0);
        nRandom = Random(nRandom) + 1;
        fRandom = IntToFloat(nRandom);
        fRandom /= 10.0;
        return fRandom + fMinimumTime;
    }
}


9. Возвращает кол-во предметов в инвентаре oTarget.

Neverwinter Script Source
int GetNumItems(object oTarget,string sItem)
{
    int nNumItems = 0;
    object oItem = GetFirstItemInInventory(oTarget);
    while (GetIsObjectValid(oItem))
    {
        if (GetTag(oItem) == sItem)
        {
            nNumItems = nNumItems + GetNumStackedItems(oItem);
        }
        oItem = GetNextItemInInventory(oTarget);
    }
    return nNumItems;
}


Удачи!

PS: про реплы Сэрлеса: восрешение вообще есть лажа и неДнДэшно к тому ж. Ну, не пропаать же скриптуsmile.gif
Аваддон
LEX: Ты бы описал в общих чертах, что эти скрипты делают.
Описываю: Если Хит поинты игрока < 0 >-11 то он падает наземь.корчится, кричит и у него отнимаются хит поинты. Если его не успеют вылечить - он умрет. А когда умрет - станет призраком и перенесется в фугу. А еще экран гаснет...ну вроде как: В глазах потемнело.

За основу взят скрипт Tarre

OnPlayerDying
Neverwinter Script Source
void bleed(int iBleedAmt)
{

  effect eShake=EffectVisualEffect(VFX_FNF_SCREEN_SHAKE);
  effect eBleedEff;
  if (GetCurrentHitPoints() <= 0) {
      if (iBleedAmt > 0) {
          eBleedEff = EffectDamage(iBleedAmt);
      } else {
          eBleedEff = EffectDamage(iBleedAmt);
      }
      ApplyEffectToObject(DURATION_TYPE_INSTANT, eBleedEff, OBJECT_SELF);
      if (GetCurrentHitPoints() <= -10) {
          PlayVoiceChat(VOICE_CHAT_DEATH);
          ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), OBJECT_SELF);
          return;
      }

      if (iBleedAmt > 0) {
          if (d10(1) == 1) {
              iBleedAmt = -iBleedAmt;
          } else {
              switch (d6()) {
                  case 1: PlayVoiceChat(VOICE_CHAT_PAIN1);
                                               ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eShake,OBJECT_SELF,10.0);
                                               DelayCommand(1.5,FadeToBlack(OBJECT_SELF));
                                               BlackScreen(OBJECT_SELF);
                                               DelayCommand(3.0, FadeFromBlack(OBJECT_SELF,FADE_SPEED_SLOWEST));
                  break;
                  case 2: PlayVoiceChat(VOICE_CHAT_PAIN2);
                                              ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eShake,OBJECT_SELF,10.0);
                                              DelayCommand(1.5,FadeToBlack(OBJECT_SELF,FADE_SPEED_SLOWEST));
                                              BlackScreen(OBJECT_SELF);
                                              DelayCommand(3.0, FadeFromBlack(OBJECT_SELF,FADE_SPEED_SLOWEST));
                  break;
                  case 3: PlayVoiceChat(VOICE_CHAT_PAIN3);
                                              ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eShake,OBJECT_SELF,10.0);
                                              DelayCommand(1.5,FadeToBlack(OBJECT_SELF,FADE_SPEED_SLOWEST));
                                              BlackScreen(OBJECT_SELF);
                                              DelayCommand(3.0, FadeFromBlack(OBJECT_SELF,FADE_SPEED_SLOWEST));
                  break;
                  case 4: PlayVoiceChat(VOICE_CHAT_HEALME);
                                              ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eShake,OBJECT_SELF,10.0);
                                              DelayCommand(1.5,FadeToBlack(OBJECT_SELF,FADE_SPEED_SLOWEST));
                                              BlackScreen(OBJECT_SELF);
                                              DelayCommand(3.0, FadeFromBlack(OBJECT_SELF,FADE_SPEED_SLOWEST));
                  break;
                  case 5: PlayVoiceChat(VOICE_CHAT_NEARDEATH);
                                              ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eShake,OBJECT_SELF,10.0);
                                              DelayCommand(1.5,FadeToBlack(OBJECT_SELF,FADE_SPEED_SLOWEST));
                                              BlackScreen(OBJECT_SELF);
                                              DelayCommand(3.0, FadeFromBlack(OBJECT_SELF,FADE_SPEED_SLOWEST));
                  break;
                  case 6: PlayVoiceChat(VOICE_CHAT_HELP);
                                              ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eShake,OBJECT_SELF,10.0);
                                              DelayCommand(1.5,FadeToBlack(OBJECT_SELF,FADE_SPEED_SLOWEST));
                                              BlackScreen(OBJECT_SELF);
                                              DelayCommand(3.0, FadeFromBlack(OBJECT_SELF,FADE_SPEED_SLOWEST));


              }
          }
      }
      DelayCommand(6.0,bleed(iBleedAmt));
  }
  {

       }
}
void main()
{
  effect eBlood=EffectVisualEffect(VFX_COM_CHUNK_RED_MEDIUM);
  object oDying = GetLastPlayerDying();
  object oEnemy = GetLastAttacker();
  float fWho = (GetFacing(oEnemy));
  ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY,eBlood, GetLocation(oDying), 10.0);
  AssignCommand(oDying, ClearAllActions());
  AssignCommand(oDying, bleed(1));
  CreateObject(OBJECT_TYPE_PLACEABLE,"bloody",GetLocation(oDying),TRUE);

}


"bloody" - синька с кровью.
З.Ы. Tarre там с Object_Type перепутал кажетсяsmile.gif

Далее OnPlayerDeath
Neverwinter Script Source
void main()
{
   object oPlayer = GetLastPlayerDied();
   ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DEATH), GetLocation(oPlayer));
   ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_GHOSTLY_VISAGE), oPlayer); //превращается уже тут в призрака, и в фуге появляется как душа.
   ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_PROTECTION_GOOD_MAJOR), oPlayer,6.0);
   DelayCommand(2.0,FadeToBlack(oPlayer));
   DelayCommand(5.0,BlackScreen(oPlayer));

    DelayCommand(5.5,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPlayer));
    DelayCommand(5.8,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPlayer)), oPlayer));
    DelayCommand(6.0,AssignCommand(oPlayer,ClearAllActions()));
    DelayCommand(6.2,AssignCommand(oPlayer,JumpToLocation(GetLocation(GetObjectByTag("WP_RAISE")))));
}

WP_RAISE - вейпоинт в фуге

И еще в локации фуги - куда перемещается мертвый игрок OnEnter
Neverwinter Script Source
void main()
{
object oPC = GetEnteringObject();
DelayCommand(2.0,FadeFromBlack(oPC,FADE_SPEED_SLOWEST));
}
Tarre Talliorne
Скрипты: удаляющий эффект (1) и сканирующий эффект (2).

Neverwinter Script Source
void ActionRemoveEffect(object oCreature, effect eEffect)
    {
        effect eMSD = GetFirstEffect(oCreature);
        while (GetIsEffectValid(eMSD))
        {
            if (GetEffectType(eMSD) == GetEffectType(eEffect))
            {
            RemoveEffect(oCreature, eMSD);
            }
        eMSD = GetNextEffect(oCreature);
        }
    }


Neverwinter Script Source
int HasEffect(object oCreature, effect eEffect)
    {
        int iResult = 0;
        effect eMSD = GetFirstEffect(oCreature);
        while (GetIsEffectValid(eMSD))
        {
            if (GetEffectType(eMSD) == GetEffectType(eEffect))
            {
            iResult = 1;
            }
        eMSD = GetNextEffect(oCreature);
        }
        return iResult;
    }

Обещанный скрипт-реакция грарда на нападение на оного ПС... Впихивается в онАтакед. Скрипт делает следущее: охранник вырубает ПС и начинает с ним диалог(лтбо что-то иное smile.gif )
Neverwinter Script Source
object oFPC = GetLastAttacker();
        object OS = OBJECT_SELF;     
        DelayCommand(0.10, ClearAllActions(TRUE));
        DelayCommand(0.60, ActionUseFeat(FEAT_KNOCKDOWN, oFPC));
        DelayCommand(0.61, ApplyEffectToObject(1, EffectKnockdown(), oFPC, 3.0));
        DelayCommand(1.00, ClearAllActions(TRUE));
        if (GetCurrentHitPoints(OS)<=0)
        {
        // если гвард умер с первого удара... можно оставить пустым, можно написать реакции другим охранникам... в любом случае, если мне написать тут родной код (т.е. тот, который был у меня), то пришлось бы писать всю немаленькую систему моих кастомных реакций, что геморно...
        }
        else
        {
        DelayCommand(1.04, SetStandardFactionReputation(REPUTATION_TYPE_ENEMY, 50, oFPC));
        DelayCommand(5.10, ClearAllActions(TRUE));
        DelayCommand(5.20, ActionMoveToObject(oFPC, FALSE, 1.4));
        }
        // диалог, либо что-то иное - на ваше усмотрение.
Tarre Talliorne
Neverwinter Script Source
object oFPC = GetLastAttacker();
      object OS = OBJECT_SELF;     
      effect eEffect = EffectImmunity(IMMUNITY_TYPE_KNOCKDOWN);
      if (HasEffect(oFPC))
      {
      ActionRemoveEffect(oFPC, eEffect);
      }
      DelayCommand(0.10, ClearAllActions(TRUE));
      DelayCommand(0.60, ActionUseFeat(FEAT_KNOCKDOWN, oFPC));
      DelayCommand(0.61, ApplyEffectToObject(1, EffectKnockdown(), oFPC, 3.0));
      DelayCommand(1.00, ClearAllActions(TRUE));
      if (GetCurrentHitPoints(OS)<=0)
      {
      // если гвард умер с первого удара... можно оставить пустым, можно написать реакции другим охранникам... в любом случае, если мне написать тут родной код (т.е. тот, который был у меня), то пришлось бы писать всю немаленькую систему моих кастомных реакций, что геморно...
      }
      else
      {
      DelayCommand(1.04, SetStandardFactionReputation(REPUTATION_TYPE_ENEMY, 50, oFPC));
      DelayCommand(5.10, ClearAllActions(TRUE));
      DelayCommand(5.20, ActionMoveToObject(oFPC, FALSE, 1.4));
      }
      // диалог, либо что-то иное - на ваше усмотрение.
По идеи должно работать... Хотел еще вставить фичу, чтобы в конце убранный эффект восстанавливался, но потом передумал - ибо нехрен на охранника с иммуной наезжать :-)
Возможный баг - если на криче будет много иммунитетов, то ремувится только один (возможно, не нокдаун, т.к. эффекттип есть только EFFECT_TYPE_IMMUNITY). Хотя не знаю, я сейчас в ж...пе полнейшей, до ближайшего тулсета километры, посему могу и ошибаться ...
Tarre Talliorne
Да, я добрался-таки до тулсы, проверил: все работает (исходя из оргинзации цикла ActionRemoveObject(. . .) ), уничтожает ВСЕ эффекты иммунитета на криче... Теперь в поярдке садомазохизма попытаюсь сделать, чтобы эффект возвращался после прозхождения процедуры "валяния" ПС на земле. Загвоздка в том - как фиксировать длительность начального эффекта и наложить новый эффект с такой же длительностью... ДБ, помоги :-)
Да, и еще: обнаружилась досадная бага - атакующие перса кричи не меняют свое отношение к ПС, когда гвард уже поменял отношение. Попробую исправить.

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

Neverwinter Script Source
void main()
{
    SpeakString("This is what would happen if the store started"); // оригинальная строчка на исходном Store Open Script
    object oInv = GetFirstItemInInventory();
        while (GetIsObjectValid(oInv)) // стандартная организация цикла для удаления неограниченного кол-ва вещей
        {
            string sOS = GetTag(OBJECT_SELF); // в зависимости от тега магазина разные критерии удаления
            if  (sOS == "store1") // к примеру весли тег магазина - "store1", то удаляются все предметы, если их типы не BASE_ITEM_POTIONS и не BASE_ITEM_SCROLL...
            {
                if (GetBaseItemType(oInv)!=BASE_ITEM_POTIONS&&
                    GetBaseItemType(oInv)!=BASE_ITEM_SCROLL  )
                {
                DestroyObject(oInv);
                }
            }
            else if (sOS == "store2")
            {
            // аналогично, если "store2", то фильтр можно изменить на подходящий вам
            }
        oInv = GetNextItemInInventory();
        }
}
Tarre Talliorne
Neverwinter Script Source
const string TXT_COLOR_GRAY    = "<c°°°>"; // Gray
const string TXT_COLOR_WHITE    = "<cууу>"; // White
const string TXT_COLOR_CYAN    = "<c уу>"; // Light Cyan
const string TXT_COLOR_MAGENTA  = "<cу у>"; // Magenta
const string TXT_COLOR_YELLOW   = "<cуу >"; // Yellow
const string TXT_COLOR_RED      = "<cу  >"; // Red
const string TXT_COLOR_GREEN    = "<c у >"; // Green
const string TXT_COLOR_BLUE    = "<c  у>"; // Blue
const string TXT_COLOR_NONE    = "";       // Default (no color)
const string TXT_COLOR_END      = "</c>";   // (color end TAG)
const string TXT_COLOR_DEFAULT  = TXT_COLOR_CYAN;


// Function changes color of the string
// * Param sText - text to color
// * Param sColor - parse a color constant here
// * Returns colored string
string colorText(string sText, string sColor);


string colorText(string sText, string sColor)
{
  return sColor + sText + TXT_COLOR_END;
}


Выдрана из буржуйского мода. Код _каа_ предусматривал только 4 цвета. здесь больше. пользуйтесь.
Tarre Talliorne
Цветной текст. Пример:
Называешь мой инклюд "lib_colortext". Скрипт на он_ентер локи.
На входе ПС говорит фразу you are entering object, и она отображается не стандартным белым, а красным (TXT_COLOR_RED). Если бы на месте TXT_COLOR_RED стояло бы TXT_COLOR_YELLOW , она отобразилась бы желтым. Проверь.

Neverwinter Script Source
#include "lib_colortext"
void main()
{
object oPC = GetEnteringObject();
if (!GetIsPC(oPC)) return;
AssignCommand(oPC, SpeakString(colorText("you are entering object", TXT_COLOR_RED)));
}
Аваддон
Скриптики на головоломку. Тоесть не совсем головоломку... На закодированную дверь. У вас есть локация в которой есть дверь. Эта дверь изначально закрыта.
Еще там есть N-ое количество плиток (Plate) на полу с любыми тегами, но именами букв. Например, плита с именем "р" и тегом..ну допустим "letter_r". И надо столько плит - из скольки букв состоит кодовое слово двери. Или можно больше чтоб запутать игрока. Если у вас на двери не кодовое слово, а целая фраза, тогда чтобы сделать пробел надо содать плиту с именем - "пробел". Все плиты должны быть Юзабельные(Usable).
Еще там есть рычаг после дерганья которого проверяется тот код, который вы набрали наступая на плитки. Если он правильный - закодированная дверь открывается, если нет - набранный код сбрасывается и игрока ударяет током.

OnUsed любой плиты с именем-буквой
Neverwinter Script Source
     /////////////////////////////////////////
    ////// Script for Coded Door ////////////
   /////// OnUsed any plate ////////////////
  //////// Date: 10.07.2004 ///////////////
 ///////// Created by Avaddon ////////////
/////////////////////////////////////////

void main()
{
string sCode = GetLocalString(GetObjectByTag("code_lock"),"code"); //code_lock - тэг рычага.
string sName = GetName(OBJECT_SELF);
object oCodedDoor = GetObjectByTag("coded_door"); //тэг запертой двери
if (GetLocked(oCodedDoor)==TRUE)
{
if (sName=="пробел")
{
//прибавлЯет к набраному коду пробел.
SetLocalString(GetObjectByTag("code_lock"), "code", sCode+" ");
SendMessageToPC(GetLastUsedBy(),"Вы наступили на символ ["+sName+"]");
SendMessageToPC(GetLastUsedBy(),"Набранный код: ["+sCode+" ]");
ApplyEffectAtLocation(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_IMP_MAGIC_RESISTANCE_USE), GetLocation(OBJECT_SELF));  //создает эффект нажатиЯ плиты.
}
else
{
//прибавлЯет к набронному коду ту букву, которой называетсЯ плита.
SetLocalString(GetObjectByTag("code_lock"), "code", sCode+sName);
SendMessageToPC(GetLastUsedBy(),"Вы наступили на символ ["+sName+"]");
SendMessageToPC(GetLastUsedBy(),"Набранный код: ["+sCode+sName+"]");
ApplyEffectAtLocation(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_IMP_MAGIC_RESISTANCE_USE), GetLocation(OBJECT_SELF));
//создает эффект нажатиЯ плиты.
}
}
else
{
SendMessageToPC(GetLastUsedBy(),"Хм..Эта плита запала в пол."); //если дверь уже открыта.
}
}


OnUsed рычага с тэгом "code_lock"
Neverwinter Script Source
     /////////////////////////////////////////
    ////// Script for Coded Door ////////////
   /////// OnUsed some Lever ///////////////
  //////// Date: 10.07.2004 ///////////////
 ///////// Created by Avaddon ////////////
/////////////////////////////////////////

void main()
{
string sNull=""; //пустой стринг на случай сброса кода.
string sCode = GetLocalString(OBJECT_SELF,"code"); //стринг набранного кода
object oCodedDoor = GetObjectByTag("coded_door"); //тэг запертой двери
object oPC = GetLastUsedBy();
effect eOpen = EffectVisualEffect(VFX_IMP_REMOVE_CONDITION); //эффект снЯтиЯ волшебных чар с двери.

if (GetLocked(oCodedDoor)==TRUE)
{
//кодовое слово-фраза длЯ открытиЯ двери - можете вписывать свое.
   if (sCode=="правильный код")    
   {
   PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);//анимациЯ рычага
   DelayCommand(2.0,PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE));
   SetLocked(oCodedDoor, FALSE); //открывает дверь.
   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eOpen,oCodedDoor,5.0); //эффект снЯтиЯ волшебных чар с двери.
   SendMessageToPC(GetLastUsedBy(),"Вы набрали правильный код. Волшебные чары пали и дверь открылась");
   ActionOpenDoor(oCodedDoor); //анимациЯ открытиЯ двери
   SetLocalString(OBJECT_SELF,"code",sNull); //сброс кода
   }
   else
   {
   SendMessageToPC(GetLastUsedBy(),"Вы набрали неверный код.");
   AssignCommand (OBJECT_SELF, ActionCastSpellAtObject(SPELL_ELECTRIC_JOLT, oPC, PROJECTILE_PATH_TYPE_DEFAULT)); //ударЯет игрока током если код неверный.
   PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);//анимациЯ рычага
   DelayCommand(2.0,PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE));
   SetLocalString(OBJECT_SELF,"code",sNull); //сброс кода
   }
}
else
{
SendMessageToPC(oPC,"Дверь уже открыта."); //без комментариев
}
}


Тестовый модуль можете скачать отсюда. Размер файла 9кб.
Аваддон
Небольшой, совсем простой скриптик банка.
В нем нет никаких паролей для снятия золота, проверок на CDKey или имя игрока. Это если вам надо сами добавите как SetLocalString и проверки тожеsmile.gif Или можно например на предмет-договор поставить Undropable. Чтоб воры не украли и игрок не передал.

Итак, у нас есть НПС - заведующий банком. Наш игрок заходит в банк и у него есть 3 действия: "балланс", "положить", "забрать". Все эти действия а так же ответы ДА и НЕТ производятся посредством обыкновенного чата(НЕ диалога). Если у него нет договора с банком то ему предлагают его завести и дают 1 минуту чтобы сказать да или нет. Если договор заведен - игрок может снять деньги со счета, положить на счет или узнать свой балланс.
Система основанна на LocalInt которые сохраняются на предметах вместе с игроком.

Скрипт ставится на OnSpawn НПС заведующего банком
Neverwinter Script Source
     /////////////////////////////////////////
    ////// Script for Interactive ///////////
   ///////// Mini Bank System //////////////
  /////// OnSpawn NPC Banker //////////////
 //////// Date: 11.07.2004 ///////////////
///////// Created by Avaddon ////////////
/////////////////////////////////////////

void main()
{
object oPC = GetLastSpeaker();
SetListening(OBJECT_SELF, 1);
SetListenPattern(OBJECT_SELF,"положить",1);
SetListenPattern(OBJECT_SELF,"забрать",2);
SetListenPattern(OBJECT_SELF,"балланс",3);
SetListenPattern(OBJECT_SELF,"да",4);
SetListenPattern(OBJECT_SELF,"нет",5);
}


Этот скрипт ставится на OnConversation НПС заведующего банком

Neverwinter Script Source
     /////////////////////////////////////////
    ////// Script for Interactive ///////////
   ///////// Mini Bank System //////////////
  /////// OnConversarion NPC Banker ///////
 //////// Date: 11.07.2004 ///////////////
///////// Created by Avaddon ////////////
/////////////////////////////////////////

#include "nw_i0_tool"
void main()
{
object oPC = GetLastSpeaker();
object oOffer = GetItemPossessedBy(oPC, "bank_offer"); // bank_offer - тэг договора.
int iAmount = StringToInt (GetMatchedSubstring (0));
int iAccount = GetLocalInt(oOffer, "money");
string sBallance = IntToString(iAccount);
string sBallancePlus = IntToString(iAccount+iAmount);
string sBallanceMinus = IntToString(iAccount-iAmount);
if(HasItem(oPC, "bank_offer"))
{
   if (GetListenPatternNumber()==10 && GetIsListening(OBJECT_SELF) && GetLocalInt(oPC,"account")==1)
   {
     if (iAmount>0)
       {
           if (iAmount<=GetGold(oPC))
           {
           SpeakString("Вы положили на счет "+GetMatchedSubstring(0)+"золотых монет.");
           TakeGoldFromCreature(iAmount,oPC,TRUE);
           SetLocalInt(oOffer,"money",iAccount+iAmount);
           SpeakString ("Ваш баланс на счете = "+sBallancePlus+" золотых монет.");
           DeleteLocalInt(oPC,"account");
           SetListenPattern(OBJECT_SELF,"DELETED",10);
           }
           else
           {
           SpeakString("У вас нет столько золота");
           }
       }
       else
       {
       SpeakString("Вы ввели неправильную величину");
       }
   }

    if (GetListenPatternNumber()==10 && GetIsListening(OBJECT_SELF) && GetLocalInt(oPC,"account")==2)
   {
     if (iAmount>0)
       {

           if (iAmount<=GetLocalInt(oOffer,"money"))
           {
           SpeakString("Вы забрали зо счета "+GetMatchedSubstring(0)+" золотых монет.");
           GiveGoldToCreature(oPC,iAmount);
           SetLocalInt(oOffer,"money",iAccount-iAmount);
           SpeakString ("Ваш баланс на счете = "+sBallanceMinus+" золотых монет.");
           DeleteLocalInt(oPC,"account");
           SetListenPattern(OBJECT_SELF,"DELETED",10);
           }
           else
           {
           SpeakString("На вашем счете нет столько золота");
           }
       }
       else
       {
       SpeakString("вы ввели неправильную величину");
       }
   }

   if (GetListenPatternNumber()==1 && GetIsListening(OBJECT_SELF))
   {

       SpeakString ("Сколько денег вы хотите положить на счет?");
       SetListenPattern(OBJECT_SELF,"**",10);
       SetLocalInt(oPC,"account",1);

   }
   if (GetListenPatternNumber()==2 && GetIsListening(OBJECT_SELF))
   {
   SetListenPattern(OBJECT_SELF,"DELETED",10);
   SpeakString ("Сколько денег вы хотите забрать?");
   SetListenPattern(OBJECT_SELF,"**",10);
   SetLocalInt(oPC,"account",2);
   }

   if (GetListenPatternNumber()==3 && GetIsListening(OBJECT_SELF))
   {
   SpeakString ("Ваш баланс на счете = "+sBallance+" золотых монет.");
   }
}
else
{
   if (GetListenPatternNumber()==1 && GetIsListening(OBJECT_SELF))
   {
   SpeakString ("Хм, разве мы подписывали с вами договор? Хотите завести счет? Даю вам минуту на размышление. Просто скажите [да] или [нет]");
   SetLocalInt(oPC,"new_account", TRUE);
   DelayCommand(60.0 , DeleteLocalInt(oPC,"new_account"));
   }
   if (GetListenPatternNumber()==2 && GetIsListening(OBJECT_SELF))
   {
   SpeakString ("Хм, разве мы подписывали с вами договор? Хотите завести счет? Даю вам минуту на размышление. Просто скажите [да] или [нет]");
   SetLocalInt(oPC,"new_account", TRUE);
   DelayCommand(60.0 , DeleteLocalInt(oPC,"new_account"));
   }
   if (GetListenPatternNumber()==3 && GetIsListening(OBJECT_SELF))
   {
   SpeakString ("Хм, разве мы подписывали с вами договор? Хотите завести счет? Даю вам минуту на размышление. Просто скажите [да] или [нет]");
   SetLocalInt(oPC,"new_account", TRUE);
   DelayCommand(60.0 , DeleteLocalInt(oPC,"new_account"));
   }
   if (GetListenPatternNumber()==4 && GetIsListening(OBJECT_SELF) && GetLocalInt(oPC,"new_account")== TRUE)
   {
   CreateItemOnObject("bank_offer", oPC, 1);
   SetLocalInt(oOffer, "money", 0);
   SpeakString("Большое спасибо, что воспользовались услугами нашего банка! Вот ваш договор!");
   SetListenPattern(OBJECT_SELF,"DELETED",10);
   }
   if (GetListenPatternNumber()==5 && GetIsListening(OBJECT_SELF) && GetLocalInt(oPC,"new_account")== TRUE)
   {
   SpeakString ("Ну нет, так нет.");
   DeleteLocalInt(oPC,"new_account");
   }


}
}


Айван: Молодец good.gif
Tarre Talliorne
Часть скрипта из нашей демки. У нас будет более продвинутая(в демо, думаю, включать не будем, но в релизе всего мода будет точно), чем в обыкновенном НВН система кастомных разговоров. Сейчас я (параллельно с лтом и АИ :-) ) пишу систему разговоров. Итак, решил бросить в Базу Скриптов коротенький скриптик. Суть: он ставит любое сцществительное в родительный падеж (string RusGenetiv). Параметр nSex - род: 1 - мужской, 2 - женский, 3 - средний.
Скрипт протестирован на 150 словах. Хотя, сами понимаете, русский язык сложен и этого кол-ва слов явно мало, посему если найдете ошибки, тут же сообщите.
ЗЫ: сейчас пишу Dativ & Akkusativ (наряду с Genetic самые употребительные) (на немецкий манер называю - мне языки германской группы вообще в последнее время ОЧЕНЬ нравятся :-) ), подумываю над прилагательными. (просто надо грамотно реализовать стековку имени + фамилии + прозвища)
ЗЫЫ: при использовании указание авторства обязательно

Neverwinter Script Source
// ПРОИЗВОДИТСЯ ОРФОГРАФИЧЕСКАЯ ПРОВЕРКА НА НЕЛЕКСИЧЕСКИЕ СОЧЕТАНИЯ
//   [SCRIPTED BY TARRE TALLIORNE! (TARRE@list.ru)]
string OrfographieTest(string sString);

// СТАВИТ СЛОВО sWord В РОДИТЕЛЬНЫЙ ПАДЕЖ;
// - ПАРАМЕТР "РОД" ( nSex ):
// 1 - МУЖСКОЙ,
// 2 - ЖЕНСКИЙ,
// 3 - СРЕДНИЙ.
//   [SCRIPTED BY TARRE TALLIORNE! (TARRE@list.ru)]
string RusGenetiv(string sWord, int nSex);

string ya()
{
return GetName(GetWaypointByTag("ya"));
}

int GetIsSound(string sLetter)
{
    int iResult = 0;
    //:://
    if (sLetter != "ь"&&
        sLetter != "ъ"&&
        sLetter != "" &&
        GetStringLength(sLetter)==1)
        {
        iResult = 1;
        }
    return iResult;
}

int GetIsVowel(string sLetter)
{
    int iResult = 0;
    if (!GetIsSound(sLetter))
        return iResult = -1;
    if (sLetter=="а" ||
        sLetter=="е" ||
        sLetter=="ё" ||
        sLetter=="и" ||
        sLetter=="о" ||
        sLetter=="у" ||
        sLetter=="э" ||
        sLetter=="ю" ||
        sLetter==ya() )
        {
        iResult = 1;
        }
    return iResult;
}

/*int GetIsSoft(string sLetter, string sNextLetter)
{
    int iResult;
    if (!GetIsSound(sLetter)                ||
       ( GetStringLength(sNextLetter)!=0    &&
         GetStringLength(sNextLetter)!=1)   ||
         GetIsVowel(sLetter))
         return iResult = -1;
    else if (sLetter == "й")
         return iResult = 1;
    else if (sNextLetter == "ь")
         return iResult = 1;
}*/


string OrfographieTest(string sString)
{
    //:://///////////:://
    //::// ЖИ - ШИ //:://
    //:://///////////:://

    //::// ОПРЕДЕДЯЕМ ПЕРЕМЕННЫЕ
    string sNew;
    int nZHi = FindSubString(sString, "Жы");
    int nzhi = FindSubString(sString, "жы");
    int nSHi = FindSubString(sString, "Шы");
    int nshi = FindSubString(sString, "шы");

    //::// "Жы"
    if (nZHi!=-1)
    {
    int nZH = nZHi;
    int nI = nZH + 1;
    string s1 = GetStringLeft(sString, nI);
    string s2 = GetStringRight(sString, GetStringLength(sString)-nI-1);
    sNew = s1+"и"+s2;
    }

    //::// "жы"

    else if (nzhi!=-1)
    {
    int nzh = nzhi;
    int nI = nzh + 1;
    string s1 = GetStringLeft(sString, nI);
    string s2 = GetStringRight(sString, GetStringLength(sString)-nI-1);
    sNew = s1+"и"+s2;
    }

    //::// "Шы"
    else if (nSHi!=-1)
    {
    int nSH = nSHi;
    int nI = nSH + 1;
    string s1 = GetStringLeft(sString, nI);
    string s2 = GetStringRight(sString, GetStringLength(sString)-nI-1);
    sNew = s1+"и"+s2;
    }

    //::// "шы"
    else if (nshi!=-1)
    {
    int nsh = nshi;
    int nI = nsh + 1;
    string s1 = GetStringLeft(sString, nI);
    string s2 = GetStringRight(sString, GetStringLength(sString)-nI-1);
    sNew = s1+"и"+s2;
    }

    //::// ЕСЛИ ЗНАКОМЫХ ОШИБОК НЕТ, ВОЗВРАЩАЕМ ИЗНАЧАЛЬНЫЙ sString
    else sNew = sString;
    return sNew;
}

string RusGenetiv(string sWord, int nSex)
{
    string sGenLast;
    string sOsnov;
    string sGenetiv;
    string sLast = GetStringRight(sWord, 1);
    //::////////////////////////////////////////////////:://
    //::// DEBUGGING [ deleted by author at 17.07.04 ]//:://
    //::// SpeakDebugString(OBJECT_SELF, sLast);////////:://
    //::////////////////////////////////////////////////:://
    switch (nSex)
    {
    //:://///////////////:://
    //::// МУЖСКОЙ РОД //:://
    //:://///////////////:://
    case 1:
        //::// ПОСЛЕДНЯЯ БУКВА ЗАМЕНЯЕТСЯ
        if (sLast=="а"||sLast==ya()||sLast=="й"||sLast=="ь")
        {
            if (sLast=="а")
                sGenLast = "ы";
                    else if (sLast==ya())
                        sGenLast = "и";
                            else if (sLast=="й"||
                                sLast=="ь")
                                    sGenLast = ya();
        sOsnov = GetStringLeft(sWord, GetStringLength(sWord)-1);
        sGenetiv = sOsnov + sGenLast;
        }
        //::// СЛОВО НЕ ИЗМЕНЯЕТ ФОРМУ
        else if (sLast=="е"||
                 sLast=="ё"||
                 sLast=="и"||
                 sLast=="о"||
                 sLast=="у"||
                 sLast=="э")
                 {
                 sGenetiv = sWord;
                 }
                 //::// В ДРУГИХ СЛУЧАЯХ СЛОВО ПРИБАВЛЯЕТ К СЕБЕ "А"
        else {
        sGenLast = "а";
        sOsnov = GetStringLeft(sWord, GetStringLength(sWord));
        sGenetiv = sOsnov + sGenLast;
        }
    break;

    //:://///////////////:://
    //::// ЖЕНСКИЙ РОД //:://
    //:://///////////////:://
    case 2:
        //::// ПОСЛЕДНЯЯ БУКВА ЗАМЕНЯЕТСЯ
        if (sLast=="а")
        {
        sGenLast = "ы";
        sOsnov = GetStringLeft(sWord, GetStringLength(sWord)-1);
        sGenetiv = sOsnov + sGenLast;
        }
        else if (sLast==ya()||sLast=="ь")
        {
        sGenLast = "и";
        sOsnov = GetStringLeft(sWord, GetStringLength(sWord)-1);
        sGenetiv = sOsnov + sGenLast;
        }
        //::// СЛОВО НЕ ИЗМЕНЯЕТ ФОРМУ
        else
        {
        sGenetiv = sWord;
        }
    break;

    //:://///////////////:://
    //::// СРЕДНИЙ РОД //:://
    //:://///////////////:://
    case 3:
        if (sLast=="о")
        {
        sGenLast = "а";
        sOsnov = GetStringLeft(sWord, GetStringLength(sWord)-1);
        sGenetiv = sOsnov + sGenLast;
        }
        if (sLast=="е")
        {
        sGenLast = ya();
        sOsnov = GetStringLeft(sWord, GetStringLength(sWord)-1);
        sGenetiv = sOsnov + sGenLast;
        }
        else sGenetiv = sWord;
    break;
    }
    sGenetiv = OrfographieTest(sGenetiv);
    return sGenetiv;
}
Valleo
Ладно думал я думал и решил тут отпостить простенький скриптик на отрыскивание изначально дисбалансированных фишек вещей и замену их другими, более сбалансированными.
Тут заменяются: хаст, трусинг, иммунитеты, фридум.
Хорошо для шарда =)

Neverwinter Script Source
//############################################################################//
//*    Система замены перманентных фишек вещи на более сбалансированные    *//
//*      Копирайт Valleo, созданно "непомню", и все такое в таком духе      *//
//############################################################################//

//* Эта функциЯ заменЯет старые свойства на новые
void NoCheatDeleteAndSetItemProperty(object oItem, itemproperty iItemProperty);

//* ФункциЯ проверЯет, допустимо ли это свойство, и если нет - возвращает FALSE
int NoCheatCheckItemProperty(itemproperty iItemProperty);

//* ПроверЯет все свойства вещи поочередно
void NoCheatItemProperty(object oItem);

//* Старт системы
void NoCheatStarting(object oPC);

//############################################################################//

void NoCheatDeleteAndSetItemProperty(object oItem, itemproperty iItemProperty)
{
itemproperty iNewItemPropert;
int iItemPropertyType = GetItemPropertyType(iItemProperty);
int iItemPropertySubType;
if(iItemPropertyType == ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS)
  {
  iItemPropertySubType = GetItemPropertySubType(iItemProperty);
  if(iItemPropertySubType == IP_CONST_IMMUNITYMISC_DEATH_MAGIC)
   {
   iNewItemPropert = ItemPropertyCastSpell(IP_CONST_CASTSPELL_DEATH_WARD_7, IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
   RemoveItemProperty(oItem,iItemProperty);
   AddItemProperty(DURATION_TYPE_PERMANENT,iNewItemPropert,oItem);
   }
  if(iItemPropertySubType == IP_CONST_IMMUNITYMISC_KNOCKDOWN)
   {
   iNewItemPropert = ItemPropertySkillBonus(SKILL_DISCIPLINE,10);
   RemoveItemProperty(oItem,iItemProperty);
   AddItemProperty(DURATION_TYPE_PERMANENT,iNewItemPropert,oItem);
   }
  if(iItemPropertySubType == IP_CONST_IMMUNITYMISC_CRITICAL_HITS)
   {
   iNewItemPropert = ItemPropertySkillBonus(SKILL_TUMBLE,10);
   RemoveItemProperty(oItem,iItemProperty);
   AddItemProperty(DURATION_TYPE_PERMANENT,iNewItemPropert,oItem);
   }
  }
if(iItemPropertyType == ITEM_PROPERTY_HASTE)
  {
  iNewItemPropert = ItemPropertyCastSpell(IP_CONST_CASTSPELL_HASTE_5, IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
  RemoveItemProperty(oItem,iItemProperty);
  AddItemProperty(DURATION_TYPE_PERMANENT,iNewItemPropert,oItem);
  }
if(iItemPropertyType == ITEM_PROPERTY_TRUE_SEEING)
  {
  iNewItemPropert = ItemPropertyCastSpell(IP_CONST_CASTSPELL_TRUE_SEEING_9, IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
  RemoveItemProperty(oItem,iItemProperty);
  AddItemProperty(DURATION_TYPE_PERMANENT,iNewItemPropert,oItem);
  }
if(iItemPropertyType == ITEM_PROPERTY_FREEDOM_OF_MOVEMENT)
  {
  iNewItemPropert = ItemPropertyCastSpell(IP_CONST_CASTSPELL_FREEDOM_OF_MOVEMENT_7, IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY);
  RemoveItemProperty(oItem,iItemProperty);
  AddItemProperty(DURATION_TYPE_PERMANENT,iNewItemPropert,oItem);
  }
}

int NoCheatCheckItemProperty(itemproperty iItemProperty)
{
int iDurationType = GetItemPropertyDurationType(iItemProperty);
if(iDurationType != DURATION_TYPE_PERMANENT)return FALSE;

int iItemPropertyType = GetItemPropertyType(iItemProperty);
if(iItemPropertyType == ITEM_PROPERTY_HASTE) return TRUE;
if(iItemPropertyType == ITEM_PROPERTY_TRUE_SEEING) return TRUE;
if(iItemPropertyType == ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS) return TRUE;
if(iItemPropertyType == ITEM_PROPERTY_FREEDOM_OF_MOVEMENT) return TRUE;
return FALSE;
}

void NoCheatItemProperty(object oItem)
{
itemproperty iItemProperty = GetFirstItemProperty(oItem);
while(GetIsItemPropertyValid(iItemProperty))
  {
  if(NoCheatCheckItemProperty(iItemProperty) && !GetPlotFlag(oItem)) NoCheatDeleteAndSetItemProperty(oItem, iItemProperty);
  iItemProperty = GetNextItemProperty(oItem);
  }
}

void NoCheatStarting(object oPC)
{
object oItem;
oItem = GetFirstItemInInventory(oPC);
while(oItem != OBJECT_INVALID)
  {
  NoCheatItemProperty(oItem);
  oItem = GetNextItemInInventory(oPC);
  }
int iSlot = 0;
for (iSlot; iSlot<14; iSlot++)
{
oItem = GetItemInSlot(iSlot, oPC);
if(GetIsObjectValid(oItem)) NoCheatItemProperty(oItem);
}
}

//############################################################################//

void main()
{
object oPC = GetEnteringObject(); //* ну тут что хотите, Я на On Enter модуля
NoCheatStarting(oPC);
}
Aiwan
Вот простенький скриптик, если НПС отойдет от своего POST_-а дальше 15 метров, то появится строка в диалоге.
Neverwinter Script Source
//::///////////////////////////////////////////////
//:: Copyright © 2004 WRG!
//:://////////////////////////////////////////////
/*
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 23.07.2004
//:://////////////////////////////////////////////

int StartingConditional()
{
    string sTag = ("POST_"+GetTag(OBJECT_SELF));
    object oWp = GetWaypointByTag(sTag);

    if (GetIsObjectValid(oWp) && GetDistanceBetween(oWp, OBJECT_SELF) > 15.0f)
        return TRUE;
    return FALSE;
}
Valleo
А вот скриптик, если при каких нибуть условиях вы не хотите, чтобы игрок рестился обычным методом через кнопку реста:

Neverwinter Script Source
object oPC = GetLastPCRested();
if(GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED)
  {
  SendMessageToPC(oPC,"Рест через кнопку реста отменен."); //Это можно и убрать
  AssignCommand(oPC, ClearAllActions());
  }
Lex
автор: _kaa_

Вот стандартный файл для алкоголя:
Neverwinter Script Source
//::///////////////////////////////////////////////
//:: NW_S3_Alcohol.nss
//:: Copyright © 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
  Makes beverages fun.
  May 2002: Removed fortitude saves. Just instant intelligence loss
*/

//:://////////////////////////////////////////////
//:: Created By:   Brent
//:: Created On:   February 2002
//:://////////////////////////////////////////////

void DrinkIt(object oTarget)
{
   // AssignCommand(oTarget, ActionPlayAnimation(ANIMATION_FIREFORGET_DRINK));
   AssignCommand(oTarget,ActionSpeakStringByStrRef(10499));
}

void MakeDrunk(object oTarget, int nPoints)
{
    if (Random(100) + 1 < 40)
        AssignCommand(oTarget, ActionPlayAnimation(ANIMATION_LOOPING_TALK_LAUGHING));
    else
        AssignCommand(oTarget, ActionPlayAnimation(ANIMATION_LOOPING_PAUSE_DRUNK));

    effect eDumb = EffectAbilityDecrease(ABILITY_INTELLIGENCE, nPoints);
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDumb, oTarget, 60.0);
//   AssignCommand(oTarget, SpeakString(IntToString(GetAbilityScore(oTarget,ABILITY_INTELLIGENCE))));
}
void main()
{
    object oTarget = GetSpellTargetObject();
   // SpeakString("here");
    // * Beer
    if (GetSpellId() == 406)
    {
        // *burp*
        //AssignCommand(oTarget, SpeakString("Beer"));
        DrinkIt(oTarget);
//        if (FortitudeSave(oTarget, d20()+10) == TRUE)
        {
            MakeDrunk(oTarget, 1);
        }
    }
    else
    // *Wine
    if (GetSpellId() == 407)
    {
        DrinkIt(oTarget);
//        if (FortitudeSave(oTarget, d20()+10 +2) == TRUE)
        {
            MakeDrunk(oTarget, 2);
        }
    }
    else
    // * Spirits
    if (GetSpellId() == 408)
    {
        DrinkIt(oTarget);
//        if (FortitudeSave(oTarget, d20()+10) == TRUE)
        {
            MakeDrunk(oTarget, 3);
        }
     }

}


Самый простой способ добавить что-то:

Так была реализованна отрава на Экзисе по заказу Илэссэ smile.gif
Обрабатывался тег бутылки. Последние цифры преобразовывались в задержку, после который выпивший эту гадость умирал, дрыгая ногами.

Neverwinter Script Source
object oItem = GetSpellCastItem();
    if (GetStringUpperCase(GetStringLeft(GetTag(oItem),13))=="AX_IT_POISON_"){
        float PoisonType = StringToFloat(GetStringRight(GetTag(oItem),GetStringLength(GetTag(oItem))-13));
        DelayCommand(PoisonType, ExecuteScript("lg_anim_death",oTarget));

Вот вызываемый скрипт смерти: `lg_anim_death`
Neverwinter Script Source
void main()
{
    AssignCommand(OBJECT_SELF,ClearAllActions());
    AssignCommand(OBJECT_SELF,ActionPlayAnimation(ANIMATION_LOOPING_SPASM));
    DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectKnockdown(),OBJECT_SELF,4.0));
    DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectDeath(TRUE),OBJECT_SELF));
    DelayCommand(4.0, SendMessageToPC(OBJECT_SELF,"Âàñ îòðàâèëè"));


Добавлено в [mergetime]1092332152[/mergetime]
<small>Добавлено в 17:26</small>
Шпаргалка Айвана по скриптам

Код

дело в том, что при

object oJamp = GetTransitionTarget(OBJECT_SELF);
if (GetIsPC(oPC))
{
AssignCommand(oPC, JumpToObject(oJamp));

НЕ ВСЕГДА МОЖЕТ ПРОИЗОЙТИ СКАЧОК
надо делать так:

string sJamp = GetTag(GetTransitionTarget(OBJECT_SELF));
....
JumpToObject(GetObjectByTag(sJamp));


************************************************
tag = mask + INtToString(Number);
mask = "WP_NPCTAG_"
Number = 1..12

*************************************************

DestroyObject(GetItemInSlot(INVENTORY_SLOT_CARMOR,oPC));

*************************************************
>    ЖУРНАЛЬНЫЕ ЗАПИСИ ПО КВЕСТОВЫМ ПРЕДМЕТАМ

object oItem=GetModuleItemAcquired();
if(GetTag(oItem)=="SEAMAGAZIN_PIRAT")
{
 if(GetLocalInt(oItem,"DO_ONCE")!=1 && GetItemPossessor(oItem) == GetFirstPC())
  {
 AddJournalQuestEntry("ANDRA_PIRATES", 4, GetFirstPC());
 SetLocalInt(oItem,"DO_ONCE",1);
  }
}

*****************************************************
> Увеличение числа переменной на единицу за раз.
SetLocalInt(объект_1, "переменная_1", GetLocalInt(объект_1, "переменная_1") + 1);

На кого ставится переменная?
объект_1 = OBJECT_SELF - если на сам триггер
            или
GetEnteringObject() - если на наступившего

********************************          
> Рандом на начало строки
int StartingConditional()
{

  // Add the randomness
  if(Random(100) >= 15)
      return FALSE;

  return TRUE;
}

*************************************************
> Дестрой нескольких объектов по одинаковому тэгу.
при СreateObject укажи новый тэг "new_tag"
а потом, когда условие соблюдено, делаешь так:
void main()
{
int i=0;
object oScelet = GetObjectByTag("new_tag",i);
while (oScelet!=OBJECT_INVALID)
 {
 DestroyObject(oScelet);
 i++;
 oScelet = GetObjectByTag("new_tag",i)
 }
}

****************************************************
> Проверка шмотки на игроке

if (GetTag(GetItemInSlot(INVENTORY_SLOT_CARMOUR,GetPCSpeaker())=="тэг нужной шмотки")

>***************************************
> ВХОД в локацию по проверке переменной
object oPC = GetEnteringObject();
object oDoor = GetObjectByTag("тэг_двери1"); // до затопления
if (!GetIsPC(oPC))
   return;
if (GetLocalInt(oPC, "FLOODED") == 1)
  oDoor = GetObjectByTag("тэг_двери2"); // после затопления
AssignCommand(oDoor, ActionOpenDoor(oDoor));
AssignCommand(oPC, JumpToObject(oDoor));

>***************************************
// Скрипт может стоять НА PC в диалоге!!!

void main()
{
object oPC = GetPCSpeaker();
object oItem = GetItemPossessedBy(oPC, "ZAVTRAK");
if (GetTag(oItem) == "ZAVTRAK")
{
 SpeakString("Смотри не лопни!");
 DestroyObject(oItem); // УБИВАЕТ ПРЕДМЕТ
}
else
{
 SpeakString("Ой! Да где же оно?");
}
}
>******************************************
// Скрипт должен стоять НА НЕПИСЕ!!!

void main()
{
object oPC = GetPCSpeaker();
object oItem = GetObjectByTag("ZAVTRAK");
if (GetTag(GetItemPossessedBy(oPC, "ZAVTRAK")) == "ZAVTRAK")
{
 SpeakString("Смотри не лопни!");
 ActionGiveItem(oItem, oPC);  // ОТДАЕТ ПРЕДМЕТ
}
else
{
 SpeakString("Ой! Да где же оно?");
}
}

>******************************************
void main()
{
object oPC = GetPCSpeaker();
object oItem = GetItemPossessedBy(oPC, "MINERS_PISMO");
object oNos = GetObjectByTag("SUPER_NOS_IN_MARKET");
AssignCommand (oNos, JumpToObject(GetObjectByTag("POISON_SUPER_NOS")));
if (GetTag(oItem) == "MINERS_PISMO")
{
 DestroyObject(oItem); // УБИВАЕТ ПРЕДМЕТ
 SpeakString("Отлично, Грэмм у нас в руках!");
}
}
>******************************************
> Дает вещь из палитры, а не из инвентаря
object oPC = GetFirstPC();
CreateItemOnObject("ResRef-вещи", oPC, число);

Последний параметр нужен только если ты даешь типа стрел или пуль...
короче количество в ячейке инвентаря. Само собой 2 меча ты дать
таким образом не сможешь :)...
>******************************************

<small>Добавлено в 17:29</small>
автор Valleo

Маленький скриптик для реализации болота:
Neverwinter Script Source
void StartBog()
{
object oBog = OBJECT_SELF;
object oArea = GetArea(oBog);
location lLocation = GetLocation(oBog);
location lLoc;
location lLocat;
object oObject = GetFirstObjectInShape(SHAPE_SPHERE,100.0,lLocation,FALSE,OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oObject))
{
lLoc = GetLocation(oObject);
lLocat = GetLocalLocation(oObject,"BOGLOC");
if(GetIsObjectValid(GetAreaFromLocation(lLocat)))
  {
  float fDist = GetDistanceBetweenLocations(lLoc,lLocat);
  if(fDist < 5.0)
   {
   effect eSlow = EffectMovementSpeedDecrease(75);
   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSlow,oObject,70.0);
   FloatingTextStringOnCreature("Вас засасывает в бололто...",oObject,FALSE);
   }
  }
SetLocalLocation(oObject,"BOGLOC",lLoc);
oObject = GetNextObjectInShape(SHAPE_SPHERE,100.0,lLocation,FALSE,OBJECT_TYPE_CREATURE);
}
}
void main()
{
object oBog = OBJECT_SELF;
int iTimer = GetLocalInt(oBog,"TIMER");
if(iTimer <= 9)
{
iTimer = iTimer + 1;
SetLocalInt(oBog,"TIMER",iTimer);
return;
}
SetLocalInt(oBog,"TIMER",0);
StartBog();
}
Aiwan
Вот простой скриптик, ставится на строку НПС и во время длинного расказа, происходит, как бы временной интервал с потухшим экраном. Что то навроде, как в кино: "Прошло два года..." :?)

Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Created By: WRG! Aiwan aiwan@e-mail.ru
//:: Created On: 21.12.2003
//:://////////////////////////////////////////////
/*
            ПАУЗА В РАЗГОВОРЕ С НПС
*/

//:://////////////////////////////////////////////
void main()
{
    object oPC = GetPCSpeaker();
    AssignCommand(OBJECT_SELF, ActionPauseConversation());
    AssignCommand(OBJECT_SELF, FadeToBlack(oPC, FADE_SPEED_SLOW));
    AssignCommand(OBJECT_SELF, ActionWait(4.0));
    AssignCommand(OBJECT_SELF, FadeFromBlack(oPC, FADE_SPEED_SLOW));
    SetTime(GetTimeHour()+(Random(4)), GetTimeMinute()+(Random(60)), 0, 0);
    AssignCommand(OBJECT_SELF, ActionResumeConversation());
}
Twin
Благодаря советам вышестоящих модераторов в другом топике, я таки дописал респаунинг NPC по событию их смерти, без использования энкаунтеров. wink.gif Это может кому-нибудь пригодиться, т.к. нет проблемы с "пересечением" области энкаунтера игроком и т.п., NPC может появится прямо перед носом игрока.

Для работы скрипта нам потребуется создать плейс с тэгом PLC_AUTORESPAWN. Любой плейс, он нужен лишь для того, чтобы на него вешать DelayCommand. Лично я ставил этот плейс в "системную" локу 8x8, которая только для подобных целей и была создана. У меня не получилось повесить DelayCommand на вейпоинт, иначе бы плейс создавать и не потребовалось бы. wink.gif
Создаем новый файл скрипта, который будет инклюдится к событию смерти:

Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Created By: Twin
//:: Communication:
//::  E-mail: twin_quad@hotmail.com
//::  IRC: Twin@irc.rinet.ru:6669
//::
//:: Created On: 2004.10
//:://////////////////////////////////////////////

void doSpawn(string sResRef, string sTag, location locWhere, int nRespawnTime, int nMaxSpawns, int nCurrent, int bAnimation);

void cycleSpawn(object oNPC)
{
    object oRespawner = GetObjectByTag("PLC_AUTORESPAWN");
    if ( !GetIsObjectValid(oRespawner) )
        return;

    int nRespawnTime = GetLocalInt(oNPC, "respawn_time");
    if ( nRespawnTime <= 0 )
        return;

    string sWaypoint = GetTag(oNPC);
    if ( FindSubString(sWaypoint, "NPC_") == 0 )
        sWaypoint = GetStringRight(sWaypoint, GetStringLength(sWaypoint) - 4);
    sWaypoint = "WPR_" + sWaypoint;

    int bAnimation = GetLocalInt(oNPC, "respawn_animation");
    int nMaxSpawns = GetLocalInt(oNPC, "respawn_max");
    int nCurrent  = GetLocalInt(oNPC, "respawn_current");
    if ( nCurrent == 0 )
        nCurrent = 1;

    if ( (nMaxSpawns <= 0 || nCurrent < nMaxSpawns) && GetIsObjectValid(GetObjectByTag(sWaypoint)) )
    {
        //SendMessageToPC(GetFirstPC(), "Next respawn in "+ IntToString(nRespawnTime) +" seconds.");
        //SendMessageToPC(GetFirstPC(), "Current/Max: "+ IntToString(nCurrent) +"/"+ IntToString(nMaxSpawns));

        string sResRef = GetResRef(oNPC);
        string sTag = GetTag(oNPC);
        location locWhere = GetLocation(GetObjectByTag(sWaypoint));

        AssignCommand(oRespawner,
            DelayCommand(IntToFloat(nRespawnTime),
                doSpawn(sResRef, sTag, locWhere, nRespawnTime, nMaxSpawns, nCurrent, bAnimation)
            )
        );
    }
}

void doSpawn(string sResRef, string sTag, location locWhere, int nRespawnTime, int nMaxSpawns, int nCurrent, int bAnimation)
{
    object oNPC;
    oNPC = CreateObject(OBJECT_TYPE_CREATURE, sResRef, locWhere, bAnimation, sTag);

    nCurrent++;
    SetLocalInt(oNPC, "respawn_time", nRespawnTime);
    SetLocalInt(oNPC, "respawn_max", nMaxSpawns);
    SetLocalInt(oNPC, "respawn_current", nCurrent);
    SetLocalInt(oNPC, "respawn_animation", bAnimation);

    //SendMessageToPC(GetFirstPC(), "doSpawn("+ sResRef +", "+ sTag +")");
}


Далее ставим на карту требуемого NPC, в скрипте OnDeath или UserDefined на событие 1007 (главное чтобы во время смерти срабатывало) в самом начале вставляем:
Neverwinter Script Source
#include "название созданного выше скрипта"


И где-нибудь ближе к концу скрипта смерти вставляем:
Neverwinter Script Source
cycleSpawn(OBJECT_SELF);


Настраивается это всё просто. Заходим в Variables созданного NPC и добавляем переменные (все типа int):
respawn_time - Количество секунд, через которое появится новый NPC.
respawn_max - Необязательный параметр. Максимальное количество респаунов NPC.
respawn_animation - Необязательный параметр. Проигрывать ли анимацию во время создания NPC [0/1].

Можно настраивать Variables прямо в синьке NPC, на эффект это не влияет.

Место где появится новый NPC определяется путём выставления вэйпоинтов с названием типа "WPR_"+ тэг_умершего_NPC. Если в начале тэга NPC стоит "NPC_", то эти четыре символа отрежутся.

Всё.

При желании можно можно сохранять любые параметры умирающего NPC, даже случайный лут скопировать с трупа и загрузить в слудеющий респаун такой же. В общем всё что угодно.

Надеюсь кому-нибудь пригодится. wink.gif

P.S. Забыл о вэйпоинтах написать... Исправлено.
Аваддон
Этот скрипт можно ставить на факел, фонарь, или луч света. Например факелы и фонари можно расставить по городу. А лучи света или магические брызги - к фонтанам. И когда в городе наступит ночь - зажгуться факелы и будут освещать территорию, а у фонтанов заработает подсветка. Скрипт ставит OnHB плейса. Не забудьте снять галочку Static.
Neverwinter Script Source
void main()
{
   object oSelf = OBJECT_SELF;
   if (GetIsDay()==FALSE && GetLocalInt(OBJECT_SELF,"on")!=1)
   {
   SetLocalInt(OBJECT_SELF,"on",1);
   PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);
   effect eLight = EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_10);
   ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLight, oSelf);
   }

   if (GetIsDay()==TRUE && GetLocalInt(OBJECT_SELF,"on")==1)
   {
   SetLocalInt(OBJECT_SELF,"on",0);
   PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE);
   effect eEffect = GetFirstEffect(oSelf);
   while (GetIsEffectValid(eEffect) == TRUE)
       {
       if (GetEffectType(eEffect) == EFFECT_TYPE_VISUALEFFECT)
          RemoveEffect(oSelf, eEffect);
          eEffect = GetNextEffect(oSelf);
       }
   }

}
Аваддон
Скрипт получения уровня по алайменту написал [MoF]Darth_Nick. Там он использовал визуальные эффекты для разных алайментов. Я лишь добавил немного своего в этот скрипт. И так, получение лвла по алайменту а-ля горец biggrin.gif
Neverwinter Script Source
void main()
{
object oPC = GetPCLevellingUp();

if(GetAlignmentGoodEvil(oPC) == ALIGNMENT_EVIL)
{
SetCutsceneMode(oPC, TRUE);
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), GetLocation(oPC), 8.0);
AssignCommand(oPC, PlayAnimation(ANIMATION_LOOPING_SPASM,1.0,5.0));
DelayCommand(1.0,AssignCommand(oPC,PlayVoiceChat(VOICE_CHAT_LAUGH)));
DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SUMMON_EPIC_UNDEAD), oPC));
DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HARM), oPC));
DelayCommand(4.0,AssignCommand(oPC, PlayAnimation(ANIMATION_LOOPING_DEAD_FRONT,1.0,10.0)));
DelayCommand(3.8,AssignCommand(oPC,PlayVoiceChat(VOICE_CHAT_DEATH)));
DelayCommand(5.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SLEEP), oPC));
DelayCommand(10.0,SetCutsceneMode(oPC, FALSE));
}
else if(GetAlignmentGoodEvil(oPC) == ALIGNMENT_GOOD)
{
SetCutsceneMode(oPC, TRUE);
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), GetLocation(oPC), 8.0);
AssignCommand(oPC, PlayAnimation(ANIMATION_LOOPING_SPASM,1.0,5.0));
DelayCommand(1.0,AssignCommand(oPC,PlayVoiceChat(VOICE_CHAT_NEARDEATH)));
DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HOLY_AID), oPC));
DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SUNBEAM), oPC));
DelayCommand(4.0,AssignCommand(oPC, PlayAnimation(ANIMATION_LOOPING_DEAD_FRONT,1.0,10.0)));
DelayCommand(3.8,AssignCommand(oPC,PlayVoiceChat(VOICE_CHAT_DEATH)));
DelayCommand(5.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SLEEP), oPC));
DelayCommand(10.0,SetCutsceneMode(oPC, FALSE));
}
else if(GetAlignmentGoodEvil(oPC) == ALIGNMENT_NEUTRAL)
{
SetCutsceneMode(oPC, TRUE);
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), GetLocation(oPC), 8.0);
AssignCommand(oPC, PlayAnimation(ANIMATION_LOOPING_SPASM,1.0,5.0));
DelayCommand(1.0,AssignCommand(oPC,PlayVoiceChat(VOICE_CHAT_NEARDEATH)));
DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SOUND_BURST), oPC));
DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HEALING_X), oPC));
DelayCommand(4.0,AssignCommand(oPC, PlayAnimation(ANIMATION_LOOPING_DEAD_FRONT,1.0,10.0)));
DelayCommand(3.8,AssignCommand(oPC,PlayVoiceChat(VOICE_CHAT_DEATH)));
DelayCommand(5.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SLEEP), oPC));
DelayCommand(10.0,SetCutsceneMode(oPC, FALSE));
}
}
Аваддон
Ой, чето зачастил я со скриптамиsmile.gif Но надеюсь пригодится dntknw.gif
Этот скрипт на отдых. Для начала разберемся с условиями отдыха:

1. У игрока должна быть кроватка(подстилка) aka бэдролл
2. Так же должна быть в наличие еда.
3. Расстояние от разведенного костра должно быть не более 3х метров.
4. Если игрок спит в тяжелых доспехах (более 20 lbs) то у него есть риск заболеть, вредно ведь для здоровьица геройского. Но спасы рулятwink.gif А если не рулят то придется переодеваться в пижамку (гы-гы biggrin.gif )

Чтобы развести костер надо:
1. Найти дрова (сами запихнете их в какое нить дупло и т.п.)
2. Разложить дрова на земле.
3. Пожечь факелом.
4. Костер горит 180 сек (можете сами регулировать)
5. Если вы используете выложенные дрвоа без факела - игрок их поднимает, если с факелом - разводит костер.

Теперь с предметами:

Item'ы:
Подстилка - тэг [bedroll]
Еда - тэг [food]
Дрова - тэг [wood]

Placeable'ы:
Костер - синька [camp]
Подстилка (внешне выглядит как раскатаная из рулона ткань) - синька [place_bedroll]
Дрова (внешне выглядит как куча дров aka woodpile biggrin.gif) - синька [place_wood] .

P.S. Синька это Blueprint ResRef

Со всех плейсов снимите галочку Static! А плейс Дрова должен быть Используемый.

Поехали...

Скрипт ставится на OnPlayerRest
Neverwinter Script Source
//////////////////////////////////////////////////
////////////Avaddon's Rest System//////////
////////// Script On Player Rest ////////////
////////// Date: 12.10.2004 ///////////////
//////// Created by: Avaddon ////////////
/////////////////////////////////////////////

#include "nw_i0_tool"
void main()
{
object oPC = GetLastPCRested();
object oCamp = GetNearestObjectByTag("camp",oPC);
object oBedroll = GetNearestObjectByTag("place_bedroll",oPC);
effect eSleep = EffectVisualEffect(VFX_IMP_SLEEP);
effect eBlind = EffectBlindness();
effect eDisease = EffectDisease(DISEASE_SOLDIER_SHAKES);

    if (GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED) //отдых начат
    {
        if(GetIsObjectValid(oCamp)!=TRUE) //проверка расстоЯниЯ до костра
        {
         FloatingTextStringOnCreature("Здесь слишком холодно",oPC,FALSE);
         AssignCommand(oPC,ClearAllActions()); //отмена отдыха
        }
       else
       {
       if(GetDistanceBetween(oPC,oCamp)>3.0)
       {
       FloatingTextStringOnCreature("Здесь слишком холодно",oPC,FALSE);
       AssignCommand(oPC,ClearAllActions()); //отмена отдыха
       }
       else
         {
        if (HasItem(oPC,"bedroll")==TRUE) //проверка на наличие подстилки
        {
            if (HasItem(oPC,"food")==TRUE) //проверка на наличие еды
            {
            ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSleep,oPC,30.0); // Эффект Z-z-z
            FadeToBlack(oPC, FADE_SPEED_SLOW); //тушим свет
            CreateObject(OBJECT_TYPE_PLACEABLE,"place_bedroll",GetLocation(oPC)); // Расстилаем подстилку
            DestroyObject(GetItemPossessedBy(oPC,"food")); //съедаем еду
            DestroyObject(GetItemPossessedBy(oPC,"bedroll")); //забираем у игрока подстилку из инвентори (реализм, блин)
            SetLocalInt(oPC,"slept",1); //сон удачен
            }
            else
            {
            FloatingTextStringOnCreature("Не боитесь помереть во сне от голода?!",oPC,FALSE);
            AssignCommand(oPC,ClearAllActions());
            }
        }
        else
        {
        FloatingTextStringOnCreature("Вам не на чем спать",oPC,FALSE);
        AssignCommand(oPC,ClearAllActions());
        }
       }
       }
    }
   if (GetLastRestEventType() == REST_EVENTTYPE_REST_FINISHED) //отдых закончен
   {
   FadeFromBlack(oPC, FADE_SPEED_SLOW); //продираем глазки
   DestroyObject(oBedroll); //убираем подстилку
   SetLocalInt(oPC,"slept",0); //отдых удачно окончен
   CreateItemOnObject("bedroll", oPC,1); // отдаем игроку в инвентори его подстилку
   if (GetWeight(GetItemInSlot(INVENTORY_SLOT_CHEST,oPC))>20) // проверка на вес брони
   {
   ApplyEffectToObject(DURATION_TYPE_INSTANT,eDisease,oPC); //игрок заболел
   }

   }

   if (GetLastRestEventType() == REST_EVENTTYPE_REST_CANCELLED) //отдых прерван
   {
   if(GetLocalInt(oPC,"slept")==1) //если отдых был прерван после того как он был успешно начат
   {
   FadeFromBlack(oPC, FADE_SPEED_FAST); //быстро продираем глазки
   DestroyObject(oBedroll); //убираем подстилку
   FloatingTextStringOnCreature("Вы проснулись от сильного шума, но глаза еще не привыкли к свету.",oPC,FALSE);
   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSleep,oPC,10.0); //сонный игрок
   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eBlind,oPC,10.0); //еще не проснулсЯ
   SetLocalInt(oPC,"slept",0); //успешный отдых прерван
   CreateItemOnObject("bedroll", oPC,1); // возвращаем в инвентори подстилку
   }
   }

}


Скрипт ставится на UnAcquireItem
Neverwinter Script Source
/////////////////////////////////////////
    //////////Avaddon's Rest System//////////
   ////// Script On UnAcquireItem //////////
  //////// Date: 12.10.2004 ///////////////
  //////// Created by: Avaddon ////////////
/////////////////////////////////////////
void main()
{
object oLost = GetModuleItemLost();
object oPC = GetModuleItemLostBy();
if (GetTag(oLost)=="wood")
{
CreateObject(OBJECT_TYPE_PLACEABLE,"place_wood",GetLocation(oPC)); //выкладываем плейс дров
DestroyObject(oLost); //уничтожаем выложенны мешочек с итемом дров
}
}


Скрипт ставится на On Used плейса дров
Neverwinter Script Source
/////////////////////////////////////////
    //////////Avaddon's Rest System//////////
   ////// Script On Used Woodpile //////////
  //////// Date: 12.10.2004 ///////////////
  //////// Created by: Avaddon ////////////
/////////////////////////////////////////
#include "nw_i0_tool"
void main()
{
object oPC = GetLastUsedBy();

    if (GetIsPC(oPC)==TRUE)
    {
    if (GetTag(GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC))=="NW_IT_TORCH001") //проверка - есть ли факел в руке
    {
    AssignCommand(oPC,PlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,2.0));
    CreateObject(OBJECT_TYPE_PLACEABLE,"camp",GetLocation(OBJECT_SELF),TRUE);// если есть - поджигаем костер
    DestroyObject(OBJECT_SELF); //убираем дрова
    }
    else
    {
    DestroyObject(OBJECT_SELF);
    CreateItemOnObject("wood",oPC,1); //если нет - игрок поднимает дрова
    }
}
}


Скрипт ставится на On Heartbeat костра
Neverwinter Script Source
/////////////////////////////////////////
    //////////Avaddon's Rest System//////////
   ////// Script On Heartbeat Campfire /////
  //////// Date: 12.10.2004 ///////////////
  //////// Created by: Avaddon ////////////
/////////////////////////////////////////

void main()
{
int iFire = GetLocalInt(OBJECT_SELF,"fire");

if (iFire<1)
{
SetLocalInt(OBJECT_SELF,"fire",6);
}
else
{
SetLocalInt(OBJECT_SELF,"fire",iFire+6);
}

if (iFire>180) //проверка - прошло ли более 180 секунд
{
DeleteLocalInt(OBJECT_SELF,"fire");
DestroyObject(OBJECT_SELF);
}
}


Эээ вроде ничего не напутал. Если что не получается - скажите, я поправлю.
Lex
Источник: Валут.
Нашел: Авадон.

Neverwinter Script Source
// Make a large SoU bench usable by 3 creatures simultaneously
void main()
{
    // Set some variable for a beter understanding
    object oPlayer = GetLastUsedBy();
    object oBench = OBJECT_SELF;

    // Get a hold on the 3 pillows
    object oPillow1 = GetLocalObject( OBJECT_SELF, "Pillow 1" );
    object oPillow2 = GetLocalObject( OBJECT_SELF, "Pillow 2" );
    object oPillow3 = GetLocalObject( OBJECT_SELF, "Pillow 3" );

    // If "pillow 1" do not exist, create 3 of them and attach them to the bench
    if( !GetIsObjectValid( oPillow1 ) )
    {
        // Set up some variable for understanding
        object oArea = GetArea( oBench );
        vector locBench = GetPosition( oBench );
        float fOrient = GetFacing( oBench );

        // You can change the space between pillows changing this value
        float fSpace = 1.0f;

        // Calculate location of the 3 pillows
        location locPillow1 = Location( oArea, locBench + AngleToVector( fOrient + 90.0f ) * fSpace, fOrient );
        location locPillow2 = Location( oArea, locBench + AngleToVector( fOrient - 90.0f ) * fSpace, fOrient );
        location locPillow3 = Location( oArea, locBench, fOrient );

        // Create the 3 pillows
        oPillow1 = CreateObject( OBJECT_TYPE_PLACEABLE, "plc_invisobj", locPillow1 );
        oPillow2 = CreateObject( OBJECT_TYPE_PLACEABLE, "plc_invisobj", locPillow2 );
        oPillow3 = CreateObject( OBJECT_TYPE_PLACEABLE, "plc_invisobj", locPillow3 );
   
        // "attach" the pillows to the bench
        SetLocalObject( OBJECT_SELF, "Pillow 1", oPillow1 );
        SetLocalObject( OBJECT_SELF, "Pillow 2", oPillow2 );
        SetLocalObject( OBJECT_SELF, "Pillow 3", oPillow3 );
    }
   
    // Get a hold on the nearest invisible object, (maybe a pillow)
    int iDistance = 1;
    object oPillow = GetNearestObjectByTag( "InvisibleObject", oPlayer, iDistance );
   
    // while we find invisible object and that we did not check the 3 linked pillows
    int iCount = 0;
    while( GetIsObjectValid( oPillow ) || iCount < 3 )
    {
        // if it is one of the three pillow linked the the bench
        if( oPillow == oPillow1 || oPillow == oPillow2 || oPillow == oPillow3 )
        {
            iCount = iCount + 1 ;
            // If available
            if( !GetIsObjectValid( GetSittingCreature( oPillow ) ) )
            {
                // Sit and quit the script
                AssignCommand( oPlayer, ActionSit( oPillow ) );
                return;
            }
        }
        // Get the next nearest invisible object
        iDistance = iDistance + 1;
        oPillow = GetNearestObjectByTag( "InvisibleObject", oPlayer, iDistance );
    }
}

Аваддон
Я тут написал пару скриптиков. Они для сервера использующего APS/NWNX 2 + MySQL.
Естественно писал для своих нужд, но может кому и пригодится.
Главная его цель - информативность.
Если вы умеете работатьс MySQL то польза от него будет большая. Он регистрирует персонажей. Потом просмтривая БД вы можете узнать сколько:
-Игроков зарегистрированно
-ДМов зарегистрированно
-Персонажей на одном аккаунте
-Персонажей на одном IP
-Персонажей на одном CD-Key
-Аккаунтов на одном IP
-Аккаунтов на одном CD-Key
-Сколько персонажей определенной расы на шарде
-Сколько персонажей определенной под-расы на шарде
-Сколько персонажей поклоняются определнному одинаковому божеству, и поклоняются ли вообще
-Сколько персонажей мужских, а сколько женских.
-Дату создания персонажа.
-ну и еще что-нибудь если забыл.
Да, если кто нибудь напишет PHP форму для статистики читающую из этой БД - это будет замечательно - тогда срочно свяжитесь со мнойsmile.gif

Скрипты:

Скрипт aps_include поставляется в erf архиве вместе с APS/NWNX 2.

Скрипт на OnModuleLoad:

Neverwinter Script Source
#include "aps_include"
void main()
{
SQLInit();
string sSQL="CREATE TABLE `reg_data` ("+
"  `status` varchar(64) NOT NULL default '',"+
"  `login` varchar(64) NOT NULL default '',"+
"  `name` varchar(64) NOT NULL default '',"+
"  `gender` char(1) NOT NULL default '',"+
"  `race` varchar(100) NOT NULL default '',"+
"  `sub_race` varchar(100) NOT NULL default '',"+
"  `deity` varchar(100) NOT NULL default '',"+
"  `cd_key` varchar(64) NOT NULL default '',"+
"  `ip` varchar(25) NOT NULL default '',"+
"  `creation_date` datetime NOT NULL default '0000-00-00 00:00:00',"+
") TYPE=MyISAM;";


  SQLExecDirect("DESCRIBE reg_data");
  //Если таблицы нет - создаем ее
  if (SQLFetch()!= SQL_SUCCESS)
  {
    SQLExecDirect(sSQL);
  }
}


Скрипт на OnClientEnter:
Neverwinter Script Source
#include "aps_include"
void main()
{
object oPC=GetEnteringObject();
string sName=SQLEncodeSpecialChars(GetName(oPC));//ИМЯ персонажа
string sLogin=SQLEncodeSpecialChars(GetPCPlayerName(oPC)); // Логин игрока
string sGender="М"; if(GetGender(oPC)==GENDER_FEMALE)sGender="Ж";//Пол
string sKey=GetPCPublicCDKey(oPC); //CD-key игрока
string sIp=GetPCIPAddress(oPC); //Ip игрока
string sDeity=GetDeity(oPC); //Божество игрока
string sStatus = "PC";////ДМ или Игрок
if (GetIsDM(oPC)==TRUE)sStatus = "DM";
string sRace = "Неизвестно"; //Расы заносимые при регистрации в БД
if(GetRacialType(oPC)==RACIAL_TYPE_DWARF)sRace = "Дворф";
if(GetRacialType(oPC)==RACIAL_TYPE_ELF)sRace = "Эльф";
if(GetRacialType(oPC)==RACIAL_TYPE_GNOME)sRace = "Гном";
if(GetRacialType(oPC)==RACIAL_TYPE_HALFELF)sRace = "Полуэльф";
if(GetRacialType(oPC)==RACIAL_TYPE_HALFLING)sRace = "Полурослик";
if(GetRacialType(oPC)==RACIAL_TYPE_HALFORC)sRace = "Полуорк";
if(GetRacialType(oPC)==RACIAL_TYPE_HUMAN)sRace = "Человек";
string sSubrace=GetStringLeft(GetSubRace(oPC), 99);


//Выполним запрос SQL - выбираем строчку со статусом где логин и чар-нейм = логин и ИМЯ персонажа вошедшего игрока
string sSelect = "SELECT cd_key FROM `reg_data` WHERE login='"+GetPCPlayerName(oPC)+
"' AND name='" +GetName(oPC)+ "' AND status='"+sStatus+"'";

//Регистрируем игрока статус - регистред, логин, чар-нейм, пол, раса, подраса, сд-кей, ip, и дата регистрации
string sReg="INSERT INTO reg_data (status, login, name, gender,"+
       "race,sub_race, deity,cd_key,ip,creation_date) "+
       "VALUES('"+sStatus+
      "','"+sLogin+
      "','"+sName+
      "','"+sGender+
      "','"+sRace+
      "','"+sSubrace+
      "','"+sDeity+
      "','"+sKey+
      "','"+sIp+
      "',NOW())";

//Проверка на статус игрока (зарегистрирован или нет)
SQLExecDirect(sSelect);
if (SQLFirstRow() == SQL_SUCCESS)
    {
    SendMessageToPC(oPC,"Рады вас видеть снова!");

    }
    else
    {
        SQLExecDirect(sReg);
        SendMessageToPC(oPC,"Приветствуем Вас! Вас персонаж был автоматически зарегистрирован!");
    }
}
[MoF]Darth_Nick
Neverwinter Script Source
//::///////////////////////////////////////////////
//:: Name: Наитупейшая Ловушка
//:://////////////////////////////////////////////
/*
Скрипт ставится на OnEnter тригера(Generic)...
Описание - Из названия всё понятно smile.gif
*/

//:://////////////////////////////////////////////
//:: Created By: [MoF]Darth_Nick
//:://////////////////////////////////////////////

void main()
{
object oPC = GetEnteringObject();
effect eBall = EffectVisualEffect(VFX_FNF_FIREBALL);

if (GetIsPC(oPC) && GetCurrentHitPoints(oPC) <= 70)
{
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eBall, oPC));
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oPC));
}
else if (GetIsPC(oPC) && GetCurrentHitPoints(oPC) > 70)
{
FloatingTextStringOnCreature("Heh...This trick is not for me!", oPC);
}
}


дык...
Лито
у меня вот такий скрипт на OnPlayerDeath
CODE
void main()
{
object oPlayer = GetLastPlayerDied();
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DEATH), GetLocation(oPlayer));

DelayCommand(6.0,AssignCommand(oPlayer,ClearAllActions()));
DelayCommand(2.5, PopUpGUIPanel(oPlayer,GUI_PANEL_PLAYER_DEATH));
}


Чтобы всплывало окошко нужна например такая строка
CODE
DelayCommand(2.5, PopUpGUIPanel(oPlayer,GUI_PANEL_PLAYER_DEATH));


А для снятия экспы можно использовать этот стандартный скрипт yes.gif
CODE
#include "nw_i0_plot"
void ApplyPenalty(object oDead)
{
   int nXP = GetXP(oDead);
   int nPenalty = 100 * GetHitDice(oDead);
   int nHD = GetHitDice(oDead);
   // * You can not lose a level with this respawning
   int nMin = ((nHD * (nHD - 1)) / 2) * 1000;

   int nNewXP = nXP - nPenalty;
   if (nNewXP < nMin)
      nNewXP = nMin;
   SetXP(oDead, nNewXP);
   int nGoldToTake =    FloatToInt(0.10 * GetGold(oDead));
   // * a cap of 10 000gp taken from you
   if (nGoldToTake > 10000)
   {
       nGoldToTake = 10000;
   }
   AssignCommand(oDead, TakeGoldFromCreature(nGoldToTake, oDead, TRUE));
   DelayCommand(4.0, FloatingTextStrRefOnCreature(58299, oDead, FALSE));
   DelayCommand(4.8, FloatingTextStrRefOnCreature(58300, oDead, FALSE));

}
void main()
{
   object oRespawner = GetLastRespawnButtonPresser();
   AssignCommand(oRespawner,JumpToLocation(GetLocation(GetObjectByTag("WP_RAISE"))));
   ApplyPenalty(oRespawner);
   ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oRespawner);
   ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oRespawner)), oRespawner);
   RemoveEffects(oRespawner);
}

Я его немножко изменил...не знаю насколько хорошо, но все пашет good.gif
[MoF]Darth_Nick
Я смерть плеера в БД записываю smile.gif
Neverwinter Script Source
#include "aps_include"
void main()
{
object oPC = GetLastPlayerDied();
string sDeath = "UPDATE `reg_data` SET death=1 WHERE name='" + GetName(oPC) + "'";
string sDHelp = "Вы умерли, но можете воскреснуть!";
PopUpDeathGUIPanel(oPC, TRUE, TRUE, 1, sDHelp);
SQLExecDirect(sDeath);
}

Чуть изменил скрипты Аваддона...

Аваддон ты мог отредактировать скрипт и записывать еще лвлы туды smile.gif
Вопрос 1: как можно изменить хелсы ПС на те которые я хочу сам, через скрипты?
Добавлено в [mergetime]1101261601[/mergetime]
П.С. у мя снятие экспы на OnRespawn ставится smile.gif и золото не отбираю, ибо не жадный lol.gif lol.gif
Ilharess
Спаунер/анспаунер для гвардов (Утром открывается дверь и появляется гвард идет на свой пост или свои вэйпы, несет службу весь день или ночь, когда приходит время идет обратно к двери если у него есть ключ то открывает ее, если нет то стучит и ему открывают, можно использовать и для спауна и обычных нпсов, если не много изменить biggrin.gif ).
В вараблах двери создаем переменные
DAYTIMEGUARD string “resref npc”, если гвард не нужен то ""
NIGHTTIMEGUARD string “resref npc”, если гвард не нужен то ""
GATESGUARD string “resref npc”, если гвард не нужен то ""
На onhb двери вешаем :
Neverwinter Script Source
/*
  door_guardspaw_5
  Spawner for guards.
*/

//#include "kv_tools"
void main()
{
//--
string sDaytimeGuard = "MOB_DAYTIMEGUARD" + GetSubString(GetTag(OBJECT_SELF), 4, GetStringLength(GetTag(OBJECT_SELF)));
object oDaytimeGuard = GetObjectByTag(sDaytimeGuard);
//--
string sNighttimeGuard = "MOB_NIGHTTIME" + GetSubString(GetTag(OBJECT_SELF), 4, GetStringLength(GetTag(OBJECT_SELF)));
object oNighttimeGuard = GetObjectByTag(sNighttimeGuard);
//--
string sGatesGuard = "MOB_GATESGUARD" + GetSubString(GetTag(OBJECT_SELF), 4, GetStringLength(GetTag(OBJECT_SELF)));
object oGatesGuard = GetObjectByTag(sGatesGuard);
//--Spawn day guard--//
if ( GetIsDay() && !GetIsObjectValid(oDaytimeGuard) && GetLocalString(OBJECT_SELF, "DAYTIMEGUARD") != "")

   {
     ActionOpenDoor(OBJECT_SELF);
     object oNewGuard = CreateObject(OBJECT_TYPE_CREATURE, GetLocalString(OBJECT_SELF, "DAYTIMEGUARD"), GetLocation(OBJECT_SELF), 0, sDaytimeGuard);

      /* if (GetIsObjectValid(oNewGuard))
         {
          DebugMessage(GetTag(OBJECT_SELF) + ": Guard " + sDaytimeGuard + " spawned sucsesfull");
         }*/

//--Spawn Night Guard--//
   }  else if ( GetIsNight() && !GetIsObjectValid(oNighttimeGuard) && GetLocalString(OBJECT_SELF, "NIGHTTIMEGUARD") != "")
             {
               ActionOpenDoor(OBJECT_SELF);
               object oNewGuard = CreateObject(OBJECT_TYPE_CREATURE, GetLocalString(OBJECT_SELF, "NIGHTTIMEGUARD"), GetLocation(OBJECT_SELF), 0, sNighttimeGuard);

              /*   if (GetIsObjectValid(oNewGuard))
                   {
                    DebugMessage(GetTag(OBJECT_SELF) + ": Guard " + sNighttimeGuard + " spawned sucsesfull");
                   }*/

//--Spawn Gate Guard--//
             } else if ( GetIsDusk() && !GetIsObjectValid(oGatesGuard) && GetLocalString(OBJECT_SELF, "GATESGUARD") != "")
                     {
                      ActionOpenDoor(OBJECT_SELF);
                      object oNewGuard = CreateObject(OBJECT_TYPE_CREATURE, GetLocalString(OBJECT_SELF, "GATESGUARD"), GetLocation(OBJECT_SELF), 0, sGatesGuard);
                   /*if (GetIsObjectValid(oNewGuard))
                       {
                        DebugMessage(GetTag(OBJECT_SELF) + ": Guard " + sGatesGuard + " spawned sucsesfull");
                       }*/

                     }
//--
if (GetIsNight() && GetIsObjectValid(oDaytimeGuard))
{
   SignalEvent(oDaytimeGuard,  EventUserDefined(111));//TIME TO GO HOME:)
   SetLocalObject(GetArea(OBJECT_SELF), "THE_DOOR", OBJECT_SELF);
}
else if (GetIsDay() && GetIsObjectValid(oNighttimeGuard))
       {
        SignalEvent(oNighttimeGuard,  EventUserDefined(111));//TIME TO GO HOME:)
        SetLocalObject(GetArea(OBJECT_SELF), "THE_DOOR", OBJECT_SELF);
       }
       else if (GetIsDawn() && GetIsObjectValid(oGatesGuard))
             {
              SignalEvent(oGatesGuard,  EventUserDefined(111));//TIME TO GO HOME:)
              SetLocalObject(GetArea(OBJECT_SELF), "THE_DOOR", OBJECT_SELF);
             }
}


На onopen
Neverwinter Script Source
/*
door_guardspaw_8
Spawner for guards.
*/


void main()
{

DelayCommand(5.0, ActionCloseDoor(OBJECT_SELF));
SetLocked(OBJECT_SELF, TRUE);
//--
object oClicker = GetLastOpenedBy();
if ( GetIsPC(oClicker)) return;
//--
string sDaytimeGuard = "MOB_DAYTIMEGUARD" + GetSubString(GetTag(OBJECT_SELF), 4, GetStringLength(GetTag(OBJECT_SELF)));
//--
string sNighttimeGuard = "MOB_NIGHTTIME" + GetSubString(GetTag(OBJECT_SELF), 4, GetStringLength(GetTag(OBJECT_SELF)));
//--
string sGatesGuard = "MOB_GATESGUARD" + GetSubString(GetTag(OBJECT_SELF), 4, GetStringLength(GetTag(OBJECT_SELF)));
//--
if (GetTag(oClicker) == sDaytimeGuard || GetTag(oClicker) == sNighttimeGuard || GetTag(oClicker) == sGatesGuard)
   {
     DelayCommand(1.0, DestroyObject(oClicker));
   }

}



На onfailtoopen
Neverwinter Script Source
/*
door_guardspaw_4
Spawner for guards.
*/


void main()
{
//--
object oClicker = GetClickingObject();
if (GetIsPC(oClicker)) return;
//--
string sDaytimeGuard = "MOB_DAYTIMEGUARD" + GetSubString(GetTag(OBJECT_SELF), 4, GetStringLength(GetTag(OBJECT_SELF)));
//--
string sNighttimeGuard = "MOB_NIGHTTIME" + GetSubString(GetTag(OBJECT_SELF), 4, GetStringLength(GetTag(OBJECT_SELF)));
//--
string sGatesGuard = "MOB_GATESGUARD" + GetSubString(GetTag(OBJECT_SELF), 4, GetStringLength(GetTag(OBJECT_SELF)));
//--
if (GetTag(oClicker) == sDaytimeGuard || GetTag(oClicker) == sNighttimeGuard || GetTag(oClicker) == sGatesGuard)
   {

     AssignCommand(oClicker, SpeakString("*Ñòó÷èò â äâåðü*"));
     DelayCommand(1.0, ActionOpenDoor(OBJECT_SELF));
     DelayCommand(1.5, DestroyObject(oClicker));

   }

}


В userdef нпса добавлете:
Neverwinter Script Source
//--стандартный ondef код--//
............................................
else if (nUser == 111//TIME TO GO HOME:)
    {

      if ( !GetIsInCombat() || GetCurrentAction() != ACTION_DIALOGOBJECT)
        {
          ClearAllActions();
          ActionMoveToObject(GetLocalObject(GetArea(OBJECT_SELF), "THE_DOOR"));
          ActionOpenDoor(GetLocalObject(GetArea(OBJECT_SELF), "THE_DOOR"));
        }
    }


ЗЫ мой первый нвн скрипт так что если это тупо не смейтесьsmile.gif
Чуть не забылsmile.gif Дверь должна иметь тэг DOOR_7 символов (индификатор спаунера)
Аваддон
долго отсутствовал, с интернетом опять неприятности были....

QUOTE (baskan @ Nov 20 2004, 17:26)
Вопрос насчет скрипта смерти Аваддона, на 1странице
Вопрос: Что нужно дописать, чтобы PC не сразу попадал в фугу, а перед этим всплывало окошко, и что дописать, что экспа снималась? А так ваще скрипт супер!

Вот, Лито меня выручил. И так все объяснилsmile.gif

QUOTE ([MoF)
Darth_Nick, Nov 24 2004, 04:57]
Вопрос 1: как можно изменить хелсы ПС на те которые я хочу сам, через скрипты?

Хэлсы всмысле возможность максимальных хэлсов или вообще просто там сделать что у перса стало 2- хэлсов?
Тогда это надо сделать так:

int iMax = Берешь Максимальные Хит-Поинты перса;
int iValue = 20 ;//сколько хочешь хит-поинтов сделать персу
int iDiff=iMax-iSet; //разница между максимальными хит-поинтами и теми которые ты хочешь установить
int iSet = iMax-iDiff;

А затем просто выполняешь команду Магическое Повреждение (iSet) на PC
В это случае у игрока станет 20 хит поинтов.

QUOTE ([MoF)
Darth_Nick, Nov 24 2004, 04:57]
Я смерть плеера в БД записываю
Чуть изменил скрипты Аваддона...
Аваддон ты мог отредактировать скрипт и записывать еще лвлы туды


Няя...а зачем? Я этот скрипт делал как Регистрационный. А ты вероятно хочешь статистику сервера сделать? Тогда погоди немного... Я тут пишу одну системку, чтобы игроку надо было своего персонажа регистрировать через Web интерфейсsmile.gif Во первых это поможет отследить чтобы игроки не создавали себе кучу игроков, а во вторых, незарегистрированных лично на сайте шарда - пускать на сервер не будет.
Аваддон
На ваульте полно Сервер-статус-чекеров, но они берут инфу когда снифят трафик от сервака к серверу Bioware. В нашем НВН сервере есть такая галочка "Post game to Inernet", которую самому поставить нельзя, а если интернет у сервера не доступен (например, в локальной сети) то, это галочка убирается, траффик от сервера не передается, и следовательно все PHP скрипты для статуса, не работают.
Но у меня появилась идея сделать статус сервера с помощью APS/NWNX2 и базы данных MySQL. [MoF]Darth_Nick написал еще для нее PHP скрипт который будет брать данные из MySQL.

Статус позволяет видеть:

- Количество игроков на сервере
- Их имена (зачем MoF]Darth_Nick'у нужны аккаунты - понятия не имею, но я чуть модифицировал его скрипт - если вам нужны аккаунты см. в теме "Статус Сервера через PHP страницу"
Итак, для начала мои скрипты:
- Пол
- Раса и Подраса
- Уровень
- Классы и уровень каждого класса
- PC или DM

Теперь скрипты:

OnModuleLoad

Neverwinter Script Source
/*
////////////////////////////////
//////Created By: Avaddon//////
//////Date: 28. 11. 2004//////
/////////////////////////////
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\MYSQL SERVER STATUS\\\\\\\
\\\\\\Put this script:\\\\\\\\\
\\\\\\\"OnModuleLoad"\\\\\\\\\\\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
*/

#include "aps_include"
void main()
{
//СтандартаЯ команда в "aps_onload"
SQLInit();

//Команда MySQL "Создать таблицу REG_DATA"
string sSQL="CREATE TABLE `reg_data` ("+
"  `pc_dm` varchar(64) NOT NULL default '',"+
"  `login` varchar(64) NOT NULL default '',"+
"  `name` varchar(64) NOT NULL default '',"+
"  `gender` varchar(10) NOT NULL default '',"+
"  `race` varchar(64) NOT NULL default '',"+
"  `sub_race` varchar(100) NOT NULL default '',"+
"  `levels` varchar(3) NOT NULL default '',"+
"  `class_1` varchar(64) NOT NULL default '',"+
"  `class_2` varchar(64) NOT NULL default '',"+
"  `class_3` varchar(64) NOT NULL default '',"+
"  `deity` varchar(100) NOT NULL default '',"+
"  `cd_key` varchar(64) NOT NULL default '',"+
"  `ip` varchar(25) NOT NULL default '',"+
"  `line_status`  varchar(4) NOT NULL default '',"+
"  `creation_date` datetime NOT NULL default '0000-00-00 00:00:00',"+
") TYPE=MyISAM;";

/*Команда MySQL "Выставить line_status" на "off", везде где он = "on".
ИспользуетсЯ при загрузке модулЯ длЯ обновлениЯ статистики после краша
или выключениЯ сервера. */

string sOffline = "UPDATE `reg_data` SET line_status = 'off' WHERE line_status='on'";

  //ПроверЯем есть ли таблица REG_DATA
  SQLExecDirect("DESCRIBE reg_data");

  //Если таблицы нет - создаем ее
  if (SQLFetch()!= SQL_SUCCESS)
  {
    SQLExecDirect(sSQL);
  }
  //При загрузке модулЯ всем выставлЯем статус "Offline"
  SQLExecDirect(sOffline);
}



OnClientEnter

Neverwinter Script Source
/*
////////////////////////////////
//////Created By: Avaddon//////
//////Date: 28. 11. 2004//////
/////////////////////////////
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\MYSQL SERVER STATUS\\\\\\\
\\\\\\Put this script:\\\\\\\\\
\\\\\\\"OnClentEnter"\\\\\\\\\\\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
*/

#include "aps_include"
void main()
{
object oPC=GetEnteringObject();
string sName=SQLEncodeSpecialChars(GetName(oPC));//ИМЯ персонажа
string sLogin=SQLEncodeSpecialChars(GetPCPlayerName(oPC)); // Логин игрока
string sGender="Мужской"; if(GetGender(oPC)==GENDER_FEMALE)sGender="Женский";//Пол
string sKey=GetPCPublicCDKey(oPC); //CD-key игрока
string sIp=GetPCIPAddress(oPC); //Ip игрока
string sDeity=GetDeity(oPC); //Божество игрока
string sPC_DM = "PC"; if (GetIsDM(oPC)==TRUE)sPC_DM = "DM";////ДМ или Игрок
string sSubrace=GetStringLeft(GetSubRace(oPC), 99);//Подраса игрока
string sAllLevels = IntToString(GetHitDice(oPC));
//Расы заносимые при регистрации в БД////////////////////////
string sRace;                                              //
int iRace = GetRacialType(oPC);                            //
switch (iRace)                                            //
    {                                                      //
    case RACIAL_TYPE_DWARF:                                //
    sRace = "Дворф";                                      //
    break;                                                //
                                                          //
    case RACIAL_TYPE_ELF:                                  //
    sRace = "Эльф";                                        //
    break;                                                //
                                                          //
    case RACIAL_TYPE_GNOME:                                //
    sRace = "Гном";                                        //
    break;                                                //
                                                          //
    case RACIAL_TYPE_HALFELF:                              //
    sRace = "Полуэльф";                                    //
    break;                                                //
                                                          //
    case RACIAL_TYPE_HALFLING:                            //
    sRace = "Полурослик";                                  //
    break;                                                //
                                                          //
    case RACIAL_TYPE_HALFORC:                              //
    sRace = "Полуорк";                                    //
    break;                                                //
                                                          //
    case RACIAL_TYPE_HUMAN:                                //
    sRace = "Человек";                                    //
    break;                                                //
    }                                                      //
/////////////////////////////////////////////////////////////


//Классы игрока///////////////////////////////////////////
int iNum;                                  //
for (iNum=0; iNum<4; iNum++)
{
string sClass;                                          //
int iClass = GetClassByPosition(iNum,oPC);              //
switch (iClass)                                        //
    {                                                  //
    case CLASS_TYPE_ARCANE_ARCHER:                      //
    sClass = "Тайный Стрелок";                          //
    break;                                              //
                                                        //
    case CLASS_TYPE_ASSASSIN:                          //
    sClass = "Убийца";                                  //
    break;                                              //
                                                        //
    case CLASS_TYPE_BARBARIAN:                          //
    sClass = "Варвар";                                  //
    break;                                              //
                                                        //
    case CLASS_TYPE_BARD:                              //
    sClass = "Бард";                                    //
    break;                                              //
                                                        //
    case CLASS_TYPE_BLACKGUARD:                        //
    sClass = "Страж Тьмы";                              //
    break;                                              //
                                                        //
    case CLASS_TYPE_CLERIC:                            //
    sClass = "Клирик";                                  //
    break;                                              //
                                                        //
    case CLASS_TYPE_DIVINECHAMPION:                    //
    sClass = "Чемпион Торма";                          //
    break;                                              //
                                                        //
    case CLASS_TYPE_DRAGONDISCIPLE:                    //
    sClass = "Ученик Дракона";                          //
    break;                                              //
                                                        //
    case CLASS_TYPE_DRUID:                              //
    sClass = "Друид";                                  //
    break;                                              //
                                                        //
    case CLASS_TYPE_DWARVENDEFENDER:                    //
    sClass = "Защитник Дворфов";                        //
    break;                                              //
                                                        //
    case CLASS_TYPE_FIGHTER:                            //
    sClass = "Воин";                                    //
    break;                                              //
                                                        //
    case CLASS_TYPE_HARPER:                            //
    sClass = "Разведчик Арфистов";                      //
    break;                                              //
                                                        //
    case CLASS_TYPE_INVALID:                            //
    sClass = " - ";                      //
    break;                                              //
                                                        //
    case CLASS_TYPE_MONK:                              //
    sClass = "Монах";                                  //
    break;                                              //
                                                        //
    case CLASS_TYPE_PALADIN:                            //
    sClass = "Паладин";                                //
    break;                                              //
                                                        //
    case CLASS_TYPE_PALEMASTER:                        //
    sClass = "Бледный Мастер";                          //
    break;                                              //
                                                        //
    case CLASS_TYPE_RANGER:                            //
    sClass = "Следопыт";                                //
    break;                                              //
                                                        //
    case CLASS_TYPE_ROGUE:                              //
    sClass = "Плут";                                    //
    break;                                              //
                                                        //
    case CLASS_TYPE_SHADOWDANCER:                      //
    sClass = "Танцор Тени";                            //
    break;                                              //
                                                        //
    case CLASS_TYPE_SHIFTER:                            //
    sClass = "Оборотень";                              //
    break;                                              //
                                                        //
    case CLASS_TYPE_SORCERER:                          //
    sClass = "Волшебник";                              //
    break;                                              //
                                                        //
    case CLASS_TYPE_WEAPON_MASTER:                      //
    sClass = "Мастер Оружий";                          //
    break;                                              //
                                                        //
    case CLASS_TYPE_WIZARD:                            //
    sClass = "Маг";                                    //
    break;                                              //
    }                                                  //
//////////////////////////////////////////////////////////

//Берем класс данной позиции и заносим его в локальную строку
SetLocalString(oPC,"Class"+IntToString(iNum),sClass);//
//Берем уровень данного класса и заносим его в локальную строку
SetLocalString(oPC,"Level"+IntToString(iNum),IntToString(GetLevelByPosition(iNum,oPC)));//;
}
//Читаем уровни 1,2, и 3  класса
string sLevel1 = GetLocalString(oPC,"Level1");
string sLevel2 = GetLocalString(oPC,"Level2");
string sLevel3 = GetLocalString(oPC,"Level3");

//Читаем 1,2, и 3  класс
string sClass_1 = GetLocalString(oPC,"Class1")+" ("+sLevel1+")";
string sClass_2 = GetLocalString(oPC,"Class2")+" ("+sLevel2+")";
string sClass_3 = GetLocalString(oPC,"Class3")+" ("+sLevel3+")";


//Выполним запрос SQL - выбираем строчку где логин и чар-нейм = логин и ИМЯ персонажа вошедшего игрока
string sSelect = "SELECT * FROM `reg_data` WHERE login='"+GetPCPlayerName(oPC)+
"' AND name='" +GetName(oPC)+ "' AND pc_dm='"+sPC_DM+"'";

//Команда MySQL "Выставить вощдшему игроку статус OnLine"
string sLine_Status = "UPDATE `reg_data` SET line_status = 'on' WHERE login='"+GetPCPlayerName(oPC)+
"' AND name='" +GetName(oPC)+ "' AND pc_dm='"+sPC_DM+"'";

//Регистрируем игрока статус - регистред, логин, чар-нейм, пол, раса, классы (1,2,3), подраса, сд-кей, ip, и дата регистрации
string sReg="INSERT INTO reg_data (pc_dm, login, name, gender,"+
      "race, sub_race,levels, class_1,class_2,class_3, deity,cd_key,ip,line_status,creation_date) "+
      "VALUES('"+sPC_DM+
      "','"+sLogin+
      "','"+sName+
      "','"+sGender+
      "','"+sRace+
      "','"+sSubrace+
      "','"+sAllLevels+
      "','"+sClass_1+
      "','"+sClass_2+
      "','"+sClass_3+
      "','"+sDeity+
      "','"+sKey+
      "','"+sIp+
      "','on',NOW())";

//Проверка на статус игрока (зарегистрирован или нет)
SQLExecDirect(sSelect);
if (SQLFirstRow() == SQL_SUCCESS)
    {
    SendMessageToPC(oPC,"Статус изменен на [On Line]");
    //Если да - просто изменЯем статус на OnLine
    SQLExecDirect(sLine_Status);
    }
    else
    {
    //Если нет - регистрируем, и выставлЯем статус OnLine
        SQLExecDirect(sReg);
        SendMessageToPC(oPC,"Приветствуем Вас! Вас персонаж был автоматически зарегистрирован!");
        SendMessageToPC(oPC,"Статус изменен на [On Line]");
    }

//Задаем локальные строки игроку с его логином и именем
SetLocalString(oPC,"Login",GetPCPlayerName(oPC));
SetLocalString(oPC,"Name",GetName(oPC));
}



OnClientLeave

Neverwinter Script Source
/*
////////////////////////////////
//////Created By: Avaddon//////
//////Date: 28. 11. 2004//////
/////////////////////////////
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\MYSQL SERVER STATUS\\\\\\\
\\\\\\Put this script:\\\\\\\\\
\\\\\\\"OnClentLeave"\\\\\\\\\\\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
*/

#include "aps_include"
void main()
{
object oPC=GetExitingObject();

// Считываем имЯ игрока с его локальной строчки заданной при входе на сервер
string sName=SQLEncodeSpecialChars(GetLocalString(oPC,"Name"));

// Считываем логин игрока с его локальной строчки заданной при входе на сервер
string sLogin=SQLEncodeSpecialChars(GetLocalString(oPC,"Login"));
string sPC_DM = "PC"; if (GetIsDM(oPC)==TRUE)sPC_DM = "DM";////ДМ или Игрок
//
//Выполним запрос SQL - выбираем строчку где логин и чар-нейм = логин и ИМЯ персонажа ушедшего игрока
string sSelect = "SELECT * FROM `reg_data` WHERE login='"+sLogin+
"' AND name='" +sName+ "' AND pc_dm='"+sPC_DM+"'";

//Команда MySQL "Изменить "line_status" на "off", где логин и имЯ = логину и имени ушедшего игрока.
string sLine_Status = "UPDATE `reg_data` SET line_status = 'off' WHERE login='"+sLogin+
"' AND name='" +sName+ "' AND pc_dm='"+sPC_DM+"'";

SQLExecDirect(sSelect);
if (SQLFirstRow() == SQL_SUCCESS)
    {
    SendMessageToPC(oPC,"Статус изменен на [Off Line]");
    SQLExecDirect(sLine_Status);
    }
}

Аваддон
продолжение

OnPlayerLevelUp

Neverwinter Script Source
/*
////////////////////////////////
//////Created By: Avaddon//////
//////Date: 28. 11. 2004//////
/////////////////////////////
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\MYSQL SERVER STATUS\\\\\\\
\\\\\\Put this script:\\\\\\\\\
\\\\\\\"OnPlayerLevelUp"\\\\\\\\\\\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
*/


#include "aps_include"
void main()
{
object oPC = GetPCLevellingUp();
string sAllLevels = IntToString(GetHitDice(oPC));
//Классы игрока///////////////////////////////////////////
int iNum;                                   //
for (iNum=0; iNum<4; iNum++)
{
string sClass;                                          //
int iClass = GetClassByPosition(iNum,oPC);              //
switch (iClass)                                         //
    {                                                   //
    case CLASS_TYPE_ARCANE_ARCHER:                      //
    sClass = "Тайный Стрелок";                          //
    break;                                              //
                                                        //
    case CLASS_TYPE_ASSASSIN:                           //
    sClass = "Убийца";                                  //
    break;                                              //
                                                        //
    case CLASS_TYPE_BARBARIAN:                          //
    sClass = "Варвар";                                  //
    break;                                              //
                                                        //
    case CLASS_TYPE_BARD:                               //
    sClass = "Бард";                                    //
    break;                                              //
                                                        //
    case CLASS_TYPE_BLACKGUARD:                         //
    sClass = "Страж Тьмы";                              //
    break;                                              //
                                                        //
    case CLASS_TYPE_CLERIC:                             //
    sClass = "Клирик";                                  //
    break;                                              //
                                                        //
    case CLASS_TYPE_DIVINECHAMPION:                     //
    sClass = "Чемпион Торма";                           //
    break;                                              //
                                                        //
    case CLASS_TYPE_DRAGONDISCIPLE:                     //
    sClass = "Ученик Дракона";                          //
    break;                                              //
                                                        //
    case CLASS_TYPE_DRUID:                              //
    sClass = "Друид";                                   //
    break;                                              //
                                                        //
    case CLASS_TYPE_DWARVENDEFENDER:                    //
    sClass = "Защитник Дворфов";                        //
    break;                                              //
                                                        //
    case CLASS_TYPE_FIGHTER:                            //
    sClass = "Воин";                                    //
    break;                                              //
                                                        //
    case CLASS_TYPE_HARPER:                             //
    sClass = "Разведчик Арфистов";                      //
    break;                                              //
                                                        //
    case CLASS_TYPE_INVALID:                            //
    sClass = " - ";                                     //
    break;                                              //
                                                        //
    case CLASS_TYPE_MONK:                               //
    sClass = "Монах";                                   //
    break;                                              //
                                                        //
    case CLASS_TYPE_PALADIN:                            //
    sClass = "Паладин";                                 //
    break;                                              //
                                                        //
    case CLASS_TYPE_PALEMASTER:                         //
    sClass = "Бледный Мастер";                          //
    break;                                              //
                                                        //
    case CLASS_TYPE_RANGER:                             //
    sClass = "Следопыт";                                //
    break;                                              //
                                                        //
    case CLASS_TYPE_ROGUE:                              //
    sClass = "Плут";                                    //
    break;                                              //
                                                        //
    case CLASS_TYPE_SHADOWDANCER:                       //
    sClass = "Танцор Тени";                             //
    break;                                              //
                                                        //
    case CLASS_TYPE_SHIFTER:                            //
    sClass = "Оборотень";                               //
    break;                                              //
                                                        //
    case CLASS_TYPE_SORCERER:                           //
    sClass = "Волшебник";                               //
    break;                                              //
                                                        //
    case CLASS_TYPE_WEAPON_MASTER:                      //
    sClass = "Мастер Оружий";                           //
    break;                                              //
                                                        //
    case CLASS_TYPE_WIZARD:                             //
    sClass = "Маг";                                     //
    break;                                              //
    }                                                   //
    SetLocalString(oPC,"Class"+IntToString(iNum),sClass);
    SetLocalString(oPC,"Level"+IntToString(iNum),IntToString(GetLevelByPosition(iNum,oPC)));//;
//////////////////////////////////////////////////////////
}
string sName=SQLEncodeSpecialChars(GetName(oPC));
string sLogin=SQLEncodeSpecialChars(GetPCPlayerName(oPC));
//Читаем уровни 1,2, и 3  класса
string sLevel1 = GetLocalString(oPC,"Level1");
string sLevel2 = GetLocalString(oPC,"Level2");
string sLevel3 = GetLocalString(oPC,"Level3");

//Читаем 1,2, и 3  класс
string sClass_1 = GetLocalString(oPC,"Class1")+" ("+sLevel1+")";
string sClass_2 = GetLocalString(oPC,"Class2")+" ("+sLevel2+")";
string sClass_3 = GetLocalString(oPC,"Class3")+" ("+sLevel3+")";

//Команда MySQL "Обновить уровни игрока"
string sLevel = "UPDATE `reg_data` SET levels = '"+sAllLevels+
"', class_1 = '"+sClass_1+
"', class_2 = '"+sClass_2+
"', class_3 = '"+sClass_3+
"' WHERE login = '"+sLogin+"' AND name = '"+sName+"'";

SQLExecDirect(sLevel);
}


PHP-скрипт by [MoF]Darth_Nick
Я его немного модифицировал под классы, а так же чтобы сервер говорил об отсутствии игроков на сервере

УДАЛЕНО. Айваном.
Аваддон
В одном из моих постов, в Базе Скриптов я опубликовал скрипт на отдых в дикой местности.
Теперь, я бы хотел уделить внимаение отдыху в гостинице.
И так, что нам надо для того чтобы организовать отдых в гостиничной комнате?

1. Нам нужен этот хак (0.04 мб), который заменяет в тайлах простые кровати, на такие же по виду кровати, но на которые игрок может забраться.

2. Нам надо сделать гостиничную комнату. Тэг локации должен начинаться с "free". Например, free_inn_rooms.
Я делал одну локацию в которой много гостиничных комнат, никаким образом не соединенных между собой. В каждой комнате перед кроватью стоит ВэйПоинт с тэгом "BED" и на кровати стоит ВэйПоинт с тэгом "SLEEP".

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

На события модуля OnPlayerRest ставим нижеследующий скрипт.
Neverwinter Script Source
/*
////////////////////////////////
//////Created By: Avaddon//////
//////Date: 04. 12. 2004//////
/////////////////////////////
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\\INN ROOM FREE REST\\\\\\\
\\\\\\Put this script:\\\\\\\\\
\\\\\\\"OnPlayerRest"\\\\\\\\\\\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
*/

void main()
{
//Эффекты сна
effect eBlack = EffectVisualEffect(VFX_DUR_BLACKOUT);
effect eZzz =  EffectVisualEffect(VFX_IMP_SLEEP);
effect eSlow = EffectSlow();

object oPC = GetLastPCRested();

//Вейпоинт с тэгом "BED" должен находитсЯ перед кроватью на полу
object oBed = GetNearestObjectByTag("BED",oPC);

/*Вейпоинт с тегом "SLEEP" должен находитсЯ на самой кровати
(Я надеюсь вы скачали хак с фиксом кровати на nwvault.ign.com)*/

object oSleep = GetNearestObjectByTag("SLEEP",oPC);

//Берем предметы в слотах
object oArmor =GetItemInSlot(INVENTORY_SLOT_CHEST,oPC);
object oRightHand = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);
object oLeftHand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
object oBoots = GetItemInSlot(INVENTORY_SLOT_BOOTS,oPC);
object oHelmet = GetItemInSlot(INVENTORY_SLOT_HEAD,oPC);
object oBelt = GetItemInSlot(INVENTORY_SLOT_BELT,oPC);
object oCloak = GetItemInSlot(INVENTORY_SLOT_CLOAK,oPC);
object oArms = GetItemInSlot(INVENTORY_SLOT_ARMS,oPC);

//В качестве тэгов предметов читаем переменные с игрока
string sFree = GetTag(GetArea(oPC));
string sArmor = GetLocalString(oPC,"armor");
string sRightHand = GetLocalString(oPC,"right");
string sLeftHand = GetLocalString(oPC,"left");
string sHelmet = GetLocalString(oPC,"helmet");
string sBoots = GetLocalString(oPC,"boots");
string sBelt = GetLocalString(oPC,"belt");
string sCloak = GetLocalString(oPC,"cloak");
string sArms = GetLocalString(oPC,"arms");

    /*Проверка арены в которой находитсЯ игрок решивший отдохнуть.
    Если тег арены начинаетсЯ с "free" (например "free_inn_rooms"),
    то наш скрипт начинает работу*/

    if(GetStringLeft(sFree,4)=="free")
    {
    //Если игрок еще не на кровати то...
        if(GetLocalInt(GetLastPCRested(),"on_bed")!=1)
        {
        //Записываем на игрока переменные с тегами одетых на него вещей
        SetLocalString(oPC,"armor",GetTag(oArmor));
        SetLocalString(oPC,"right",GetTag(oRightHand));
        SetLocalString(oPC,"left",GetTag(oLeftHand));
        SetLocalString(oPC,"helmet",GetTag(oHelmet));
        SetLocalString(oPC,"boots",GetTag(oBoots));
        SetLocalString(oPC,"belt",GetTag(oBelt));
        SetLocalString(oPC,"cloak",GetTag(oCloak));
        SetLocalString(oPC,"arms",GetTag(oArms));

        /*За 2 секунды он уже должен быть у кровати(расчитано на маленькую
        комнату с кроватью. Раздеваем игрока. Снимаем все кроме колец,
        боеприпасов, и амулета.*/

        DelayCommand(2.0,AssignCommand(oPC,ActionUnequipItem(oArmor)));
        DelayCommand(2.0,AssignCommand(oPC,ActionUnequipItem(oRightHand)));
        DelayCommand(2.0,AssignCommand(oPC,ActionUnequipItem(oLeftHand)));
        DelayCommand(2.0,AssignCommand(oPC,ActionUnequipItem(oHelmet)));
        DelayCommand(2.0,AssignCommand(oPC,ActionUnequipItem(oBoots)));
        DelayCommand(2.0,AssignCommand(oPC,ActionUnequipItem(oBelt)));
        DelayCommand(2.0,AssignCommand(oPC,ActionUnequipItem(oCloak)));
        DelayCommand(2.0,AssignCommand(oPC,ActionUnequipItem(oArms)));

            //При событии отдых начат (в гостинице соответственно)...
            if (GetLastRestEventType()==REST_EVENTTYPE_REST_STARTED)
            {
            //ОтменЯем отдых и выполнЯем следущие действиЯ
            AssignCommand(oPC,ClearAllActions());

            //Подходим к кровати(как он подойдет - тут же разденетсЯ)
            AssignCommand(oPC,ActionMoveToObject(oBed));

            //Когда разденетсЯ - забираемсЯ на кровать
            DelayCommand(2.0,AssignCommand(oPC,ActionJumpToObject(oSleep)));

            //ВыставлЯем переменную "Игрок уже на кровати"
            DelayCommand(2.5,SetLocalInt(oPC,"on_bed",1));

            //Начинаем отдых
            DelayCommand(3.0,AssignCommand(oPC,ActionRest()));

            //Накладываем эффекты сна
            DelayCommand(3.5,ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eZzz,oPC,10.0));
            DelayCommand(4.0,ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eBlack,oPC,60.0));
            }//Заканчиваем условие "Если Отдых Начат"
        }//Заканчиваем условие "Если игрок не на кровати"
    }//Заканчиваем условие "Если тег арены начинаетсЯ с 'free' "
    else
    {
    /*Здесь - действие которое происходит если тег арены в которой игрок
    находитсЯ не начинаетсЯ с "free".
    Тут "AssignCommand(oPC,ClearAllActions()" - отменЯет отдых. Вы же,
    можете вставить любой другой скрипт, или команды длЯ другого типа отдыха,
    например на природе.*/

    AssignCommand(oPC,ClearAllActions());
    }

  //////////////////////////////////////////////////////////////////////
  /*Если Отдых Окончен или Прерван в арене с тегом начинающимсЯ с "free"
  и игрок находитсЯ на кровати.*/
/////////////////////////////////////

    if(GetStringLeft(sFree,4)=="free" && GetLocalInt(oPC,"on_bed")==1)
    {
        //Если Отдых Завершен
        if (GetLastRestEventType()==REST_EVENTTYPE_REST_FINISHED)
        {
        //Одеваем игрока обратно (теги предметов бывших на нем одетыми читаем из локалок игрока)
        DelayCommand(2.0,AssignCommand(oPC, ActionEquipItem(GetItemPossessedBy(oPC,sArmor), INVENTORY_SLOT_CHEST)));
        DelayCommand(2.0,AssignCommand(oPC, ActionEquipItem(GetItemPossessedBy(oPC,sRightHand), INVENTORY_SLOT_RIGHTHAND)));
        DelayCommand(2.0,AssignCommand(oPC, ActionEquipItem(GetItemPossessedBy(oPC,sLeftHand), INVENTORY_SLOT_LEFTHAND)));
        DelayCommand(2.0,AssignCommand(oPC, ActionEquipItem(GetItemPossessedBy(oPC,sBoots), INVENTORY_SLOT_BOOTS)));
        DelayCommand(2.0,AssignCommand(oPC, ActionEquipItem(GetItemPossessedBy(oPC,sHelmet), INVENTORY_SLOT_HEAD)));
        DelayCommand(2.0,AssignCommand(oPC, ActionEquipItem(GetItemPossessedBy(oPC,sBelt), INVENTORY_SLOT_BELT)));
        DelayCommand(2.0,AssignCommand(oPC, ActionEquipItem(GetItemPossessedBy(oPC,sCloak), INVENTORY_SLOT_CLOAK)));
        DelayCommand(2.0,AssignCommand(oPC, ActionEquipItem(GetItemPossessedBy(oPC,sArms), INVENTORY_SLOT_ARMS)));

        //Встаем с кровати
        AssignCommand(oPC,ActionJumpToObject(oBed));

        //Стираем с игрока все локалки предметов и того что он был на кровати.
        DeleteLocalInt(oPC,"on_bed");
        DeleteLocalString(oPC,"armor");
        DeleteLocalString(oPC,"right");
        DeleteLocalString(oPC,"left");
        DeleteLocalString(oPC,"helmet");
        DeleteLocalString(oPC,"boots");
        DeleteLocalString(oPC,"belt");
        DeleteLocalString(oPC,"cloak");
        DeleteLocalString(oPC,"arms");

        //Убираем эффекты сна
        RemoveEffect(oPC,eBlack);
        }//Заканчиваем условие "Если Отдых Завершен

        /*Если Отдых Прерван То одевать игрока не будем (он проснулсЯ с перепугу,
        или разбудили там.. Не дали спокойно собратьсЯ вобщем.*/

        if (GetLastRestEventType()==REST_EVENTTYPE_REST_CANCELLED)
        {
        //Встаем с кровати
        AssignCommand(oPC,ActionJumpToObject(oBed));

        //Стираем с игрока все локалки предметов и того что он был на кровати.
        DeleteLocalInt(oPC,"on_bed");
        DeleteLocalString(oPC,"armor");
        DeleteLocalString(oPC,"right");
        DeleteLocalString(oPC,"left");
        DeleteLocalString(oPC,"helmet");
        DeleteLocalString(oPC,"boots");
        DeleteLocalString(oPC,"belt");
        DeleteLocalString(oPC,"cloak");
        DeleteLocalString(oPC,"arms");

        /*Эффекты сна не снимаем
        И накладываем Blackout и эффект замедлениЯ,
        чтобы игрок 30 секунд приходилв себЯ.*/


        ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSlow,oPC,30.0);
        //Периодически игрок полусонный подхрапывает
        ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eZzz,oPC,10.0);
        DelayCommand(10.0,ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eZzz,oPC,10.0));
        DelayCommand(20.0,ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eZzz,oPC,10.0));
        }
    }
}
Twin

Пара функций для сохранения и восстановления всех свойств предмета. Дают возможность конвертировать все перманентные (и только перманентные) свойства предмета в строку, которую можно сохранить куда хотите. И также восстановить все свойства (кроме On Monster Hit) из этой строки на предмет. Также сохраняются заряды палочек.
Не сохраняется:
Кастомный вид брони и оружия.
Additional Price отличная от ResRef'овской.
Свойство On Monster Hit (его можно ставить только на Creature Weapon) сохраняется нормально, но при восстановлении работает некорректно. Вернее два из подствойств (SubType) этого свойства не получается восстановить. Карочи, а оно вам ваще нужно? ;)
Количество использований свойства X uses/day. То есть при восстановлении данного свойства из строки возможно, что количество использований обновится как будто после отдыха - не проверял.
Наверняка что-то еще не сохраняется, но мне в голову ничего не приходит.
Neverwinter Script Source
/*
** Конвертациz свойств предмета в строку.
*/

string GetProperties(object oItem)
{
    string sProperties = IntToString(GetItemCharges(oItem));
    int nTemp;
    itemproperty ipTemp = GetFirstItemProperty(oItem);

    while (GetIsItemPropertyValid(ipTemp))
    {
        if (GetItemPropertyDurationType(ipTemp) == 2)
        {
            sProperties += "@"+
                IntToString(GetItemPropertyType(ipTemp)) +":";

            nTemp = GetItemPropertyParam1Value(ipTemp);
            if (nTemp == 255 || nTemp == -1)
                sProperties += "-1:";
            else
                sProperties += IntToString(nTemp - 1) +":";

            sProperties +=
                IntToString(GetItemPropertyCostTable(ipTemp)) +":";

            nTemp = GetItemPropertyCostTableValue(ipTemp);
            if (nTemp == -1)
                sProperties += "-1:";
            else
                sProperties += IntToString(nTemp - 1) +":";

            nTemp = GetItemPropertySubType(ipTemp);
            if (nTemp == -1) sProperties += "0";
            else            sProperties += IntToString(nTemp);
        }

        ipTemp = GetNextItemProperty(oItem);
    }

    return sProperties;
}

/*
** Установка свойств предмета из строки.
*/

void SetProperties(object oItem, string sProperties)
{
    //SendMessageToPC(GetFirstPC(), "SetProperties :: sProperties == "+ sProperties);

    itemproperty ipTemp = GetFirstItemProperty(oItem);
    while (GetIsItemPropertyValid(ipTemp))
    {
        RemoveItemProperty(oItem, ipTemp);
        ipTemp = GetNextItemProperty(oItem);
    }

    int i = 1;
    int pos, nCharges;
    string sTemp;

    nCharges = StringToInt(GetStringLeft(sProperties, FindSubString(sProperties, "@")));
    if (nCharges > 0)
        SetItemCharges(oItem, nCharges);

    while ((pos = FindSubString(sProperties, "@")) != -1)
    {
        sProperties = GetStringRight(sProperties, GetStringLength(sProperties) - pos - 1);

        pos = FindSubString(sProperties, "@");
        if (pos == -1)
            pos = GetStringLength(sProperties);

        sTemp = GetStringLeft(sProperties, pos);

        //SendMessageToPC(GetFirstPC(), "sTemp["+ IntToString(i) +"] == "+ sTemp);
        SetProperty(oItem, sTemp);

        i++;
    }
}

void SetProperty(object oItem, string sProperty)
{
    int pos = FindSubString(sProperty, ":");
    int nType = StringToInt(GetSubString(sProperty, 0, pos));

    sProperty = GetSubString(sProperty, pos + 1, GetStringLength(sProperty));
    pos = FindSubString(sProperty, ":");
    int nParam1Value = StringToInt(GetSubString(sProperty, 0, pos));
    nParam1Value++;

    sProperty = GetSubString(sProperty, pos + 1, GetStringLength(sProperty));
    pos = FindSubString(sProperty, ":");
    int nCostTable = StringToInt(GetSubString(sProperty, 0, pos));

    sProperty = GetSubString(sProperty, pos + 1, GetStringLength(sProperty));
    pos = FindSubString(sProperty, ":");
    int nCostTableValue = StringToInt(GetSubString(sProperty, 0, pos));
    nCostTableValue++;

    sProperty = GetSubString(sProperty, pos + 1, GetStringLength(sProperty));
    int nSubType = StringToInt(sProperty);

    itemproperty ipTemp;

    switch (nType)
    {
/*OK*/  case ITEM_PROPERTY_ABILITY_BONUS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ABILITY_BONUS _OK_");
            ipTemp = ItemPropertyAbilityBonus(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_AC_BONUS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_AC_BONUS _OK_");
            ipTemp = ItemPropertyACBonus(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_AC_BONUS_VS_ALIGNMENT_GROUP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_AC_BONUS_VS_ALIGNMENT_GROUP _OK_");
            ipTemp = ItemPropertyACBonusVsAlign(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_AC_BONUS_VS_DAMAGE_TYPE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_AC_BONUS_VS_DAMAGE_TYPE _OK_");
            ipTemp = ItemPropertyACBonusVsDmgType(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_AC_BONUS_VS_RACIAL_GROUP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_AC_BONUS_VS_RACIAL_GROUP _OK_");
            ipTemp = ItemPropertyACBonusVsRace(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_AC_BONUS_VS_SPECIFIC_ALIGNMENT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_AC_BONUS_VS_SPECIFIC_ALIGNMENT _OK_");
            ipTemp = ItemPropertyACBonusVsSAlign(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ARCANE_SPELL_FAILURE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ARCANE_SPELL_FAILURE _OK_");
            ipTemp = ItemPropertyArcaneSpellFailure(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ATTACK_BONUS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ATTACK_BONUS _OK_");
            ipTemp = ItemPropertyAttackBonus(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ATTACK_BONUS_VS_ALIGNMENT_GROUP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ATTACK_BONUS_VS_ALIGNMENT_GROUP _OK_");
            ipTemp = ItemPropertyAttackBonusVsAlign(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ATTACK_BONUS_VS_RACIAL_GROUP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ATTACK_BONUS_VS_RACIAL_GROUP _OK_");
            ipTemp = ItemPropertyAttackBonusVsRace(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ATTACK_BONUS_VS_SPECIFIC_ALIGNMENT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ATTACK_BONUS_VS_SPECIFIC_ALIGNMENT _OK_");
            ipTemp = ItemPropertyAttackBonusVsSAlign(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_BASE_ITEM_WEIGHT_REDUCTION:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_BASE_ITEM_WEIGHT_REDUCTION _OK_");
            ipTemp = ItemPropertyWeightReduction(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_BONUS_FEAT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_BONUS_FEAT _OK_");
            ipTemp = ItemPropertyBonusFeat(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N _OK_");
            ipTemp = ItemPropertyBonusLevelSpell(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_CAST_SPELL:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_CAST_SPELL _OK_");
            ipTemp = ItemPropertyCastSpell(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DAMAGE_BONUS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DAMAGE_BONUS _OK_");
            ipTemp = ItemPropertyDamageBonus(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP _OK_");
            ipTemp = ItemPropertyDamageBonusVsAlign(nSubType, nParam1Value, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP _OK_");
            ipTemp = ItemPropertyDamageBonusVsRace(nSubType, nParam1Value, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT _OK_");
            ipTemp = ItemPropertyDamageBonusVsSAlign(nSubType, nParam1Value, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DAMAGE_REDUCTION:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DAMAGE_REDUCTION _OK_");
            ipTemp = ItemPropertyDamageReduction(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DAMAGE_RESISTANCE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DAMAGE_RESISTANCE _OK_");
            ipTemp = ItemPropertyDamageResistance(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DAMAGE_VULNERABILITY:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DAMAGE_VULNERABILITY _OK_");
            ipTemp = ItemPropertyDamageVulnerability(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DARKVISION:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DARKVISION _OK_");
            ipTemp = ItemPropertyDarkvision();
            break;
/*OK*/  case ITEM_PROPERTY_DECREASED_ABILITY_SCORE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DECREASED_ABILITY_SCORE _OK_");
            ipTemp = ItemPropertyDecreaseAbility(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DECREASED_AC:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DECREASED_AC _OK_");
            ipTemp = ItemPropertyDecreaseAC(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER _OK_");
            ipTemp = ItemPropertyAttackPenalty(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DECREASED_DAMAGE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DECREASED_DAMAGE _OK_");
            ipTemp = ItemPropertyDamagePenalty(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DECREASED_ENHANCEMENT_MODIFIER:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DECREASED_ENHANCEMENT_MODIFIER _OK_");
            ipTemp = ItemPropertyEnhancementPenalty(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DECREASED_SAVING_THROWS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DECREASED_SAVING_THROWS _OK_");
            ipTemp = ItemPropertyReducedSavingThrowVsX(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DECREASED_SAVING_THROWS_SPECIFIC:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DECREASED_SAVING_THROWS_SPECIFIC _OK_");
            ipTemp = ItemPropertyReducedSavingThrow(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DECREASED_SKILL_MODIFIER:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DECREASED_SKILL_MODIFIER _OK_");
            ipTemp = ItemPropertyDecreaseSkill(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ENHANCED_CONTAINER_REDUCED_WEIGHT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ENHANCED_CONTAINER_REDUCED_WEIGHT _OK_");
            ipTemp = ItemPropertyContainerReducedWeight(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ENHANCEMENT_BONUS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ENHANCEMENT_BONUS _OK_");
            ipTemp = ItemPropertyEnhancementBonus(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_ALIGNMENT_GROUP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_ALIGNMENT_GROUP _OK_");
            ipTemp = ItemPropertyEnhancementBonusVsAlign(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_RACIAL_GROUP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_RACIAL_GROUP _OK_");
            ipTemp = ItemPropertyEnhancementBonusVsRace(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_SPECIFIC_ALIGNEMENT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_SPECIFIC_ALIGNEMENT ?_OK_");
            ipTemp = ItemPropertyEnhancementBonusVsSAlign(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_EXTRA_MELEE_DAMAGE_TYPE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_EXTRA_MELEE_DAMAGE_TYPE _OK_");
            ipTemp = ItemPropertyExtraMeleeDamageType(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_EXTRA_RANGED_DAMAGE_TYPE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_EXTRA_RANGED_DAMAGE_TYPE _OK_");
            ipTemp = ItemPropertyExtraRangeDamageType(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_FREEDOM_OF_MOVEMENT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_FREEDOM_OF_MOVEMENT _OK_");
            ipTemp = ItemPropertyFreeAction();
            break;
/*OK*/  case ITEM_PROPERTY_HASTE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_HASTE _OK_");
            ipTemp = ItemPropertyHaste();
            break;
/*OK*/  case ITEM_PROPERTY_HEALERS_KIT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_HEALERS_KIT _OK_");
            ipTemp = ItemPropertyHealersKit(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_HOLY_AVENGER:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_HOLY_AVENGER _OK_");
            ipTemp = ItemPropertyHolyAvenger();
            break;
/*OK*/  case ITEM_PROPERTY_IMMUNITY_DAMAGE_TYPE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_IMMUNITY_DAMAGE_TYPE _OK_");
            ipTemp = ItemPropertyDamageImmunity(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS _OK_");
            ipTemp = ItemPropertyImmunityMisc(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_IMMUNITY_SPECIFIC_SPELL:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_IMMUNITY_SPECIFIC_SPELL _OK_");
            ipTemp = ItemPropertySpellImmunitySpecific(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_IMMUNITY_SPELL_SCHOOL:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_IMMUNITY_SPELL_SCHOOL _OK_");
            ipTemp = ItemPropertySpellImmunitySchool(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_IMMUNITY_SPELLS_BY_LEVEL:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_IMMUNITY_SPELLS_BY_LEVEL _OK_");
            ipTemp = ItemPropertyImmunityToSpellLevel(nCostTableValue+1);
            break;
/*OK*/  case ITEM_PROPERTY_IMPROVED_EVASION:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_IMPROVED_EVASION _OK_");
            ipTemp = ItemPropertyImprovedEvasion();
            break;
/*OK*/  case ITEM_PROPERTY_KEEN:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_KEEN _OK_");
            ipTemp = ItemPropertyKeen();
            break;
/*OK*/  case ITEM_PROPERTY_LIGHT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_LIGHT _OK_");
            ipTemp = ItemPropertyLight(nCostTableValue, nParam1Value);
            break;
/*OK*/  case ITEM_PROPERTY_MASSIVE_CRITICALS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_MASSIVE_CRITICALS _OK_");
            ipTemp = ItemPropertyMassiveCritical(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_MIGHTY:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_MIGHTY _OK_");
            ipTemp = ItemPropertyMaxRangeStrengthMod(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_MIND_BLANK:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_MIND_BLANK");
            break;
/*OK*/  case ITEM_PROPERTY_MONSTER_DAMAGE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_MONSTER_DAMAGE ?OK?");
            ipTemp = ItemPropertyMonsterDamage(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_NO_DAMAGE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_NO_DAMAGE _OK_");
            ipTemp = ItemPropertyNoDamage();
            break;
/*OK*/  case ITEM_PROPERTY_ON_HIT_PROPERTIES:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ON_HIT_PROPERTIES _OK_");
            ipTemp = ItemPropertyOnHitProps(nSubType, nCostTableValue, nParam1Value);
            break;
/*FAIL*/case ITEM_PROPERTY_ON_MONSTER_HIT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ON_MONSTER_HIT _PARTIAL_ "+ IntToString(nSubType) +"!"+ IntToString(nParam1Value));
            ipTemp = ItemPropertyOnMonsterHitProperties(nSubType, nParam1Value);
            break;
/*OK*/  case ITEM_PROPERTY_ONHITCASTSPELL:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ONHITCASTSPELL _OK_");
            ipTemp = ItemPropertyOnHitCastSpell(nSubType, nCostTableValue+1);
            break;
/*OK*/  case ITEM_PROPERTY_POISON:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_POISON");
            break;
/*OK*/  case ITEM_PROPERTY_REGENERATION:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_REGENERATION _OK_");
            ipTemp = ItemPropertyRegeneration(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_REGENERATION_VAMPIRIC:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_REGENERATION_VAMPIRIC _OK_");
            ipTemp = ItemPropertyVampiricRegeneration(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_SAVING_THROW_BONUS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_SAVING_THROW_BONUS _OK_");
            ipTemp = ItemPropertyBonusSavingThrowVsX(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC _OK_");
            ipTemp = ItemPropertyBonusSavingThrow(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_SKILL_BONUS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_SKILL_BONUS _OK_");
            ipTemp = ItemPropertySkillBonus(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_SPECIAL_WALK:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_SPECIAL_WALK ?OK?");
            ipTemp = ItemPropertySpecialWalk(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_SPELL_RESISTANCE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_SPELL_RESISTANCE _OK_");
            ipTemp = ItemPropertyBonusSpellResistance(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_THIEVES_TOOLS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_THIEVES_TOOLS _OK_");
            ipTemp = ItemPropertyThievesTools(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_TRAP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_TRAP _OK_");
            ipTemp = ItemPropertyTrap(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_TRUE_SEEING:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_TRUE_SEEING _OK_");
            ipTemp = ItemPropertyTrueSeeing();
            break;
/*OK*/  case ITEM_PROPERTY_TURN_RESISTANCE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_TURN_RESISTANCE _OK_");
            ipTemp = ItemPropertyTurnResistance(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_UNLIMITED_AMMUNITION:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_UNLIMITED_AMMUNITION _OK_");
            ipTemp = ItemPropertyUnlimitedAmmo(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_USE_LIMITATION_ALIGNMENT_GROUP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_USE_LIMITATION_ALIGNMENT_GROUP _OK_");
            ipTemp = ItemPropertyLimitUseByAlign(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_USE_LIMITATION_CLASS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_USE_LIMITATION_CLASS _OK_");
            ipTemp = ItemPropertyLimitUseByClass(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_USE_LIMITATION_RACIAL_TYPE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_USE_LIMITATION_RACIAL_TYPE _OK_");
            ipTemp = ItemPropertyLimitUseByRace(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_USE_LIMITATION_SPECIFIC_ALIGNMENT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_USE_LIMITATION_SPECIFIC_ALIGNMENT _OK_");
            ipTemp = ItemPropertyLimitUseBySAlign(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_USE_LIMITATION_TILESET:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_USE_LIMITATION_TILESET");
            break;
/*OK*/  case ITEM_PROPERTY_VISUALEFFECT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_VISUALEFFECT _OK_");
            ipTemp = ItemPropertyVisualEffect(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_WEIGHT_INCREASE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_WEIGHT_INCREASE _OK_");
            ipTemp = ItemPropertyWeightIncrease(nParam1Value);
            break;
        default:
            //SendMessageToPC(GetFirstPC(), "const default");
            break;
    }

    if (GetIsItemPropertyValid(ipTemp)) {
        AddItemProperty(DURATION_TYPE_PERMANENT, ipTemp, oItem);
    }
}

Данный скрипт можно исползовать для создания банка вещей. Так как проблема сохранения вещей с динамическими теперь отпадает.
Tarre Talliorne
http://rage-t.boom.ru/creative.html
На эой страничке нашего сайта висят пару библиотек. ИМХО довольно полезных.
Лито
Многие начинающие не могут нормально соединить несколько отдельных скриптов в один целый, например часто надо вписывать в скрипт OnClientEnter дополнительные...хм...вещи. Специально для них я сделал систему захода игрока на сервер. она соединяет два скрипта _kaa_ и baal в одно целое, кроме того в системе реализованна выдача начального пакета по класу. Все что надо изменить это вбить РесРефы вещей которые вы хотите дать игроку.
Проверка на первый заход производится с помощью проверки на наличие определенного предмета в инвенторе, то есть если этот предмет есть то скрипт останавливается на точке выдачи стартового пакета, если же этого предмета нет, то скрипт выдает игроку этот предметsmile.gif и стартовый пакет. В моем случае этот предмет oBook, создаете предмет, копируете его ресреф и заменяете
object oBook=GetItemPossessedBy(oPC, "item004"); на свой

Вот сама система:
Neverwinter Script Source
//::///////////////////////////////////////////////
//:: module_enter
//:://////////////////////////////////////////////
/*   system OnClientEnter
*/

//:://////////////////////////////////////////////
//:: Created By: _kaa_ , Baal , Ëèòî
//:: Created On: Jan 27, 2005
//:://////////////////////////////////////////////
#include "nw_o0_itemmaker"
void main()
{
object oPC = GetEnteringObject();
object oStore = GetModule();
string sStoreName = GetName(oPC)+GetPCPlayerName(oPC); // =[PC name] + [login name]
SetLocalString(oPC,"HP_MyIdString",sStoreName); // Çàãðóçêà õèò ïîèíòîâ è ñïåëëîâ
int iSavedHP = GetLocalInt(oStore,sStoreName);
if (iSavedHP != 0)
{
effect efDamage = EffectDamage(GetMaxHitPoints(oPC)-iSavedHP,DAMAGE_TYPE_MAGICAL,DAMAGE_POWER_ENERGY);
ApplyEffectToObject(DURATION_TYPE_INSTANT,efDamage,oPC);
}

int k,j,nSpells;
for (k=1; k < 510; k++)
{
nSpells = GetLocalArrayInt(oStore,sStoreName+"_spells",k);
if (nSpells)
  for (j=0; j <= GetHasSpell(k,oPC)-nSpells; j++) DecrementRemainingSpellUses(oPC, k);
if(GetIsDM(oPC)) //Åñëè DM, òî íå âûäàâàòü ñòàðòîâûé ïàêåò
        return;
object oBook=GetItemPossessedBy(oPC, "item004");
if(!GetIsObjectValid(oBook))  //Åñëè äîñòóïåí ïðåäìåò ñ ResRef*îì "item004",
                              //íå âûäàâàòü ñòàðòîâûé ïàêåò, åñëè íå äîñòóïåí, òî óíè÷òîæèòü âñå âåùè â èíâåíòàðå
{
  object oItem = GetFirstItemInInventory (oPC);
  while(GetIsObjectValid(oItem))
    {
    DestroyObject(oItem);
    oItem = GetNextItemInInventory (oPC);
    }
  int i=0;
  while(i<14)
    {
    DestroyObject(GetItemInSlot(i, oPC));
    i++;
    }
if(GetLevelByClass(CLASS_TYPE_FIGHTER, oPC)) //Âûäà÷à íà÷àëüíîãî ïàêåòà ïî êëàññó
    {
  GiveGoldToCreature(oPC, 500);
  CreateItemOnObject("item004", oPC); //Âûäà÷à âåùåé ïî ResRef*àì
  CreateItemOnObject("Item", oPC);
   CreateItemOnObject("Item", oPC);
    CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_BARBARIAN, oPC))
  {
    GiveGoldToCreature(oPC, 500);
  CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
   CreateItemOnObject("Item", oPC);
    CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_MONK, oPC))
  {
      GiveGoldToCreature(oPC, 500);
  CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
   CreateItemOnObject("Item", oPC);
    CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_RANGER, oPC))
  {
    CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
   CreateItemOnObject("Item", oPC);
    CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_WIZARD, oPC))
  {
      CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
   CreateItemOnObject("Item", oPC);
    CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_SORCERER, oPC))
  {
  CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_BARD, oPC))
  {
    CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_DRUID, oPC))
  {
      CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_BARD, oPC))
  {
  CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_CLERIC, oPC))
  {
  CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_PALADIN, oPC))
  {
  CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_ROGUE, oPC))
  {
  CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  }
  }
}


Кроме того чтобы скрипт нормально работал надо поставить еще один(_kaa_) на OnClientLeave
Вот и он
Neverwinter Script Source
#include "nw_o0_itemmaker"
void main()
{
object oPC = GetExitingObject();
object oStore = GetModule();
string sStoreName = GetLocalString(oPC,"HP_MyIdString");
SetLocalInt(oStore, sStoreName, GetCurrentHitPoints(oPC));
int k,nSpells;
for (k=1;k<510;k++)
{
nSpells = GetHasSpell(k,oPC);
if (nSpells)
  SetLocalArrayInt(oStore,sStoreName+"_spells",k,nSpells);
}
}
Lex
Скрипт на смерть НПС. НПС исчезает, а на его месте появляется труп на который переносятся все вещи покойного. Сам труп исчезает через 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)));
}
Aiwan
СКРИПТ ВЕДУЩИЙ ИГРОКА ЗА НПС ПО ТОЧКАМ.
Вейпов должно быть столько сколько я нарисовал, но либо меньше 10 ли бо больше чем у меня. Почему? Не знаю, неделю гонял Стинки по вейпам и он гад прыгал на некоторые из них при количестве 10, а так нет. Идет как миленький.
и расчитай скорость так, что бы НПС НЕ ЗАСТРЯЛ и не опаздал на 15 сек до точки. Иначе вы просто прыгнете на следующий вейп и диалог прервется. А так он остановится и продолжите диалог.

Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2004 WRG!  www.wrg.ru
//:: am_pc_stinki_go2
//:://////////////////////////////////////////////
/*
  ПЕРЕДВИЖЕНИЕ оРС ЗА НПС, СКРИПТ СТАВИТСЯ
    НА СТРОКУ В ДИАЛОГЕ oPC (!)

*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan    Aiwan@e-mail.ru
//:: Created On: 20.03.2004
//:://////////////////////////////////////////////
void main()
{
    object oPC = GetPCSpeaker();
    object oStinki = GetObjectByTag("MM_STINKI");
    object oWp01 = GetObjectByTag("WP_STINKI_01");
    object oWp02 = GetObjectByTag("WP_STINKI_02");
    object oWp03 = GetObjectByTag("WP_STINKI_03");
    object oWp04 = GetObjectByTag("WP_STINKI_04");
    object oWp05 = GetObjectByTag("WP_STINKI_05");
    object oWp06 = GetObjectByTag("WP_STINKI_06");
    object oWp07 = GetObjectByTag("WP_STINKI_07");
    object oWp08 = GetObjectByTag("WP_STINKI_08");
    object oWp09 = GetObjectByTag("WP_STINKI_09");
    object oWp10 = GetObjectByTag("WP_STINKI_10");
    object oWp11 = GetObjectByTag("WP_STINKI_11");
    object oDoor = GetObjectByTag("AM_DOOR_FLEG_NO");
    effect eHaste = EffectHaste(); // ЧТО БЫ ИГРОК НЕ ОТСТАВАЛ!

    SetLocalInt(oPC, "STINKI", 3);
    AssignCommand(oStinki, ActionPauseConversation());
    AssignCommand(oPC, ActionForceFollowObject(oStinki, 4.0f));
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHaste, oPC, 9999.0);
    AssignCommand(oStinki, ActionDoCommand(SetCommandable(FALSE, oPC)));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp02, TRUE, 4.0));
    AssignCommand(oStinki, ActionDoCommand(SetFacingPoint(GetPosition(oPC))));
    AssignCommand(oStinki, ActionDoCommand(SpeakString("Не отставай!")));
    AssignCommand(oStinki, ActionWait(1.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp03, TRUE, 4.0));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp04, TRUE, 4.0));
    AssignCommand(oStinki, ActionDoCommand(SetFacingPoint(GetPosition(oPC))));
    AssignCommand(oStinki, ActionDoCommand(SpeakString("Не сильно быстро?")));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp05, TRUE, 4.0));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oDoor, TRUE, 4.0));
    AssignCommand(oStinki, ActionDoCommand(SpeakString("Не обращай внимание, нас никто не тронет.")));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp06, TRUE, 4.0));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp07, TRUE, 4.0));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp08, TRUE, 1.0));
    AssignCommand(oStinki, ActionDoCommand(SpeakString("Мы почти пришли!")));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp09, TRUE, 1.0));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp10, TRUE, 1.0));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp11, TRUE, 1.0));
    AssignCommand(oStinki, ActionDoCommand(SetFacingPoint(GetPosition(oPC))));
    AssignCommand(oStinki, ActionDoCommand(RemoveEffect(oPC, eHaste)));
    AssignCommand(oStinki, ActionDoCommand(SetCommandable(TRUE, oPC)));
    AssignCommand(oStinki, ActionResumeConversation());
}
Lex
СЕРИЯ "СКРИПТЫ ПРОКЛЯТИЯ ЛЕВОРА"
ЦИКЛ "СКРИПТЫ ДЯДЮШКИ LEX'А"


Цель:
сделать 2 (можно и более) НПС которые как будто между собой разговаривают.
(те, кто играл ПЛ в Тсурлаголе видели такие примеры. Особенно в тавернах.)
Реализация:
ставим 2х НПС, даем соотв. тэги и ставим между ними нивидимый объект, в ХБ которого вносим этот скрипт.

"+" - эффект диалога. Так как фразы стыкуются (вы сами их пишите так, что на вопрос дается ответ и прочее.) так как они все парные.
"-" - на каждую уникальную группу свой скрипт. Текст разговора пишется в скрипте.

Neverwinter Script Source
//::///////////////////////////////////////////////
//:: Name lm_2speakers
//:: Copyright © 2004 -=WRG!=-
//:://////////////////////////////////////////////
/*
скрипт разговора 2-х НПС. Шаблон.
*/

//:://////////////////////////////////////////////
//:: Created By: Lex
//:: Created On: Agust 2004
//:://////////////////////////////////////////////

void ANIMATION(object oD)
/// Рандомная анимация во время разговора. настраивайте сами.
    {
    int A=0;
    float T,S;
    switch (Random(8)+1)
       {
       case 2: A=ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD;T=3.0;S=1.0;break;
       case 3: A=ANIMATION_FIREFORGET_TAUNT;T=3.0;S=1.0;break;
       case 4: A=ANIMATION_FIREFORGET_PAUSE_BORED;S=1.0;break;
       case 5: A=ANIMATION_LOOPING_LISTEN;T=5.0;S=1.0;break;
       case 6: A=ANIMATION_LOOPING_LISTEN;T=5.0;S=1.0;break;
       }
    if (A==0) return;
    AssignCommand(oD,PlayAnimation(A,S,T));
    }

void DIALOG(object oD1,object oD2)
    {
    string s1="",s2="";
    string ya = GetName(GetObjectByTag("ya")); // "+ya+"
    switch (Random(30))
         {
         case 0: s1="Как дела, друг?";s2="Да идут по маленьку..";break;
         case 1: s1="И как она? Симпатична"+ya+"?";s2="А как же! Ты мен"+ya+" обижаешь!";break;
         /// и так далее 20 фраз типа вопрос-выссказывание и ответ на это дело
         }
    AssignCommand(oD1,SpeakString(s1)); /// первый НПС говорит фразу
    AssignCommand(oD2,DelayCommand(5.0,SpeakString(s2))); /// второй отвечает
    }

void main()
{
object oPC = GetFirstPC();
if (GetArea(oPC)!=GetArea(OBJECT_SELF)) return; // если нет игрока, то молчим
object oD1 = GetNearestObjectByTag("SPEAKING_NPC_1"); // первый НПС
object oD2 = GetNearestObjectByTag("SPEAKING_NPC_1"); // второй НПС
if (GetIsInCombat(oD1)) return; // если первый НПС дерется то молчим
if (GetIsInCombat(oD2)) return; // если второй НПС дерется то молчим
if ( (IsInConversation(oD1)) || (IsInConversation(oD2)) ) return; /// если один из НПС разговаривает с игроком
if (GetDistanceToObject(oPC)>10.0) return; // если игрок далеко (больше 10 футов) то он как будто ничего не слышит.
AssignCommand(oD1,SetFacingPoint(GetPosition(oD2))); // повернуться навтречу друг другу
AssignCommand(oD2,SetFacingPoint(GetPosition(oD1)));
DIALOG(oD1,oD2);
ANIMATION(oD1);
ANIMATION(oD2);
}



================================================================================

Небольшой простенький скрипт на слот onDamage плэйсебла. (ТЭГ плэйса "DANGER")

Плэйс взрывается, если его повредить. Если у вас есть Проклятие Левора, то в пещере почти все бочки это объекты с таким скриптом. Сила взрыва растет, если рядом есть такие же объекты.
ВНИМАНИЕ: больше таких 5 рядом не ставить. Тормозит....скрипт не оптимален.
Делалася под СоУ, поэтому использованны не локалки, а поле
KeyTag. Скрипт старый и давно мной не улучшавшийся. Это вам просто для работы.
(как юзать в таком варианте KeyTaG:
ставим флаг Закрыто и Требуется ключ. Поле открывается. Теперь пишем туда что надо и снимаем флаг Закрыто.
ограничение: скрипт лучше не ставить на закрытые объекты, так как поле KeyTaG нужно для работы.)
в поле KeyTag радиус и сила взрыва: X_Y
X - сила по нижепреведенной шкале. По умолчанию 2
1 - слабый
2 - средний
3 - сильный
Y - радиус в футах. (не более 9). По умолчанию 5 футов.
подрыв объекта происходит при повреждении более чем на 30%.
Neverwinter Script Source
//::///////////////////////////////////////////////
//:: Name ******
//:: FileName lm_damage_danger
//:: Copyright © 2003 -=WRG!=-.
//:://////////////////////////////////////////////
/*
THIS SCRIPT CHECKS IF ANYBODY DAMAGED DANGER OBJECT MORE THEN 30%
THEN THE OBJECT EXPLOSE
EXPLOSION DEPENDS ON STRONG EXPLOSION RADIUS.
EXPLOSION RADIUS & STRONG ARE IN TrapKeyTag of object
*/

//:://////////////////////////////////////////////
//:: Created By: Lex
//:: Created On: October 2003
//:: Special thanks to:
//::    Baal (WRG) for advice about calculation power
//:://////////////////////////////////////////////

void DamageObject(float ExplosionRadius, int Strong, object oDamager, location lCenter)
   {
   float modifier=1.0;
   effect eAddition;
   int DamagePower=DAMAGE_POWER_PLUS_ONE;
   float fDistance = GetDistanceBetweenLocations(GetLocation(oDamager),lCenter);
   switch(Strong)
      {
      case 1: modifier=0.5;
              DamagePower=DAMAGE_POWER_NORMAL;
              eAddition = EffectFrightened();
              break;
      case 2: modifier=1.0;
              DamagePower=DAMAGE_POWER_PLUS_ONE;
              eAddition = EffectFrightened();
              break;
      case 3: modifier=1.5;
              DamagePower=DAMAGE_POWER_PLUS_TWO;
              eAddition = EffectParalyze();
              break;
      default:modifier=2.0;
              DamagePower=DAMAGE_POWER_PLUS_THREE;
              eAddition = EffectParalyze();
              break;
      }
   int iDamage = FloatToInt((ExplosionRadius*ExplosionRadius/2 - fDistance*fDistance/2)*modifier+modifier*5);
   effect eDamage = EffectDamage(iDamage,DAMAGE_TYPE_FIRE,DamagePower);
   AssignCommand(oDamager,ClearAllActions());
   AssignCommand(oDamager,DelayCommand(0.2,SetCommandable(FALSE,oDamager)));
   if (GetObjectType(oDamager)==OBJECT_TYPE_CREATURE)
       if (Random(2)==1)
           AssignCommand(oDamager,PlayAnimation(ANIMATION_LOOPING_DEAD_FRONT,0.6,2.0));
       else AssignCommand(oDamager,PlayAnimation(ANIMATION_LOOPING_DEAD_BACK,0.6,2.0));
   AssignCommand(oDamager,DelayCommand(0.8,ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectVisualEffect(VFX_COM_HIT_FIRE),oDamager,1.0)));
   if (fDistance<=ExplosionRadius/3)
     {
     float time = modifier*ExplosionRadius/fDistance;
     AssignCommand(oDamager,DelayCommand(0.8,ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eAddition,oDamager,time)));
     }
   AssignCommand(oDamager,DelayCommand(0.3,ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,oDamager)));
   AssignCommand(oDamager,DelayCommand(2.5,SetCommandable(TRUE,oDamager)));
   }
void main()
{
//========================================================
int iDamage;
float ExplosionRadius;
int Strong;
location lCenter;
int Next=TRUE;
int Filter;
int Explosion;
object oDamager;
string STR;
int Critical=0;
Filter = OBJECT_TYPE_CREATURE | OBJECT_TYPE_PLACEABLE;
lCenter = GetLocation(OBJECT_SELF);
if (GetTrapKeyTag(OBJECT_SELF)!="**")
   {
   ExplosionRadius=5.0;
   Strong=2;
   }
else if (GetTag(OBJECT_SELF)!="ITM_FIREMINE")
   {
    iDamage = GetMaxHitPoints()-GetCurrentHitPoints();
    STR = GetStringRight(GetTrapKeyTag(OBJECT_SELF),1);
    if (STR!="") ExplosionRadius = StringToFloat(STR);
    STR = GetStringLeft(GetTrapKeyTag(OBJECT_SELF),1);
    if (STR!="") Strong = StringToInt(STR);
    if ((Strong>3)||(Strong==0)) Strong=2;
    if ((ExplosionRadius>10.0)||(ExplosionRadius==0.0)) ExplosionRadius=5.0;
    if (iDamage*10 < GetMaxHitPoints()*3) return;
   }
else
   {
   ExplosionRadius = 6.5;
   Strong = 2;
   SendMessageToPC(GetFirstPC(),"MINE");
   }
Strong = GetLocalInt(OBJECT_SELF,"ADD_STRONG")+Strong;
if (Strong<3) Explosion = VFX_FNF_GAS_EXPLOSION_FIRE;
else Explosion = VFX_FNF_FIREBALL;
if ((iDamage<GetMaxHitPoints()/3)&&(GetDamageDealtByType(DAMAGE_TYPE_FIRE)==0)) return;
if (GetLocalInt(OBJECT_SELF,"ALREADY")) return;
SetLocalInt(OBJECT_SELF,"ALREADY",TRUE);
oDamager = GetFirstObjectInShape(SHAPE_SPHERE,ExplosionRadius,lCenter,TRUE,Filter);
object oPC = GetFirstPC();
DestroyObject(OBJECT_SELF);
if ((GetLocalInt(GetObjectByTag("TS_LOCALS"),"FIRECAMP_DESTROED"))&&(GetTag(GetArea(OBJECT_SELF))=="TSUR_SUB_EASTFOREST_BOMBCAVE"))
     return;
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY,EffectVisualEffect(VFX_IMP_PULSE_FIRE),lCenter,1.5);
ApplyEffectAtLocation(DURATION_TYPE_PERMANENT,EffectVisualEffect(Explosion),lCenter);
   while (GetIsObjectValid(oDamager))
     {
     if ((GetTag(oDamager)=="DANGER")&&(!GetLocalInt(oDamager,"ALREADY"))&&(GetDistanceToObject(oDamager)<=ExplosionRadius/2))
        {
        if (Next) SetLocalInt(oDamager,"ADD_STRONG",1);
        ExplosionRadius = ExplosionRadius + 2.0;
        Critical++;
        }
     if (Critical==3)
         {
         Next=TRUE;
         }
     if (Critical==5)
         {
         Strong++;
         Critical=0;
         }
     AssignCommand(oDamager,DamageObject(ExplosionRadius,Strong,oDamager,lCenter));
     oDamager = GetNextObjectInShape(SHAPE_SPHERE,ExplosionRadius,lCenter,TRUE,Filter);
     }
}
Aiwan
СЕРИЯ "СКРИПТЫ ПРОКЛЯТИЯ ЛЕВОРА"
ЦИКЛ "СКРИПТЫ ДЯДЮШКИ AIWAN'А"


Скрипт который позволяет при наличии надетой брони с определенным ТЕГом ходить во вражественном лагере smile.gif Ну или где там вам надо...
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Created By: WRG! Aiwan aiwan@e-mail.ru
//:: Created On: 14.01.2004
//:://////////////////////////////////////////////
//:: Скрипт проверки брони "Железного Трона"
//::  у РС на фрегате "Отшельник"
//:://////////////////////////////////////////////
#include "NW_I0_GENERIC"

void main()
{
if (GetArea(OBJECT_SELF) != GetArea(GetFirstPC()))
       return; // Если РС нет в локации то возврат
   int nEvent = GetUserDefinedEventNumber();
   if (nEvent == 1002) // Стандартный эвент на юзердеф
   {
    object oPC = GetLastPerceived();
    object oNPC = OBJECT_SELF;
    object oArm = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC); // Предмет в слоте РС "броня"
      if (GetLastPerceptionSeen() && GetIsPC(oPC))
         {
          if (GetTag(oArm) != "AM_ITM_IRONTRON" && GetLocalInt(oPC,"TRONE_ALARM") != 1)
          // Если Таг надетой брони не равен AM_ITM_IRONTRON и нет локалки тревоги
            {
             SetLocalInt(oPC, "TRONE_ALARM", 1); // Вы обнаружены и поднята тревога
             SetFacingPoint(GetPosition(oPC));
             SpeakString("А ну стой, ты что тут вынюхиваешь?!");
             AdjustReputation(oPC, oNPC, -100);
             DetermineCombatRound(oPC);
             }
            if (GetLocalInt(oNPC, "LOOK") != 1 && GetTag(oArm) == "AM_ITM_IRONTRON" &&
                GetLocalInt(oPC,"TRONE_ALARM") != 1)
             {
             SetLocalInt(oNPC, "LOOK", 1); // Ставим локалку что бы часто не болтали
             AssignCommand(oNPC, ClearAllActions());
             AssignCommand(oNPC, ActionDoCommand(SetFacingPoint(GetPosition(oPC))));
             DelayCommand(16.0f, SetLocalInt(oNPC, "LOOK", 0));
             int iRand = Random(10);
              switch (iRand)
              {
                    case 0:
                    {
                         SpeakString("Займись делом, солдат!"); break;
                    }
                    case 1:
                    {
                         SpeakString("Привет, ты новенький?"); break;
                    }
                    case 2:
                    {
                        SpeakString("Смотри, скоро прибудут боссы..."); break;
                    }
                    case 3:
                    {
                        SpeakString("Ты откуда выполз?"); break;
                    }
                    case 4:
                    {
                        SpeakString("Ты чего тут делаешь?"); break;
                    case 5:
                    {
                        SpeakString("Слушай, твои доспехи тебе не жмут?"); break;
                    case 6:
                    {
                        SpeakString("Иди на пост!"); break;
                    }
                     case 7:
                    {
                        SpeakString("Я твою рожу не помню что-то..."); break;
                    }
                     case 8:
                    {
                        SpeakString("Эй, ты свой ведь? Да?"); break;
                    }
                     AssignCommand(oNPC, ActionDoCommand(WalkWayPoints()));
               }
              }
            }
          }
        }
       }
    return;
}


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

Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2004 WRG!  www.wrg.ru
//:: Name: oud_am_warrord
//:://////////////////////////////////////////////
/*
   UserDefined - СКРИПТ ЗАПУСКА СЦЕНЫ С ДАЛЛИКОМ
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan    Aiwan@e-mail.ru
//:: Created On: 26.02.2004
//:://////////////////////////////////////////////
void main()
{
int nEvent = GetUserDefinedEventNumber();
//======================= DAMAGED EVENT 1006 ===================================
if (nEvent == 1006)
  {
   object oPC = GetFirstPC(); // Опишите своего РС как вам надо.
   object oCat = GetHenchman(oPC);
   object oWord = OBJECT_SELF;
   object oSlave1 = GetObjectByTag("AM_SKELLETON_SLAVE_01"); // Скелет - Раб 1
   object oSlave2 = GetObjectByTag("AM_SKELLETON_SLAVE_02"); // Скелет - Раб 2
   object oWPTrone = GetObjectByTag("WP_TRONE_WARRIOR");
   int iCurHP = GetCurrentHitPoints(OBJECT_SELF);
   int iMaxHP = GetMaxHitPoints(OBJECT_SELF);
   int iD;
//==============================================================================
  if (!GetIsPC(oPC) || !GetLocalInt(oPC, "DALLIK_HELP"))
    {return;}
    int Class = GetClassByPosition(1, oPC); // При разных классах надо нанести разное повреждение
    switch (Class)
      {
      case CLASS_TYPE_BARBARIAN:{iD = 200; break;}
      case CLASS_TYPE_BARD:{iD = 300; break;}
      case CLASS_TYPE_CLERIC:{iD = 250; break;}
      case CLASS_TYPE_DRUID:{iD = 300; break;}
      case CLASS_TYPE_FIGHTER:{iD = 200; break;}
      case CLASS_TYPE_MONK:{iD = 150; break;}
      case CLASS_TYPE_PALADIN:{iD = 200; break;}
      case CLASS_TYPE_RANGER:{iD = 250; break;}
      case CLASS_TYPE_ROGUE:{iD = 300; break;}
      case CLASS_TYPE_SORCERER:{iD = 300; break;}
      case CLASS_TYPE_WIZARD:{iD = 300; break;}
      }

  if (GetIsPC(oPC) && ((iMaxHP - iD) >= iCurHP) && !GetLocalInt(oWord, "DALLIK_JAMP"))
   {
   SetLocalInt(oWord, "DALLIK_JAMP", TRUE);
   AssignCommand(oPC, ClearAllActions());
   AssignCommand(oCat, ClearAllActions());
   AssignCommand(OBJECT_SELF, ClearAllActions());
   AssignCommand(oSlave1, ClearAllActions());
   AssignCommand(oSlave2, ClearAllActions());
   ExecuteScript("am_chang_fr_warr", OBJECT_SELF); // Скрипт меняет репутацию у участников боя
// DelayCommand(0.5, ExecuteScript("am_scen_warr_03", oPC));
   }
  }
}


Вот сам скрипт смены репутации:
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2004 WRG!  www.wrg.ru
//:: name: am_chang_fr_warr
//:://////////////////////////////////////////////
/*
     ИЗМЕНЕНИЕ ФРАКЦИИ И ПЕРСОНАЛНЫХ ОТНОШЕНИЙ
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan    Aiwan@e-mail.ru
//:: Created On: 23.03.2004
//:://////////////////////////////////////////////
void main()
{
   object oPC = GetFirstPC();
   object oHen = GetHenchman(oPC);
   object oWord = GetObjectByTag("AM_WARRIOR_HORDE"); // Воин Орды
   object oSlave1 = GetObjectByTag("AM_SKELLETON_SLAVE_01"); // Скелет - Раб 1
   object oSlave2 = GetObjectByTag("AM_SKELLETON_SLAVE_02"); // Скелет - Раб 2
   location lClose = GetLocation(GetObjectByTag("AIWAN_CLOSE_ARENA")); //Скрыт.арена Aiwan'a
   object oNeutral = GetObjectByTag("AM_TRUE_NEUTRAL"); // Нейтральный НПС с фракцией ПОФИГИСТОВ
   ChangeFaction(oWord, oNeutral);
   ChangeFaction(oSlave1, oNeutral);
   ChangeFaction(oSlave2, oNeutral);
//--------------------------------------
   ClearPersonalReputation(oSlave1, oPC);
   ClearPersonalReputation(oPC, oSlave1);
   ClearPersonalReputation(oSlave1, oHen);
   ClearPersonalReputation(oHen, oSlave1);
//--------------------------------------
   ClearPersonalReputation(oSlave2, oPC);
   ClearPersonalReputation(oPC, oSlave2);
   ClearPersonalReputation(oSlave2, oHen);
   ClearPersonalReputation(oHen, oSlave2);
//--------------------------------------
   ClearPersonalReputation(oWord, oPC);
   ClearPersonalReputation(oPC, oWord);
   ClearPersonalReputation(oWord, oHen);
   ClearPersonalReputation(oHen, oWord);
}



СКРИПТ ЗАПРЕЩАЮЩИЙ МОНСТРАМ ВЫХОДИТЬ
ИЗ ЛОКАЦИИ ВСЛЕД ЗА ИГРОКОМ
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2004 WRG
//:: a0_onareaexit
//:://////////////////////////////////////////////
/*
    СКРИПТ ЗАПРЕЩАЮЩИЙ МОНСТРАМ ВЫХОДИТЬ
        ИЗ ЛОКАЦИИ ВСЛЕД ЗА ИГРОКОМ
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan    Aiwan@e-mail.ru
//:: Created On: 21.04.2004
//:://////////////////////////////////////////////
void main()
{
  object oPC = GetEnteringObject();
  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);
  object oJamp = GetTransitionTarget(OBJECT_SELF);
  //Чисто для моих земель, чтобы фамилиары не разгуливали где попало, пока их владельцы задумчиво стоят в области
  if (GetIsPC(oPC) && !GetIsPosessedFamiliar(oPC))
  {
  AssignCommand(oPC, JumpToObject(oJamp));
  AssignCommand(oAnimal, JumpToObject(oJamp));
  AssignCommand(oDominated, JumpToObject(oJamp));
  AssignCommand(oFamiliar, JumpToObject(oJamp));
  AssignCommand(oHenchman, JumpToObject(oJamp));
  AssignCommand(oSummoned, JumpToObject(oJamp));
  }
  else
  {
  //Иначе наши монстрyaшки будут задумчиво покачиваться у двери, совершенно беззащитные
  AssignCommand(oPC, ClearAllActions());
  }
}
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.