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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
147 страниц V  « < 41 42 43 44 45 > »   
Ответить в эту темуОткрыть новую тему
> Скрипты, Все вопросы и ответы по скриптам
Friedrich
сообщение Apr 15 2005, 20:39
Сообщение #1036


Level 5
**

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



2 fali

1. Для смены музыки используй
void MusicBackgroundChangeDay(object oArea, int nTrack);
void MusicBackgroundChangeNight(object oArea, int nTrack);
и проч. Music* функции.
oArea - арена на которой нужно поменять музыку.
nTrack - номер трека, соответствует номеру строки в ambientmusic.2da, также можно использывать константы TRACK_*.

2-3. Ничего удовлетворительного на ум не приходит. Чеки, конечно, можно какие угодно накидать, но обставить хоть сколь-либо вразумительной анимацией...
Как например такой вариант. Сделать, типа, цепь с динамометром. Участники по очереди тянут цепь, а в локалки записывается результат:
d20()+GetAbilityModifier(ABILITY_STRENGTH, oUser);
У кого больше, тот и выиграл.

4.
QUOTE (Lex @ Apr 15 2005, 17:56)
(в предмете закладка advanced там есть состояния. В тч там есть и destroyed). Они окажутся под локацией, нивидимые для игроков. Теперь когда надо, вытаскиваем их оттуда посредством например ActionPlayAnimation(ANIMATION_PLACEABLE_ACTIVATE)

Классная вещь! А как ты об этом узнал? И эти "уничтоженные" объекты спокойно находится посредством, н.п. GetObjectByTag()?

Похоже, это будет оптимальный вариант. И, чтобы лишний раз не напрягаться, лучше, наверное, дать всем таким скрытым объектам один и тот же тег и актировать их из цикла:
Neverwinter Script Source
string sTag = "SOME_HIDDEN_OBJECT";
int i = 0;
object oPlc;
while( GetIsObjectValid(oPlc = GetObjectByTag(sTag, i++)) )// ;)
{
   AssignCommand(oPlc, ActionPlayAnimation(ANIMATION_PLACEABLE_ACTIVATE));
}

Добавлено в 20:52
Кстати, нечто подобное (изменение музыки, наложение визуальных эффектов, добавление плейсаблов) делали биовары в 3-й главе HotU, при одевании игроком кольца спящего человека. См. скрипт OnPlayerEquipItem модуля XP2_Chapter3 и инклюд hx_inc_ring (кажется).
Там они, вроде, расставляли вейпоинты и давали им имена объектов, которые нужно будет креэйтить:
CreateObject(OBJECT_TYPE_PLACEABLE, GetName(oWP), GetLocation(oWP));

Сообщение отредактировал Friedrich - Apr 15 2005, 20:53
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Apr 15 2005, 23:54
Сообщение #1037


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

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



QUOTE (Friedrich @ Apr 15 2005, 21:39)
void MusicBackgroundChangeDay(object oArea, int nTrack);
void MusicBackgroundChangeNight(object oArea, int nTrack);

Буду знать.

QUOTE (Friedrich @ Apr 15 2005, 21:39)
И эти "уничтоженные" объекты спокойно находится посредством, н.п. GetObjectByTag()?

да.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
fali
сообщение Apr 17 2005, 13:49
Сообщение #1038


Level 3
*

Класс: Бард
Характер: Chaotic Good
Раса: Полуэльф



Прошу прощения, что не сразу отвечаю -- не получилось раньше. :)

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

Про соревнования... Анимация, в общем-то, не нужна. Можно и просто обычную цель поставить для антуражу, пусть стреляють. =) Главный вопрос в том, как именно определить наиболее меткого. :) По наносимому урону... Так вроде это не совсем меткость, хотя и от нее зависит... Есть ведь дайсометы разные, которые бросают чеки на проверку способностей и навыков. Что в данном случае лучше проверять? И как эту проверку сделать, чтобы её было удобно делать и чтобы всем результат был виден? Впрочем, вариант с цепью тоже вполне может подойти. Выстрелил по цели, дернул цепь -- результат показан, а игроки уже сами цифры сравнят, чтобы решить, кто был точнее. =)
Со столом... В общем-то, тоже не обязательно проверялось наличие рядом двух соперников. Игроки могут и сами между собой разобраться, кто подойдет и на словах обыграть борьбу. Но им в помощь нужно дать возможность бросать чеки на силу/ловкость/тренированность (или что еще можно задействовать?), которые могли бы подсказать им, как идет борьба. :) К примеру, каждый делает несколько таких чеков во время борьбы, отыгрывая результаты, а на последнем уговоренном (третьем или пятом, к примеру, или после какого-то критического броска) -- считают борьбу уже завершенной.

Про изменение локации... Большое и искреннее сенькс. =) Действительно, такой логичный и простой на вид вариант. %) Ещё бы кто-нибудь дал готовый скрипт, который все эти уничтоженные объекты делал видимыми... =)

Большущее спасибо всем уже ответившим. :) Даже если и не получится сейчас со скриптами, я все это сохраню, и потом попробую разобраться, как это делается. Всё равно, наверняка, когда-нибудь нападёт охота изучить скриптописание, хотя бы основы... Если не сейчас, так тогда разберусь. =)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Apr 17 2005, 14:56
Сообщение #1039


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

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



Хм...с лучниками можно так.
Есть мишень и кто-то в нее стреляет. (кстати надо еще подумать и о дистанции). Результат - мишень выдает кол-во очков, которые набрал игрок. Можно их например суммировать. И сравнивать с суммами других игроков....
Думаю, что с мишенями я сделаю системку...самому как раз что-то такое надо.

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

Изменение локации - сделаю тебе минимодуль, глянешь, как там все.

Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Apr 17 2005, 17:11
Сообщение #1040


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

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



QUOTE (fali @ Apr 17 2005, 16:49)
Большущее спасибо всем уже ответившим. :) Даже если и не получится сейчас со скриптами, я все это сохраню, и потом попробую разобраться, как это делается. Всё равно, наверняка, когда-нибудь нападёт охота изучить скриптописание, хотя бы основы... Если не сейчас, так тогда разберусь. =)

Ну вот так всегда :D Мы то надеялись...
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Алексашка
сообщение Apr 17 2005, 17:15
Сообщение #1041


Level 3
*

Класс: Клерик
Характер: True Neutral
Раса: Человек



QUOTE (Lex @ Apr 17 2005, 14:56)
Хм...с лучниками можно так.
Есть мишень и кто-то в нее стреляет. (кстати надо еще подумать и о дистанции). Результат - мишень выдает кол-во очков, которые набрал игрок. Можно их например суммировать. И сравнивать с суммами других игроков....

У меня есть готовый скрипт. Написан правда для другого был, но принцип похожий. Можно переделать под свои нужды. Мишень как создание. С эффектом парализации. А то бывали смешные случаи, когда мишень начала гоняться за игроком. :D Скрипт писал давно, когда русского языка в тулсете небыло. Нуждается в оптимизации, но руки не доходят. Считает именно попадания, а не повреждения.
Neverwinter Script Source
#include "nw_i0_tool"
void main()
{
    object oAttacker = GetLastAttacker();

//* Should only register if hit with a ranged weapon
if( GetIsPC(oAttacker))
  {

    if(GetWeaponRanged(GetLastWeaponUsed(oAttacker)))
    {
        SpeakOneLinerConversation();

            if(GetDistanceToObject(oAttacker) > 12.0)
            {
                if(GetLocalInt(GetModule(),"archer_trening")< 100)
                {
                    SetLocalInt(GetModule(),"archer_trening",(GetLocalInt(GetModule(),"archer_trening")+1));
                    if(GetLocalInt(GetModule(),"archer_trening")== 100)
                  {

                    effect eDamage = EffectDamage(5000);
                    DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, OBJECT_SELF));

                    SetLocalInt(GetModule(), "archer_trening", 0);

                    RewardPartyXP(500, oAttacker);
                  }
                }
                else
                {

                }
                AssignCommand(GetNearestObjectByTag("Olodrin"),SpeakOneLinerConversation("arch_uspeh",oAttacker));

            }
            else
            {
                AssignCommand(GetNearestObjectByTag("Olodrin"),SpeakOneLinerConversation("blisko",oAttacker));
            }
            }
            else
            {
                AssignCommand(GetNearestObjectByTag("Olodrin"),SpeakOneLinerConversation("bow",oAttacker));
            }
            }
        else
            {
                {
        int nHeal = GetMaxHitPoints(OBJECT_SELF) - GetCurrentHitPoints(OBJECT_SELF);
        effect eHeal = EffectHeal(nHeal);
        {
        if (nHeal > 0)
            ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, OBJECT_SELF);
        }
        }

                AssignCommand(GetNearestObjectByTag("Olodrin"),SpeakOneLinerConversation("signboard11",oAttacker));
            }

        }

Добавлено в [mergetime]1113747557[/mergetime]
Подскажите, как правильно сделать проверку по времени. Я подхожу к неписю, а он говорит приходи через 3 часа. Как запомнить время в которое он мне это сказал и как проверить, что три часа прошло. :shout:
Добавлено в [mergetime]1113748392[/mergetime]
Можно например поставить переменную на 20 попаданий. Чья мишень первой получает 20 попаданий присваивает переменную 1, кто второй переменную два и т.д. На полу я опытным путем рисовал черту на дистанции 15 и если игрок был на шаг ближе, то попадание не засчитывалось, а тренер кричал: "Отойди подальше". Да там еще строка лишняя есть. Я ее делал, чтобы хенчманы, по скудоумию своему, зря в мишень не бились. :lol:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Tiger Greyhawk
сообщение Apr 18 2005, 05:55
Сообщение #1042



Иконки Групп

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



QUOTE (Алексашка @ Apr 17 2005, 18:15)
Подскажите, как правильно сделать проверку по времени. Я подхожу к неписю, а он говорит приходи через 3 часа. Как запомнить время в которое он мне это сказал и как проверить, что три часа прошло.

Есть функция int GetTimeHoure(). А потом делаешь проверку через переменную.
Есть ведь Lexicon на это. Или я совсем не так понял твою "проблему" :oops:
Ты, вроде, более-менее разбираешься же. По таким вопросам предлагаю в чат. Гораздо операивнее решится.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Apr 18 2005, 08:31
Сообщение #1043


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

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



в пределах одного дня через GetTimeHoure(), но если чел придет на сдел. день в тот же час, то облом.

Надо преобразовывать месяц, день и час в часы и запомнить. Потом сравнивать с тамки же преобразованием. Разница больше 3-х значить прошло более 3-х часов.
У меня в Тсурле все временные штуки на этом построены
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
RiPPeR
сообщение Apr 18 2005, 15:54
Сообщение #1044


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

Класс: Страж Тьмы
Характер: Chaotic Neutral
Раса: Дракон
NWN: Скриптинг [PW]



Возникла проблема с "порядком действий"
Чтобы я и не делал, нифига не работает!
Еа 99% уверен что это баг NWN, на как его обойти?

oPC и oTarget правильные объекты 100%
Строка об атаке не работает :(.
Хотя катсцен работает.

Neverwinter Script Source
effect eCutS = EffectCutsceneDominated();
effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED); // что-нибудь
                                                                                                            // красивое
effect eLink = EffectLinkEffects(eMind, eCuts);

object oTarget = GetAttackTarget(oPC);

ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oPC, 6.00);

//DelayCommand(6.00,AssignCommand(oPC,ClearAllActions(TRUE)));
AssignCommand(oPC,DelayCommand(6.00,ActionAttack(oTarget)));


Сообщение отредактировал RiPPeR - Apr 18 2005, 15:55
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Apr 18 2005, 16:07
Сообщение #1045


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

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



\\ перенес в соотв. тему

Всех предупреждаю последний раз. Кто не видел, не мои проблемы.

КТО НЕ ОЗНАКОМИТСЯ С ПРАВИЛАМИ И НАЧНЕТ ПОСТИТЬ И СОЗДАВАТЬ ТОПИКИ ПОЛУЧИТ ПРЕД.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
RiPPeR
сообщение Apr 18 2005, 16:09
Сообщение #1046


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

Класс: Страж Тьмы
Характер: Chaotic Neutral
Раса: Дракон
NWN: Скриптинг [PW]



Извиняюсь, но тут вопросы по скриптам, а у меня скорее баг движка.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Apr 18 2005, 16:14
Сообщение #1047


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

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



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

Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
RiPPeR
сообщение Apr 18 2005, 16:18
Сообщение #1048


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

Класс: Страж Тьмы
Характер: Chaotic Neutral
Раса: Дракон
NWN: Скриптинг [PW]



Задержка на 6 сек, потом атака того, кого бил до этого
Добавлено в [mergetime]1113832097[/mergetime]
Все блин, методом встраивания проверок локал интов, брания локал обжектов и других премудростей в скрипт default, все таки заработало. :crazy: :crazy: :crazy:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Алексашка
сообщение Apr 18 2005, 18:58
Сообщение #1049


Level 3
*

Класс: Клерик
Характер: True Neutral
Раса: Человек



QUOTE (Lex @ Apr 18 2005, 08:31)
в пределах одного дня через GetTimeHoure(), но если чел придет на сдел. день в тот же час, то облом.

Надо преобразовывать месяц, день и час в часы и запомнить. Потом сравнивать с тамки же преобразованием. Разница больше 3-х значить прошло более 3-х часов.
У меня в Тсурле все временные штуки на этом построены

Понял свою проблему. :D "Три часа" я писал для примера. У меня было 18 часов. И проблемка была именно с переходами в следующий день. Нужно было всего лишь скопировать инклюд из Левора :yes: и все заработало. Lex "виноват" :yes: Тсурл никак не начну проходить. Времени не хватат. :xz:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Лито
сообщение Apr 20 2005, 19:03
Сообщение #1050


Level 9
***

Класс: Страж Тьмы
Характер: Chaotic Evil
Раса: Нежить



Пожертвуйте в базу скриптов, систему опыта :oops: . Со всякими коэффицентами для разных классов. Наверняка кто нибудь писал для своих модулей

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

З.Ы. Айван нарисуй *умоляющий* смайлик :)

Сообщение отредактировал Лито - Apr 20 2005, 19:03
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Buldog
сообщение Apr 20 2005, 19:53
Сообщение #1051


Level 5
**

Класс: Мастер Оружия
Характер: Chaotic Neutral
Раса: Полуорк



Вот, писал для нашего шарда, конечно далеко от идеала, но работает, тут использованы коэффициенты для классов и для субрасс. Учтена смерть мобов от ловушек, за идею спасибо HitmanXXX. В партии экспа распределяется в зависимости от лвла чаров, которые были рядом с убитым мобом + штрафы за большой разброс по лвлам, для защиты от нубокача.

Состоит из 2х скриптов, инклюд:

inc_xpsystem_nd
Neverwinter Script Source
///////////////////////////////////////////////
//*******************************************//
//***********Created by Buldog***************//
//*******************************************//
//*******************************************//
//**********Modified 20.04.2005**************//
//*******************************************//
///////////////////////////////////////////////

//Classes coefficients
const float FIGHTER_COEFFICIENT          = 1.5;
const float ARCANE_ARCHER_COEFFICIENT    = 0.9;
const float ASSASSIN_COEFFICIENT        = 1.5;
const float BARBARIAN_COEFFICIENT        = 1.5;
const float BARD_COEFFICIENT            = 0.8;
const float BLACKGUARD_COEFFICIENT      = 1.2;
const float CLERIC_COEFFICIENT          = 0.8;
const float DIVINE_CHAMPION_COEFFICIENT  = 0.9;
const float DRAGON_DISCIPLE_COEFFICIENT  = 0.9;
const float DRUID_COEFFICIENT            = 1.4;
const float DWARVEN_DEFENDER_COEFFICIENT = 1.3;
const float HARPER_COEFFICIENT          = 2.0;
const float MONK_COEFFICIENT            = 1.2;
const float PALADIN_COEFFICIENT          = 0.8;
const float PALE_MASTER_COEFFICIENT      = 0.8;
const float RANGER_COEFFICIENT          = 1.5;
const float ROGUE_COEFFICIENT            = 1.4;
const float SHADOWDANCER_COEFFICIENT    = 1.2;
const float SHIFTER_COEFFICIENT          = 1.3;
const float SORCERER_COEFFICIENT        = 0.4;
const float WEAPON_MASTER_COEFFICIENT    = 0.9;
const float WIZARD_COEFFICIENT          = 0.5;

//Subrace coefficients
const int AIR_GENASI_COEFFICIENT          = 1;
const int EARTH_GENASI_COEFFICIENT        = 1;
const int WATER_GENASI_COEFFICIENT        = 1;
const int FIRE_GENASI_COEFFICIENT          = 1;
const int CELESTIAL_COEFFICIENT            = 8;
const int FIENDISH_COEFFICIENT            = 8;
const int HALF_CELESTIAL_COEFFICIENT      = 7;
const int HALF_FIEND_COEFFICIENT          = 7;
const int HALF_DRAGON_COEFFICIENT          = 8;
const int AASIMAR_COEFFICIENT              = 1;
const int TIEFLING_COEFFICIENT            = 1;
const int GHOSTWISE_HALFLING_COEFFICIENT  = 1;
const int LIGHTFOOT_HALFLING_COEFFICIENT  = 1;
const int STRONGHEART_HALFLING_COEFFICIENT = 1;
const int GOLD_DWARF_COEFFICIENT          = 1;
const int SHIELD_DWARF_COEFFICIENT        = 1;
const int DUERGAR_COEFFICIENT              = 2;
const int DROW_COEFFICIENT                = 2;
const int WILD_ELF_COEFFICIENT            = 1;
const int MOON_ELF_COEFFICIENT            = 1;
const int SUN_ELF_COEFFICIENT              = 1;
const int WOOD_ELF_COEFFICIENT            = 1;
const int ROCK_GNOME_COEFFICIENT          = 1;
const int SVIRFNEBLIN_COEFFICIENT          = 3;

//Calculate XP bonus.
int BonusCalculation(object oPC, object oCreature=OBJECT_SELF);

//Return class coefficient for calculate XP.
float ClassCoefficient(object oPC);

//Return oPC level with subrace coefficient for calculate XP.
int LevelWithSubrace(object oPC);

//Calculate XP bonus if killer is trap.
int TrapBonusCalkulation(object oPC, object oCreature=OBJECT_SELF);

float ClassCoefficient(object oPC)
{
    int nClass, nPClass, nPLC = 0 ,nLC = 0, n;

    float fCoeff = 0.0;

    for(n = 1; n <= 3; n++)
    {
        nClass = GetClassByPosition(n, oPC);
        nLC = GetLevelByClass(nClass, oPC);
        if(nLC > nPLC) { nPClass = nClass; nPLC = nLC; }

        if(nPClass == CLASS_TYPE_BARBARIAN)        fCoeff = BARBARIAN_COEFFICIENT;
        if(nPClass == CLASS_TYPE_BARD)            fCoeff = BARD_COEFFICIENT;
        if(nPClass == CLASS_TYPE_CLERIC)          fCoeff = CLERIC_COEFFICIENT;
        if(nPClass == CLASS_TYPE_DRUID)            fCoeff = DRUID_COEFFICIENT;
        if(nPClass == CLASS_TYPE_FIGHTER)          fCoeff = FIGHTER_COEFFICIENT;
        if(nPClass == CLASS_TYPE_MONK)            fCoeff = MONK_COEFFICIENT;
        if(nPClass == CLASS_TYPE_PALADIN)          fCoeff = PALADIN_COEFFICIENT;
        if(nPClass == CLASS_TYPE_RANGER)          fCoeff = RANGER_COEFFICIENT;
        if(nPClass == CLASS_TYPE_ROGUE)            fCoeff = ROGUE_COEFFICIENT;
        if(nPClass == CLASS_TYPE_SORCERER)        fCoeff = SORCERER_COEFFICIENT;
        if(nPClass == CLASS_TYPE_WIZARD)          fCoeff = WIZARD_COEFFICIENT;
        if(nPClass == CLASS_TYPE_ARCANE_ARCHER)    fCoeff = ARCANE_ARCHER_COEFFICIENT;
        if(nPClass == CLASS_TYPE_ASSASSIN)        fCoeff = ASSASSIN_COEFFICIENT;
        if(nPClass == CLASS_TYPE_BLACKGUARD)      fCoeff = BLACKGUARD_COEFFICIENT;
        if(nPClass == CLASS_TYPE_DIVINE_CHAMPION)  fCoeff = DIVINE_CHAMPION_COEFFICIENT;
        if(nPClass == CLASS_TYPE_DRAGON_DISCIPLE)  fCoeff = DRAGON_DISCIPLE_COEFFICIENT;
        if(nPClass == CLASS_TYPE_DWARVEN_DEFENDER) fCoeff = DWARVEN_DEFENDER_COEFFICIENT;
        if(nPClass == CLASS_TYPE_HARPER)          fCoeff = HARPER_COEFFICIENT;
        if(nPClass == CLASS_TYPE_PALE_MASTER)      fCoeff = PALE_MASTER_COEFFICIENT;
        if(nPClass == CLASS_TYPE_SHADOWDANCER)    fCoeff = SHADOWDANCER_COEFFICIENT;
        if(nPClass == CLASS_TYPE_SHIFTER)          fCoeff = SHIFTER_COEFFICIENT;
        if(nPClass == CLASS_TYPE_WEAPON_MASTER)    fCoeff = WEAPON_MASTER_COEFFICIENT;
    }

    //SendMessageToPC(oPC, "Class coefficient: " + FloatToString(fCoeff));
    return fCoeff;
}

int LevelWithSubrace(object oPC)
{
    int nPCRace = GetRacialType(oPC);
    int nLvl = GetHitDice(oPC);

    string sPCSubrace = GetStringUpperCase(GetSubRace(oPC));

    if(sPCSubrace == "") return nLvl;

    switch(nPCRace)
    {  /*
        case RACIAL_TYPE_ALL:
            if(TestStringAgainstPattern("**AIR**", sPCSubrace))            nLvl = nLvl + AIR_GENASI_COEFFICIENT;
            if(TestStringAgainstPattern("**EARTH**", sPCSubrace))          nLvl = nLvl + EARTH_GENASI_COEFFICIENT;
            if(TestStringAgainstPattern("**WATER**", sPCSubrace))          nLvl = nLvl + WATER_GENASI_COEFFICIENT;
            if(TestStringAgainstPattern("**FIRE**", sPCSubrace))          nLvl = nLvl + FIRE_GENASI_COEFFICIENT;
            if(TestStringAgainstPattern("**CELESTIAL**", sPCSubrace))      nLvl = nLvl + CELESTIAL_COEFFICIENT;
            if(TestStringAgainstPattern("**FIENDISH**", sPCSubrace))      nLvl = nLvl + FIENDISH_COEFFICIENT;
            if(TestStringAgainstPattern("**HALF-CELESTIAL**", sPCSubrace)) nLvl = nLvl + HALF_CELESTIAL_COEFFICIENT;
            if(TestStringAgainstPattern("**HALF-FIEND**", sPCSubrace)||
              TestStringAgainstPattern("**FIEND**", sPCSubrace))          nLvl = nLvl + HALF_FIEND_COEFFICIENT;
            if(TestStringAgainstPattern("**HALF-DRAGON**", sPCSubrace)||
              TestStringAgainstPattern("**DRAGON**", sPCSubrace))        nLvl = nLvl + HALF_DRAGON_COEFFICIENT;
            break;*/

        case RACIAL_TYPE_HUMAN:
            if(TestStringAgainstPattern("**AASIMAR**", sPCSubrace))        nLvl = nLvl + AASIMAR_COEFFICIENT;
            if(TestStringAgainstPattern("**TIEFLING**", sPCSubrace))      nLvl = nLvl + TIEFLING_COEFFICIENT;
            break;
        case RACIAL_TYPE_HALFORC:
            break;
        case RACIAL_TYPE_HALFELF:
            break;
        case RACIAL_TYPE_HALFLING:
            if(TestStringAgainstPattern("**GHOSTWISE**", sPCSubrace))      nLvl = nLvl + GHOSTWISE_HALFLING_COEFFICIENT;
            if(TestStringAgainstPattern("**LIGHTFOOT**", sPCSubrace))      nLvl = nLvl + LIGHTFOOT_HALFLING_COEFFICIENT;
            if(TestStringAgainstPattern("**STRONGHEART**", sPCSubrace))    nLvl = nLvl + STRONGHEART_HALFLING_COEFFICIENT;
            break;
        case RACIAL_TYPE_DWARF:
            if(TestStringAgainstPattern("**GOLD**", sPCSubrace))          nLvl = nLvl + GOLD_DWARF_COEFFICIENT;
            if(TestStringAgainstPattern("**SHIELD**", sPCSubrace))        nLvl = nLvl + SHIELD_DWARF_COEFFICIENT;
            if(TestStringAgainstPattern("**GRAY**", sPCSubrace) ||
              TestStringAgainstPattern("**DUERGAR**", sPCSubrace))        nLvl = nLvl + DUERGAR_COEFFICIENT;
            break;
        case RACIAL_TYPE_ELF:
            if(TestStringAgainstPattern("**DROW**", sPCSubrace) ||
              TestStringAgainstPattern("**DARK**", sPCSubrace))          nLvl = nLvl + DROW_COEFFICIENT;
            if(TestStringAgainstPattern("**WILD**", sPCSubrace))          nLvl = nLvl + WILD_ELF_COEFFICIENT;
            if(TestStringAgainstPattern("**MOON**", sPCSubrace))          nLvl = nLvl + MOON_ELF_COEFFICIENT;
            if(TestStringAgainstPattern("**SUN**", sPCSubrace))            nLvl = nLvl + SUN_ELF_COEFFICIENT;
            if(TestStringAgainstPattern("**WOOD**", sPCSubrace))          nLvl = nLvl + WOOD_ELF_COEFFICIENT;
            break;
        case RACIAL_TYPE_GNOME:
            if(TestStringAgainstPattern("**ROCK**", sPCSubrace))          nLvl = nLvl + ROCK_GNOME_COEFFICIENT;
            if(TestStringAgainstPattern("**DEEP**", sPCSubrace) ||
              TestStringAgainstPattern("**SVIRFNEBLIN**", sPCSubrace))    nLvl = nLvl + SVIRFNEBLIN_COEFFICIENT;
            break;
    }
    //SendMessageToPC(oPC, "Subrace coefficient: " + IntToString(nLvl));
    return nLvl;
}

int BonusCalculation(object oPC, object oCreature=OBJECT_SELF)
{
    object oPartyMember = GetFirstFactionMember(oPC, FALSE);
    object oPCArea, oCArea = GetArea(oCreature);

    int nLvl, nDiff, nMaxLvl = 0, nPartyXP;
    int i = 0, j = 0, k, l = 0;
    int nLvlCreature = GetHitDice(oCreature);

    float fCRCreature = GetChallengeRating(oCreature);
    float fDiff = (IntToFloat(nLvlCreature) + fCRCreature) * 0.5;
    float fPartyXP, fXPMod = 7.0f;

    while(GetIsObjectValid(oPartyMember))
    {
        nLvl = LevelWithSubrace(oPartyMember);

        if(!GetIsPC(oPartyMember) && !GetIsDM(oPartyMember)) nLvl = GetHitDice(oPartyMember);

        oPCArea = GetArea(oPartyMember);
        if(oCArea == oPCArea && GetDistanceBetween(oPartyMember, oCreature) <= 35.0f &&
          !GetIsDM(oPartyMember) && GetCurrentHitPoints(oPartyMember) > 0)
        {
            if(GetIsPC(oPartyMember)) l++;
            if(nLvl > nMaxLvl && GetIsPC(oPartyMember)) nMaxLvl = nLvl;
        }
        oPartyMember = GetNextFactionMember(oPC, FALSE);
    }

    fDiff = fDiff - IntToFloat(nMaxLvl);

    nDiff = FloatToInt(fDiff);
    if (fDiff - IntToFloat(nDiff) >= 0.5) nDiff = nDiff + 1;
    if (nDiff > 12) nDiff = 12;
    if (nDiff < -6) nDiff = -6;

    for (k = -6; k <= nDiff; k++)
    {
        j++;
        fPartyXP = fPartyXP + fXPMod * IntToFloat(j);
    }

    if(l > 1) fPartyXP = fPartyXP * (1.2 * IntToFloat(l));

    //SendMessageToPC(oPC, "Base bonus XP: " + IntToString(FloatToInt(fPartyXP)));

    return FloatToInt(fPartyXP);
}

int TrapBonusCalkulation(object oPC, object oCreature=OBJECT_SELF)
{
    int nLvl = LevelWithSubrace(oPC), nDiff, k, j;
    int nLvlCreature = GetHitDice(oCreature);

    float fCRCreature = GetChallengeRating(oCreature);
    float fDiff = (IntToFloat(nLvlCreature) + fCRCreature) * 0.5;
    float fXPMod = 7.0f, fXP;

    fDiff = fDiff - IntToFloat(nLvl);

    nDiff = FloatToInt(fDiff);
    if (fDiff - IntToFloat(nDiff) >= 0.5) nDiff = nDiff + 1;
    if (nDiff > 12) nDiff = 12;
    if (nDiff < -6) nDiff = -6;

    for (k = -6; k <= nDiff; k++)
    {
        j++;
        fXP = fXP + fXPMod * IntToFloat(j);
    }

    //SendMessageToPC(oPC, "Base bonus XP: " + IntToString(FloatToInt(fPartyXP)));

    return FloatToInt(fXP);
}

//void main(){}


И основной скрипт, который раздает экспу:

nd_applyxp
Neverwinter Script Source
///////////////////////////////////////////////
//*******************************************//
//***********Created by Buldog***************//
//*******************************************//
//*******************************************//
//**********Modified 20.04.2005**************//
//*******************************************//
///////////////////////////////////////////////

#include "inc_xpsystem_nd"
#include "nd_textcolor_inc"

int GetXPByLevel(int nLevel)
{
    return (((nLevel - 1) * nLevel) / 2) * 1000;
}

object CheckKiller(object oKiller)
{
    //SendMessageToPC(oKiller, "Checking Monster Killer...");
    if (!GetIsPC(oKiller))
    {
        if (GetObjectType(oKiller) == OBJECT_TYPE_CREATURE) oKiller = GetMaster(oKiller);
        else
        {
            oKiller = GetTrapCreator(oKiller);
            SetLocalInt(oKiller, "TrapKiller", 1);
            //SendMessageToPC(oKiller, "Finded Trap Master!");
        }
    }
    if (GetIsPC(oKiller) && !GetIsDM(oKiller)) return oKiller;
    return OBJECT_INVALID;
}

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

    oPC = CheckKiller(oPC);

    if(oPC == OBJECT_INVALID) return;

    if(GetIsDM(oPC)) return;

    object oCreature = OBJECT_SELF;
    object oParty, oPArea, oCArea = GetArea(oCreature);

    int i = 0, nPC = 0, nXP, nNewXP, nLevel, nPLevel = 0, nPCPLvl = 0, nAPLvl = 0;
    int nDelta;
    int nBonusXP = BonusCalculation(oPC, oCreature);
    int nMinXP = 10, nMaxXP = 1000;

    float fClassCoeff, fNewXP;

    if(GetLocalInt(oPC, "TrapKiller") == 1)
    {
        nBonusXP = TrapBonusCalkulation(oPC, oCreature);
        nNewXP = nBonusXP;

        if(nNewXP < nMinXP) nNewXP = nMinXP;
        if(nNewXP > nMaxXP) nNewXP = nMaxXP;

        //SendMessageToPC(oPC, "XP before apply class coefficient: " + IntToString(nNewXP));

        fClassCoeff = ClassCoefficient(oParty);
        fNewXP = IntToFloat(nNewXP) * fClassCoeff;

        if(GetXP(oPC) - GetXPByLevel(GetHitDice(oPC) + 1) > 0 && GetHitDice(oPC) < 40)
        {
            fNewXP = 0.0;
            SendMessageToPC(oParty, "You must to level up before getting new expierence points.");
        }

        //SendMessageToPC(oPC, "You getting XP: " + FloatToString(fNewXP));
        GiveXPToCreature(oPC, FloatToInt(fNewXP));
        SendMessageToPC(oPC, C_LBLUE2 +  GetName(oPC) + C_END + C_ORANGE + " óáèë " + GetName(oCreature) + C_END);
        DeleteLocalInt(oPC, "TrapKiller");
        return;
    }

    oParty = GetFirstFactionMember(oPC, FALSE);
    while(GetIsObjectValid(oParty))
    {
        nLevel = LevelWithSubrace(oParty);

        if(!GetIsPC(oParty) && !GetIsDM(oParty)) nLevel = GetHitDice(oParty);

        //SendMessageToPC(oParty, "Your level with subrace: " + IntToString(nLevel));

        oPArea = GetArea(oParty);

        if(oCArea == oPArea && GetDistanceBetween(oParty, oCreature) <= 35.0f &&
          !GetIsDM(oParty) && GetCurrentHitPoints(oParty) > 0)
        {
            i++;
            if(GetIsPC(oParty) && !GetIsDM(oParty))
            {
                nPCPLvl = nPCPLvl + nLevel;
                nPC++;
            }
            nPLevel = nPLevel + nLevel;
            //SendMessageToPC(oParty, "Party level with your: " + IntToString(nPLevel) +
            //                        ", i: " + IntToString(i));
        }
        oParty = GetNextFactionMember(oPC, FALSE);
    }

    nAPLvl = nPCPLvl/nPC;

    oParty = GetFirstFactionMember(oPC, FALSE);
    while(GetIsObjectValid(oParty))
    {
        nLevel = LevelWithSubrace(oParty);
        oPArea = GetArea(oParty);

        if(oPArea == oCArea && GetDistanceBetween(oParty, oCreature) <= 35.0f &&
          GetIsPC(oParty) && !GetIsDM(oParty) && GetCurrentHitPoints(oParty) > 0)
        {
            nXP = GetXP(oParty);

            if(i > 1)
            {
                nNewXP = nBonusXP / nPLevel * nLevel;
            }
            else { nNewXP = nBonusXP; }

            if(nNewXP < nMinXP) nNewXP = nMinXP;
            if(nNewXP > nMaxXP) nNewXP = nMaxXP;

            //SendMessageToPC(oPC, "XP before apply class coefficient: " + IntToString(nNewXP));

            fClassCoeff = ClassCoefficient(oParty);
            fNewXP = IntToFloat(nNewXP) * fClassCoeff;

            if(GetXP(oParty) - GetXPByLevel(GetHitDice(oParty) + 1) > 0 && GetHitDice(oParty) < 40)
            {
                fNewXP = 0.0;
                SendMessageToPC(oParty, "You must to level up before getting new expierence points.");
            }

            //SendMessageToPC(oPC, "You getting XP: " + FloatToString(fNewXP));

            if(nAPLvl > nLevel) nDelta = (nAPLvl - nLevel)/2;
            else nDelta = (nLevel - nAPLvl)/2;

            if(nDelta < 1) nDelta = 1;

            nNewXP = FloatToInt(fNewXP)/nDelta;

            if(nNewXP < nMinXP) nNewXP = nMinXP;
            if(nNewXP > nMaxXP) nNewXP = nMaxXP;

            GiveXPToCreature(oParty, nNewXP);
        }
        oParty = GetNextFactionMember(oPC, FALSE);
    }
}


В скрипт nw_c2_default7, или как там его, помещаешь строчку:
ExecuteScript("nd_applyxp", OBJECT_SELF);
А еще, маленький инклюдик для расскраски сообщений, идея _каа_, но сам инклюдик писал я сам :)

nd_textcolor_inc
Neverwinter Script Source
///////////////////////////////////////////////
//*******************************************//
//***********Created by Buldog***************//
//*******************************************//
///////////////////////////////////////////////

const string C_WHITE  = "<cþþþ>";
const string C_YELLOW = "<cþþ >";
const string C_RED    = "<cþ  >";
const string C_BLUE1  = "<c  þ>";
const string C_BLUE2  = "<c zþ>";
const string C_LBLUE1 = "<c þþ>";
const string C_LBLUE2 = "<czþþ>";
const string C_GREEN  = "<c þ >";
const string C_LILAC1 = "<cþ þ>";
const string C_LILAC2 = "<czzþ>";
const string C_ORANGE = "<cþz >";
const string C_VIOLET = "<cz þ>";
const string C_END    = "</c>";

//void main(){}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Лито
сообщение Apr 20 2005, 19:57
Сообщение #1052


Level 9
***

Класс: Страж Тьмы
Характер: Chaotic Evil
Раса: Нежить



Buldog, ты даже не представляешь, как ты мне помог :yahoo:

И спасибки за оперативность :good:
Добавлено в [mergetime]1114017506[/mergetime]
Ну конечно же появилось несколько проблем :this:

1. нужно ли раскомментировать в инклюдах
Neverwinter Script Source
//void main(){}

Если нет, то у меня не получается их скомпилить.
2.В скрипте раздающем экспу, компилятор просит меня "Дублировать выполнение функции(main)"
вобщем тоже не состовляется :(
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Buldog
сообщение Apr 20 2005, 20:44
Сообщение #1053


Level 5
**

Класс: Мастер Оружия
Характер: Chaotic Neutral
Раса: Полуорк



Если надо откомпилить, то раскоментируй, откомпилируй, а потом снова закоментируй, тока не забудь сохранить вариант с закоментированым майном, в инклюдах функции void main() быть не должно, потому они в инклюдах и закоментированы, из за етого и ошибка в основном скрипте.

Сообщение отредактировал Buldog - Apr 20 2005, 20:45
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Лито
сообщение Apr 20 2005, 20:56
Сообщение #1054


Level 9
***

Класс: Страж Тьмы
Характер: Chaotic Evil
Раса: Нежить



Buldog все пасиба, работает :)
Добавлено в [mergetime]1114089959[/mergetime]
Раз уж пошел разговор о системе опыта, может есть у кого нибудь и система лута? :)
Нет нет, я не настолько ленивый, я написал собственную, но к сожелению она очень большая(2000 строк в скрипте, а всего их 3) :this:
Так что,для меня этот вопрос остается открытым :xz:

Сообщение отредактировал Лито - Apr 21 2005, 16:25
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Алексашка
сообщение Apr 22 2005, 20:20
Сообщение #1055


Level 3
*

Класс: Клерик
Характер: True Neutral
Раса: Человек



Сделал себе систему крафта.(Содрал из Левора :D ) 2da таблицу сделал свою, скрипт содрал у Baalа :D Надеюсь божественная аватара не будет сильно гневаться на скромного священника. :yes: У самого ума не хватит такой скрипт написать. Все получилось нормально. Только вместо названий вещей и компонентов пишуться ярлыки. (В леворе кстати такое имело место быть. С вещами имеющими два тега). Подскажите из-за чего такое происходит.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Apr 23 2005, 06:27
Сообщение #1056


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

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



там глянь, в инклюде есть работа с обхектом одним..это вроде поинт. Он у тебя есть в модуле?
(просто имя вещи находится так: она создается в том поинте и берется ее имя, а вещь удаляется. Иначе, если нету вещи или поинта, то берется сам резреф....кажись так)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Алексашка
сообщение Apr 25 2005, 18:51
Сообщение #1057


Level 3
*

Класс: Клерик
Характер: True Neutral
Раса: Человек



QUOTE (Lex @ Apr 23 2005, 06:27)
там глянь, в инклюде есть работа с обхектом одним..это вроде поинт. Он у тебя есть в модуле?
(просто имя вещи находится так: она создается в том поинте и берется ее имя, а вещь удаляется. Иначе, если нету вещи или поинта, то берется сам резреф....кажись так)

:yahoo: Спасибо Lex! Я просто не поставил точку WP, в которой вещи креатятся и дестроятся. Все работает, все ОК! Спасибо за теорию. Мне ее временами катастрофически не хватает. :yes: Я гуманитарий, а не программист. (т.е. программер :yes: )
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Лито
сообщение Apr 25 2005, 20:21
Сообщение #1058


Level 9
***

Класс: Страж Тьмы
Характер: Chaotic Evil
Раса: Нежить



Появилась идея сделать что-то вроде фильтра на нецензурные выражения.
Смысл такой: когда игрок выражается :D то получает штраф и предупреждение автоматически. Должен быть какой-то словарь, куда надо вписать все :bad: .Вот только не знаю с какого конца начать. Надеюсь, что поможете :yes:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Tiger Greyhawk
сообщение Apr 26 2005, 03:54
Сообщение #1059



Иконки Групп

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



to Лито:
swearfilter.2da и namefilter.2da ссылка на описание значений Но это, насколько я понял Leon_PRO, будет работать только в "chatroom" (чат до игры), хотя это надо проверить. На экране у говорящего отображается, а как будет у других :xz: .
Можно сделать путем отслеживания произнесенных слов (как например в "Русская версия KPBS (система банкинга и биржи) ссылка" в переводе Аваддона, см. его подпись), но это, по моему, будет только после произнесения слова. :xz: т.е. можно сделать на автоматический штраф и предупреждение, но не катит как фильтр. Хотя, это все только предположения.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
-fenix-
сообщение Apr 28 2005, 18:42
Сообщение #1060


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

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







Люди как сделать полноценного оруженосца. И можно сделать, чтобы с персом бегало 2 оруженосца, а не один?


И как сделать портал, который в официальной компании и модах. Юзаешь камень призыва и тебя переносит к порталу, заходишь в портал и тебя переносит в последнее место использования камня.

Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

147 страниц V  « < 41 42 43 44 45 > » 
Ответить в эту темуОткрыть новую тему
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 5th May 2025 - 14:42