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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
5 страниц V   1 2 3 > »   
Ответить в эту темуОткрыть новую тему
> База скриптов, Готовые скрипты. Описание обязательно.
Lex
сообщение Mar 27 2004, 22:00
Сообщение #1


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

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Сюда выкладывать ваши скрипты и системы скриптов с описанием.
ОБСУЖДЕНИЕ, ВОПРОСЫ И ПРОСЬБЫ О ПОМОЩИ НЕ В ЭТОЙ ТЕМЕ.

ОГЛАВЛЕНИЕ:

-- страница 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крипт для разных таверн. Официантка ходит по таверне подходит к разнам клиентам ,спрашивает заказ
* Дерево, которое можно рубить только специальным топором и после некоторых мучений отрубить таки сук. Другое оружие тупится об это дерево.



Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Guest_Tarre T._*
сообщение Apr 2 2004, 15:08
Сообщение #2








Скрипт мой, все совпадения случайны. Синьки: "blood"-пятно крови.
Так как в ДнД не описано, при каком дамаге и сколько должно выливаться крови у ПС, я буду руководствоваться практическими соображениями(IMG:style_emoticons/kolobok_light/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;
}}


Сообщение отредактировал Twin - Jan 9 2005, 17:39
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Bot
сообщение Apr 3 2004, 16:37
Сообщение #3


Level 3
*

Класс: Клерик
Характер: Chaotic Good
Раса: Человек



Да, РэндомЛокэйшн в предыдущем скрипте взят с форумов рилмс.ру.
Lex: RandomLocation - Бааловский скрипт.
Еще один скрипт. Посмертный(IMG:style_emoticons/kolobok_light/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. Так удобнее читать и разбираться в скриптах.

Сообщение отредактировал Twin - Jan 9 2005, 17:40
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Apr 4 2004, 19:31
Сообщение #4


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

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



В общем простой скриптик, экономящий кучу времени и ресурсов. На 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;
           }
}


Сообщение отредактировал Twin - Jan 9 2005, 17:41
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Apr 23 2004, 08:12
Сообщение #5


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

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



Я тут задумался о пиратах, выползающих из шахт и убивающих мирных жителей Андра-Дуна. :cruel: Вот простенький скрипт на OnAreaTransitionClick . Теперь пираты ждут вас и курят бамбук там где должны (IMG:style_emoticons/kolobok_light/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));
  }
}


Сообщение отредактировал Twin - Jan 9 2005, 17:43
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Baal
сообщение May 4 2004, 13:28
Сообщение #6


Вечно исчезающий
Иконки Групп

Класс: Маг
Характер: True Neutral
Раса: Человек
NWN: Скриптинг [Sn]
Проклятие Левора



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


Этот скрипт я писал для Айс Блэйда, для его проекта ледяной стены. Скрипт должен создавать заданное количество плэйсиблов (сигментов ледяной стены) напротив игрока и дестроить их через заданное время. Пока я использовал синьки сдандартных ящиков (IMG:style_emoticons/kolobok_light/smile.gif) Всего два вида чередующихся плэйсиблов.

Сообщение отредактировал Baal - Mar 11 2005, 21:14
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lord of V@MPIRES
сообщение May 8 2004, 15:57
Сообщение #7


Level 1


Класс: Волшебник
Характер: Lawful Neutral
Раса: Гном



Вы хотите добавить суб-расы в игру ? Пожайлуста ! Пока я еще не добавил им доп. умений, но скоро сделаю... надеюсь... Пока скрипт дает только спец-предмет в зависимости от суб-расы.
Инклуд суб-рас:
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 Сила.
После этого он одевается ему в слот, которого в интвентаре нет, а х-ки остаются на персонаже.

Сообщение отредактировал Twin - Jan 9 2005, 17:46
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение May 8 2004, 22:02
Сообщение #8


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

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



Вот небольшой скрипт дающий экспу за открытие двери или обезвреживание ловушки. Специально сделан так, что если за вас работает хеньчман, то много экспы не ждите. (IMG:style_emoticons/kolobok_light/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());
       }
}


Сообщение отредактировал Twin - Jan 9 2005, 17:48
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение May 9 2004, 12:13
Сообщение #9


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

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



Вот немного переделанный скрипт, кому то понравится больше чем первый.
LEX:Айв, тут у тебя пара косяков есть в коде. Я исправил и дополнил. Не сердись.
СПАСИБО ДБу за идею! (IMG:style_emoticons/kolobok_light/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
   }
}


Сообщение отредактировал Twin - Jan 9 2005, 17:50
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение May 10 2004, 20:53
Сообщение #10


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

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



Удалить не получается.... (IMG:style_emoticons/kolobok_light/smile.gif)

Сообщение отредактировал Aiwan - Aug 31 2010, 10:46
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Tarre Talliorne
сообщение May 13 2004, 15:27
Сообщение #11


Level 8
***

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



В процессе всем нам часто приходится кидать дайсы. А юзать Рандом+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);


Сообщение отредактировал Twin - Jan 9 2005, 17:53
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение May 23 2004, 09:13
Сообщение #12


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

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



Если у вас не очень много дверей, которые закрываются на ночь, то можно вставить такой скриптик на 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;
           }
}


Сообщение отредактировал Twin - Jan 9 2005, 17:55
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
DBColl
сообщение May 23 2004, 10:59
Сообщение #13


4-х Кубовый
Иконки Групп

Класс: Некромант
Характер: Lawful Evil
Раса: Человек
NWN: Скриптинг [Sn]
Проклятие Левора



Поправлю.
Код
//:://////////////////////////////////////////////
//:: 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
сообщение May 26 2004, 08:21
Сообщение #14


Level 2
*

Класс: Рейнджер
Характер: Lawful Good
Раса: Человек



Цитата

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


Имхо, логичнее экспу уменьшать с уровнем. Обосновать? А за хенчмена - чисто
формальные 10 очков. (IMG:style_emoticons/kolobok_light/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);
}

}


------
Что касается ловушек, то Ой! Разве воришка не может ставить и обезвреживать
собственные ловушки? (IMG:style_emoticons/kolobok_light/wink3.gif) (Вспоминается Jagged Alliance, где можно было поднять
саперское умение с 1 до 100, с одной миной. (IMG:style_emoticons/kolobok_light/smile.gif) ) Проверку на Hostile?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Tarre Talliorne
сообщение May 27 2004, 19:18
Сообщение #15


Level 8
***

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



Очередная порция скриптов(начал писать АИ, вот, так сказать, начальные наработки, может, кому-нить и пригодится). Как всегда все(кроме 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: про реплы Сэрлеса: восрешение вообще есть лажа и неДнДэшно к тому ж. Ну, не пропаать же скрипту(IMG:style_emoticons/kolobok_light/smile.gif)

Сообщение отредактировал Twin - Jan 9 2005, 17:58
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Jun 24 2004, 00:53
Сообщение #16


Level 10
***

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



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 перепутал кажется(IMG:style_emoticons/kolobok_light/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
сообщение Jul 3 2004, 19:16
Сообщение #17


Level 8
***

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



Скрипты: удаляющий эффект (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;
    }

Обещанный скрипт-реакция грарда на нападение на оного ПС... Впихивается в онАтакед. Скрипт делает следущее: охранник вырубает ПС и начинает с ним диалог(лтбо что-то иное (IMG:style_emoticons/kolobok_light/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));
        }
        // диалог, либо что-то иное - на ваше усмотрение.


Сообщение отредактировал Twin - Jan 9 2005, 18:00
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Tarre Talliorne
сообщение Jul 4 2004, 13:39
Сообщение #18


Level 8
***

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



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
сообщение Jul 4 2004, 20:05
Сообщение #19


Level 8
***

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



Да, я добрался-таки до тулсы, проверил: все работает (исходя из оргинзации цикла 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
сообщение Jul 7 2004, 15:45
Сообщение #20


Level 8
***

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



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
сообщение Jul 7 2004, 21:00
Сообщение #21


Level 8
***

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



Цветной текст. Пример:
Называешь мой инклюд "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)));
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Jul 10 2004, 06:22
Сообщение #22


Level 10
***

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



Скриптики на головоломку. Тоесть не совсем головоломку... На закодированную дверь. У вас есть локация в которой есть дверь. Эта дверь изначально закрыта.
Еще там есть 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кб.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Jul 11 2004, 04:01
Сообщение #23


Level 10
***

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



Небольшой, совсем простой скриптик банка.
В нем нет никаких паролей для снятия золота, проверок на CDKey или имя игрока. Это если вам надо сами добавите как SetLocalString и проверки тоже(IMG:style_emoticons/kolobok_light/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");
   }


}
}


Айван: Молодец (IMG:style_emoticons/kolobok_light/good.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Tarre Talliorne
сообщение Jul 17 2004, 20:55
Сообщение #24


Level 8
***

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



Часть скрипта из нашей демки. У нас будет более продвинутая(в демо, думаю, включать не будем, но в релизе всего мода будет точно), чем в обыкновенном НВН система кастомных разговоров. Сейчас я (параллельно с лтом и АИ :-) ) пишу систему разговоров. Итак, решил бросить в Базу Скриптов коротенький скриптик. Суть: он ставит любое сцществительное в родительный падеж (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
сообщение Jul 21 2004, 19:58
Сообщение #25


Level 4
**

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



Ладно думал я думал и решил тут отпостить простенький скриптик на отрыскивание изначально дисбалансированных фишек вещей и замену их другими, более сбалансированными.
Тут заменяются: хаст, трусинг, иммунитеты, фридум.
Хорошо для шарда =)

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


Сообщение отредактировал Twin - Jan 8 2005, 05:57
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

5 страниц V   1 2 3 > » 
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 18th January 2018 - 19:05