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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
205 страниц V  « < 62 63 64 65 66 > »   
Ответить в эту темуОткрыть новую тему
> Вопросы новичков, Абсолютные глупости
Aiwan
сообщение Jul 6 2005, 07:03
Сообщение #1561


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

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



Zirrex любая переменная проверенная на ноль выдасть TRUE, это движковое. Так что учи матчасть, прежде чем что-то утверждать.
Добавлено в [mergetime]1120622736[/mergetime]
Что бы проверить истинно существующую локалку. То просто проверяется на TRUE. Если она существует, то будет результат. И не важно, 1 или 20 она ровна.
Добавлено в [mergetime]1120623210[/mergetime]
Расскажи лучше чем занят? ;)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 6 2005, 21:08
Сообщение #1562


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

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



Aiwan, да, что-то немного ступил, и правда, изначально она равна 0, далее ее просто можно таким образом удалить, и меньше скриптов.

з.ы. На данный момент занимаюсь проектом Амен. Не знаю, слышал ли про такой онлайновый шард или нет. Существует уже 2,5 года.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
GoingPro)
сообщение Jul 6 2005, 21:25
Сообщение #1563


Level 3
*

Класс: Ниндзя
Характер: Chaotic Evil
Раса: Человек



Помогите а что тут за ошибка ? плиз
CODE
void main()
{

object GetPlayerSpirit(object oPlayer);

object GetPlayerSpirit(object oPlayer)
{
object oItem = GetFirstItemInInventory(oPlayer);

if (GetResRef(oItem) == "spirit")
 return oItem;

while(oItem != OBJECT_INVALID)
 {
 oItem = GetNextItemInInventory(oPlayer);

 if (GetResRef(oItem) == "spirit")
   return oItem;
 }
return OBJECT_INVALID;
}
}


кричит на object GetPlayerSpirit(object oPlayer); первый который :)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
dumbo
сообщение Jul 6 2005, 23:09
Сообщение #1564


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

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



GoingPro)
синтаксис NWN-script заимствован из C, а в нем, в отличие от Pascal'я, не допускаются вложенные описания процедур. да и вообще, каша какая-то...
Neverwinter Script Source
// опережающее объявление функции - применяется в случае,
// когда вызов функции идет в скрипте выше, чем ее описание (она сама)
object GetPlayerSpirit(object oPlayer);
// также применяется для удобства - если в начале скрипта
// сделать опережающие объявления всех содержащихся в скрипте функций,
// то можно не заботиться об порядке их описания.
// в данном случае оно не нужно - достаточно перенести описание функции
// в начало скрипта - до main()...

void main()
{
  object oPC = GetLastUsedBy(); // например
  object oSpirit = GetPlayerSpirit(oPC);
  // ...
}

// сама функция
object GetPlayerSpirit(object oPlayer)
{
  object oItem = GetFirstItemInInventory(oPlayer);
  while(GetIsObjectValid(oItem))
  {
    if (GetResRef(oItem) == "spirit")
      return oItem;
    oItem = GetNextItemInInventory(oPlayer);
  }
  return OBJECT_INVALID;
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 6 2005, 23:42
Сообщение #1565


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

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



GoingPro), как я понял, ты решил сделать сохранение персонажей на локации после рестарта? Не делай так, как описано это в базе скриптов, т.е. не кидай скрипт сохранения локации персонажа на каждую локацию в эвент "OnEnter". Лучше повесь его на скрипт "default". Скрипт срабатывает каждый раунд, и постоянно перезаписывает координаты персонажа, в отличие от того, что установлен на "OnEnter". Какого-либо падения скорости это не вызовет. Единственное но, при входе на шард, скрипт чтения переменных и координат надо разместить на скрипт "OnClientEnter", и запретить работу скрипта "default" в стартовой локации, иначе сохранит координаты.

Да, и чтобы не было подобных казусов, который произошел у тебя, знакомься с чужими скриптами, смотри как они написаны и что следует писать в разных случаях. Потом научишься быстро делать свои скрипты. И не лишним будем знакомство с основами С++. Только, главное, не копировать чужие ошибки :)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jul 7 2005, 00:21
Сообщение #1566


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

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



QUOTE (Zirrex @ Jul 7 2005, 00:08)
Aiwan, да, что-то немного ступил, и правда, изначально она равна 0, далее ее просто можно таким образом удалить, и меньше скриптов.

Да, забудь :friend: Я там сам стальными яйцами погремел :D
QUOTE (Zirrex @ Jul 7 2005, 00:08)
На данный момент занимаюсь проектом Амен. Не знаю, слышал ли про такой онлайновый шард или нет. Существует уже 2,5 года.

Слышал конечно. Ну, вливайся к нам на форум! ;)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Batkom
сообщение Jul 7 2005, 01:46
Сообщение #1567


Level 4
**

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



Я столкнулся с проблемой баланса.
Дело в том, что сорки и визарды в раскачанов состоянии являются грубо говоря читерскими классами ибо файтер против мага в пвп мало что может сделать(сжимающая бигби + исаак, если у файтера нет мегашмоток он труп).
Я уже и трусинг убрал и на исааки проверку на спасброски по реакции повесил и бигби по времениурезал, все равно сорки сильнее и даже самых крутых мобов не обладающих спелл имуном кладут только в путь, а обкаст делает ихнеуязвимыми в ближних атаках.
И тут родилась идея, а что если сорки и визарды будут получать 25% от опыта назначеного в настройках модуля, я слышал где-то это уже было реализовано, вот толлько как?
Если придется редактировать 2da дайте пожалуйста ссылочку на то, как это делать.




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

Как это лучше сделать?
вот скрипт
Neverwinter Script Source
#include "nw_i0_generic"
#include "x2_inc_restsys"
#include "x2_inc_switches"
#include "nw_i0_plot"


void main()
{
    object oBedroll;
    object oPC = GetLastPCRested();

    if (!HasItem(oPC, "food"))
              {
            AssignCommand(oPC, ClearAllActions());
            SendMessageToPC(oPC, "Вы не можете отдыхать на пустой желудок.");
                    }
                    else if (!HasItem(oPC, "bedrollitem"))
                    {
                    SendMessageToPC(oPC, "Вы не можете отдыхать без спальника.");
                    AssignCommand(oPC, ClearAllActions());
                    }
                    else
                    {
                object food =  GetItemPossessedBy(oPC ,"food");
                DestroyObject(food);
                object ibedroll =  GetItemPossessedBy(oPC ,"bedrollitem");
                DestroyObject(ibedroll);
                object item = GetItemPossessedBy(oPC, "deathtocken");//это токен означающий смерть игрока, в последствии я вставил изьятие итема при рессуректе и райздеде, но если лечить дмской силой, она спеллом не считается, потому надо отдохнуть, чтобы при перезаходе не умереть, позже я научился работать с базами данных, но проверку смерти по предмету все же решил оставить
                DestroyObject(item);
                oBedroll =  CreateObject(OBJECT_TYPE_PLACEABLE, "blueprint005", GetLocation(oPC));

    if (GetModuleSwitchValue(MODULE_SWITCH_USE_XP2_RESTSYSTEM) == TRUE)
    {

        /*  Georg, August 11, 2003
            Added this code to allow the designer to specify a variable on the module
            Instead of using a OnAreaEnter script. Nice new toolset feature!
            Basically, the first time a player rests, the area is scanned for the
            encounter table string and will set it up.
        */

        object oArea = GetArea (oPC);

        string sTable = GetLocalString(oArea,"X2_WM_ENCOUNTERTABLE") ;
        if (sTable != "" )
        {
            int nDoors = GetLocalInt(oArea,"X2_WM_AREA_USEDOORS");
            int nDC = GetLocalInt(oArea,"X2_WM_AREA_LISTENCHECK");
            WMSetAreaTable(oArea,sTable,nDoors,nDC);

            //remove string to indicate we are set up
            DeleteLocalString(oArea,"X2_WM_ENCOUNTERTABLE");
        }


        /* Brent, July 2 2003
          - If you rest and are a low level character at the beginning of the module.
            You will trigger the first dream cutscene
        */

        if (GetLocalInt(GetModule(), "X2_G_LOWLEVELSTART") == 10)
        {
            AssignCommand(oPC, ClearAllActions());
            if (GetHitDice(oPC) >= 12)
            {
                ExecuteScript("bk_sleep", oPC);


                return;
            }
            else
            {
                FloatingTextStrRefOnCreature(84141 , oPC);
                return;
            }
        }

        if (GetLastRestEventType()==REST_EVENTTYPE_REST_STARTED)
        {

            if (!WMStartPlayerRest(oPC))
            {
                // The resting system has objections against resting here and now
                // Probably because there is an ambush already in progress
                FloatingTextStrRefOnCreature(84142  ,oPC);
                AssignCommand(oPC,ClearAllActions());
            }
            if (WMCheckForWanderingMonster(oPC))
            {
                //This script MUST be run or the player won't be able to rest again ...
                ExecuteScript("x2_restsys_ambus",oPC);

            }
        }
        else if (GetLastRestEventType()==REST_EVENTTYPE_REST_CANCELLED)
        {

        // No longer used but left in for the community
        // WMFinishPlayerRest(oPC,TRUE); // removes sleep effect, etc
        }
        else if (GetLastRestEventType()==REST_EVENTTYPE_REST_FINISHED)
        {


        // No longer used but left in for the community
        //  WMFinishPlayerRest(oPC); // removes sleep effect, etc
        }
    }

}
}


Честно говоря я не понял назначения большинства функций, потому решил просто доплнить.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
dumbo
сообщение Jul 7 2005, 03:53
Сообщение #1568


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

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



Batkom
1. не видел пока шардов с оставленной по умолчанию системой выдачи опыта. везде применяется самостоятельная система выдачи опыта - при смерти кричи оценивается уровень оной, уровень игрока, количество народа в партии(соотношение уровней игроков в партии), количество нанесенного урона итд итп, и на основе всего этого игроку выдается опыт. ноги растут из nw_c2_default7(смерть кричи), nw_c2_default6(урон).
2. скрипт отдыха вызывается не только в начале оного - в начале, в конце, при отмене, и при неудачной попытке отдохнуть. какое именно событие произошло определяется функцией GetLastRestEventType(). эффект сна, накладываемый на начинающего отдыхать, отменяет отдых. дефолтную систему отдыха можно смело выкидывать, все равно ты ее не используешь. заготовка скрипта:
Neverwinter Script Source
void restDone(object oPC)
{
  effect eEffect = GetFirstEffect(oPC);
  while(GetIsEffectValid(eEffect))
  {
    int nType = GetEffectType(eEffect);
    if(nType == EFFECT_TYPE_BLINDNESS)
      RemoveEffect(oPC, eEffect);
    eEffect = GetNextEffect(GetFirstPC());
  }
}

void restStart(object oPC)
{
  effect eBlind =  EffectBlindness();
  effect eVis = EffectVisualEffect(VFX_IMP_SLEEP);
  // проверки еды, воды, спальника, плюшевого мишки итд.
  if (!GetIsObjectValid(GetItemPossessedBy(oPC, "bedrollitem")))
  {
    SendMessageToPC(oPC, "без подстилки не уснешь...");
    AssignCommand(oPC, ClearAllActions());
    return;
  }
  ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oPC, 5.0);
  ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBlind, oPC, 60.0);
}

void main()
{
    object oPC = GetLastPCRested();
    int iRestEvent = GetLastRestEventType();
    switch (iRestEvent)
    {
      case REST_EVENTTYPE_REST_STARTED:
        restStart(oPC);
        break;
      case REST_EVENTTYPE_REST_CANCELLED:
        restDone(oPC);
        break;
      case REST_EVENTTYPE_REST_FINISHED:
        restDone(oPC);
        break;
      case REST_EVENTTYPE_REST_INVALID:
        //SendMessageToPC(oPC, "rest failed");
        break;
    }
}

Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
GoingPro)
сообщение Jul 7 2005, 17:41
Сообщение #1569


Level 3
*

Класс: Ниндзя
Характер: Chaotic Evil
Раса: Человек



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

И ещо есть игроку присваивать SetLocalInt(oPc, "INT", 1); то после рестарта сервера оно сохраняеться?
Если нет то как одевать на персонажа шкуру, просто туда можно было бы поприсваивать че то :)?


Молю о помощи, брожу в неведании и это мешает в работе :) Помогите пожалуйсто.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 7 2005, 19:24
Сообщение #1570


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

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



GoingPro), искать какие-либо хак-паки стоит тут Neverwinter Vault. Также там много чего полезного для начинающего разработчика.

Нет, не сохранится. Все переменные хранятся на персонаже до рестарта. Рестарт же их затирает. Есть хорошие функции, которые пишут переменные в базу. Например, так:

Neverwinter Script Source
string sID = GetName(oPC) + GetPCPublicCDKey(oPC);
int iVariable = GetCampaignInt("player", "Variable" + sID) + 1;
SetLocalInt(oPC, "INT", iVariable);
SetCampaignInt("player", "Variable", iVariable);

а потом считываешь при входе:
Neverwinter Script Source
string sID = GetName(oPC) + GetPCPublicCDKey(oPC);
int iVariable = GetCampaignInt("player", "Variable" + sID);
SetLocalInt(oPC, "INT", iVariable);

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

Извиняюсь, если ошибся, мало работал с ними.

Одеть предмет на персонажа легко. Во-первых, нужен сам предмет, его тэг, а во-вторых, если это сервер, то в настройках его должна быть выключена опция "Item Level Restrictions", иначе вещь не по уровню просто не наденется на персонажа, а будет валяться в рюкзаке. Далее делаем так:
Neverwinter Script Source
object oChest = CreateItemOnObject("am_it_cchest",oPC);

if (GetItemPossessedBy(oPC,"am_it_cchest") != OBJECT_INVALID)
{
    AssignCommand(oPC, ActionEquipItem(oChest, INVENTORY_SLOT_CARMOUR));
}


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


Level 4
**

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



вот еще вопрос, делая алхимию, как один из эффектов при неудачном смешении ингридиентов игрок превращался в корову или пингвина. Дело в том, что после установки полиморфа игрок может его отменить нажав "отменить полиморф" как лишить игрока этой возможности?
я пробовал накладывать паралич, но игрок просто преврашается обратно и стоит в параличе может можно убрать как нибудь эту кнопку, или лишить игрока всех действий
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 7 2005, 19:59
Сообщение #1572


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

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



Batkom, хехе, да все просто, ты не делай полиморфа, а просто изменяй облик. Смотри:

Neverwinter Script Source
void Penguin(object oTarget, object oUser)
{
    effect eParalyze = EffectCutsceneImmobilize();

    AssignCommand(oTarget, SetCreatureAppearanceType(oTarget,APPEARANCE_TYPE_PENGUIN));
    AssignCommand(oTarget, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eParalyze, oTarget));
    SetLocalInt(oTarget, "toaded", 1);
}

void RemovePenguin(object oTarget, object oUser)
{
    if (GetLocalInt(oTarget, "toaded") == 1)
    {
        effect eMyEffect = GetFirstEffect(oTarget);

        while (GetIsEffectValid(eMyEffect))
        {
            if (GetEffectType(eMyEffect) == EFFECT_TYPE_CUTSCENEIMMOBILIZE)
            {
                RemoveEffect(oTarget, eMyEffect);
                SetLocalInt(oTarget, "toaded", 0);
            }
            eMyEffect = GetNextEffect(oTarget);
        }

        if (GetRacialType(oTarget) == RACIAL_TYPE_ELF)
        {
            AssignCommand(oTarget, SetCreatureAppearanceType(oTarget,APPEARANCE_TYPE_ELF));
        }
        else if (GetRacialType(oTarget) == RACIAL_TYPE_GNOME)
        {
            AssignCommand(oTarget, SetCreatureAppearanceType(oTarget,APPEARANCE_TYPE_GNOME));
        }
        else if (GetRacialType(oTarget) == RACIAL_TYPE_DWARF)
        {
            AssignCommand(oTarget, SetCreatureAppearanceType(oTarget,APPEARANCE_TYPE_DWARF));
        }
        else if (GetRacialType(oTarget) == RACIAL_TYPE_HALFLING)
        {
            AssignCommand(oTarget, SetCreatureAppearanceType(oTarget,APPEARANCE_TYPE_HALFLING));
        }
        else if (GetRacialType(oTarget) == RACIAL_TYPE_HUMAN)
        {
            AssignCommand(oTarget, SetCreatureAppearanceType(oTarget,APPEARANCE_TYPE_HUMAN));
        }
        else if (GetRacialType(oTarget) == RACIAL_TYPE_HALFELF)
        {
            AssignCommand(oTarget, SetCreatureAppearanceType(oTarget,APPEARANCE_TYPE_HALF_ELF));
        }
        else if (GetRacialType(oTarget) == RACIAL_TYPE_HALFORC)
        {
            AssignCommand(oTarget, SetCreatureAppearanceType(oTarget,APPEARANCE_TYPE_HALF_ORC));
        }
    }
}

Переменная не обязательна, но можно и оставить, она у меня служила для выбора условий.

Сообщение отредактировал Zirrex - Jul 7 2005, 20:03
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Batkom
сообщение Jul 7 2005, 21:57
Сообщение #1573


Level 4
**

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



сенк, сейчас опробую





ТHX все работает, чейчас буду разбираться с опытом



М.....э...а можно какой нибудь примерчик?
Я никак не могу найти, в каком именно месте игроку выдается опыт....

Сообщение отредактировал Batkom - Jul 8 2005, 01:59
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
GoingPro)
сообщение Jul 8 2005, 09:26
Сообщение #1574


Level 3
*

Класс: Ниндзя
Характер: Chaotic Evil
Раса: Человек



Batkom На смерть моба форумулу зделай, и все будет путем.

Хотел ещо узнать вот что:
1) На лаги модуля или локации влияет большое количество юзибл объктов?
2) Как получить данные о игроке когда он использует придмет object oPC = ????();

Спасибо.

Со вторым я уже разобрался object oPC = GetLastUsedBy(); должно работать поидеи, но я ещо не проверял...

Сообщение отредактировал GoingPro) - Jul 8 2005, 14:39
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 8 2005, 09:26
Сообщение #1575


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

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



Batkom, выдается он обычно при срабатывании скрипта "nw_c2_default7", но в нем ты ничего не найдешь, потому что за опыт отвечает параметр "Xp Scale" в настройках модуля. Если ты хочешь использовать свою систему распределения опыта, то это значение надо ставить в 0. Правда есть одно но, даже если его убрать в 0, то все равно будет писаться опыт, только всегда будет иметь нулевое значение. Чтобы этого не было, надо в скрипте "nw_c2_default7" прописать следующее:

Neverwinter Script Source
void main()
{
    object oKiller = GetLastKiller();

    if (GetLastKiller() == OBJECT_SELF) return;

// и в самом конце скрипта, можно и перед флагом "NW_FLAG_DEATH_EVENT"
    ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), OBJECT_SELF);
    ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(2000, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY), OBJECT_SELF);

Урон равен 2000, потому что есть монстры, у которых жизни больше 1000, если у тебя нет таких, то ставь максимум, который не превышается.

Дальше внутри скрипта ставишь ссылку на свой скрипт, который распределяет опыт, например так:
Neverwinter Script Source
if (GetStandardFactionReputation(STANDARD_FACTION_HOSTILE, OBJECT_SELF))
{
    ExecuteScript("pwfxp",OBJECT_SELF);
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Batkom
сообщение Jul 8 2005, 16:48
Сообщение #1576


Level 4
**

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



я нашел функцию определения чегото GetChallengeRating
видимо это и есть CR, но что делать с ним?
он float, значит дробь, возможно нужно умножать его на не знаю что и делить на HD игрока или общий HD партии
или нет....
у меня получилась формула fXp = GetChallengeRating(oMonster) * X / GetHitDice(oPC);
откуда взяь множитель Х не знаю, хотя может я вообще все не так делаю...
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
dumbo
сообщение Jul 8 2005, 20:30
Сообщение #1577


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

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



Batkom
одной формулой ты врядли обойдешся. возьми для примера систему из какого-нибудь hcr - сам "рожать" будешь долго... ;) float потому, что на маленьких значениях он бывает нецелый(0.5, 0.75)...

Zirrex
http://nwn.bioware.com/support/patchdetails164.html :
QUOTE
The game no longer displays the "Experience Points Gained:" message when the experience points gained was 0.


по поводу "ошибки алхимика":
Lexicon:
QUOTE
Neverwinter Script Source
effect EffectPolymorph(
    int nPolymorphSelection,
    int nLocked = FALSE
);
Parameters
nPolymorphSelection - POLYMORPH_TYPE_*
nLocked - If TRUE, player can't cancel polymorph (Default: FALSE)


Сообщение отредактировал dumbo - Jul 8 2005, 20:32
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Batkom
сообщение Jul 8 2005, 22:13
Сообщение #1578


Level 4
**

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



ясно сенк, сейчас попробую потырить скрипт с нордока170
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 8 2005, 22:17
Сообщение #1579


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

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



dumbo, не знал, но у меня по старинке установлен этот скрипт. Теперь можно и убрать.

У полиморфов есть один побочный эффект. Если превращаешься в Балора, Голема, Дракона, и т.д., то, у кого в полиморфе становится в 2 раза выше жизни, чем у персонажа, при автосохранении на сервере происходит перенакладка полиморфа. В принципе, это у всех, но с "тяжелыми" полиморфами иная проблема. Т.е., если полиморфа ранили, но жизнь не опустилась ниже критического порога, например, была 500/300, а стала 301/300, то она восстановится. Явный баг, но как его исправить, я не знаю, в момент автосохранения полиморф как бы дергает.

К тому же я так еще сделал, чтобы избавиться от эффекта полиморфа.

Сообщение отредактировал Zirrex - Jul 8 2005, 22:19
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Batkom
сообщение Jul 9 2005, 03:33
Сообщение #1580


Level 4
**

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



ух взял скрипт раздачи опыта с nordockpub170 вроде все правильно, но не работает вообще
посоветуйте какой нибудь простой во внедрении скрипт а я его дополню

вот что у меня получилось
Neverwinter Script Source
float fCR = GetChallengeRating(OBJECT_SELF);
    int nMonsterXP;
    object oMod = GetModule();




    int nPartyMembers;
    int nPartyLevelSum;
    int nHighestLevel=0;
    float fAvgPartyLevel;

    object oKilledArea = GetArea(OBJECT_SELF);
    object oPC = GetFirstFactionMember(oKiller);

    while(GetIsObjectValid(oPC)) {
        if(oKilledArea == GetArea(oPC)) nPartyMembers++;
        if(GetIsDM(oPC)) nPartyMembers--;
        else nPartyLevelSum += GetCharacterLevel(oPC);
        if (GetCharacterLevel(oPC)> nHighestLevel)
            nHighestLevel=GetCharacterLevel(oPC);
        oPC = GetNextFactionMember(oKiller, TRUE);
    }

    if (nPartyMembers == 0)
    return;

    fAvgPartyLevel = IntToFloat(nPartyLevelSum) / IntToFloat(nPartyMembers);


    if (FloatToInt(fAvgPartyLevel) < 3) fAvgPartyLevel = 3.0;
    PrintString ("party level "+FloatToString(fAvgPartyLevel,3,1));

    if ((FloatToInt(fAvgPartyLevel) <= 6) && (fCR < 1.5))
        nMonsterXP = GetLocalInt(oMod,"BASEXP");
    else
    {
        nMonsterXP = GetLocalInt(oMod,"BASEXP") * FloatToInt(fAvgPartyLevel/2);
        int nDiff = FloatToInt(((fCR < 1.0) ? 1.0 : fCR) - fAvgPartyLevel);
        switch (nDiff)
        {
        case -7:
            nMonsterXP /= 12;
            break;

        case -6:
            nMonsterXP /= 8;
            break;
        case -5:
            nMonsterXP = nMonsterXP * 3 / 16;
            break;
        case -4:
            nMonsterXP /= 4;
            break;
        case -3:
            nMonsterXP /= 3;
            break;
        case -2:
            nMonsterXP /= 2;
            break;
        case -1:
            nMonsterXP = nMonsterXP * 2 / 3;
            break;
        case 0:
            break;
        case 1:
            nMonsterXP = nMonsterXP * 3 / 2;
            break;
        case 2:
            nMonsterXP = nMonsterXP * 3 / 2;
            break;
        case 3:
            nMonsterXP = nMonsterXP * 3 / 2;
            break;
        case 4:
            nMonsterXP *= 2;
            break;
        case 5:
            nMonsterXP *= 2;
            break;
        case 6:
            nMonsterXP *= 2;
            break;
        case 7:
            nMonsterXP *= 3;
            break;
        case 8:
            nMonsterXP *= 3;
            break;
        case 9:
            nMonsterXP *= 3;
            break;
        case 10:
            nMonsterXP *= 4;
            break;
        case 11:
            nMonsterXP *= 4;
            break;
        case 12:
            nMonsterXP *= 4;
            break;
        case 13:
            nMonsterXP *= 5;
            break;
        case 14:
            nMonsterXP *= 5;
            break;
        case 15:
            nMonsterXP *= 5;
            break;
        case 16:
            nMonsterXP *= 6;
            break;
        case 17:
            nMonsterXP *= 6;
            break;
        case 18:
            nMonsterXP *= 6;
            break;
        case 19:
            nMonsterXP *= 7;
            break;
        case 20:
            nMonsterXP *= 7;
            break;
        case 21:
            nMonsterXP *= 7;
            break;
        case 22:
            nMonsterXP *= 8;
            break;
        case 23:
            nMonsterXP *= 8;
            break;
        case 24:
            nMonsterXP *= 8;
            break;
        case 25:
            nMonsterXP *= 9;
            break;
        case 26:
            nMonsterXP *= 9;
            break;
        case 27:
            nMonsterXP *= 9;
            break;
        case 28:
            nMonsterXP *= 10;
            break;
        case 29:
            nMonsterXP *= 10;
            break;
        case 30:
            nMonsterXP *= 10;
            break;
        case 31:
            nMonsterXP *= 11;
            break;
        case 32:
            nMonsterXP *= 11;
            break;
        case 33:
            nMonsterXP *= 11;
            break;
        case 34:
            nMonsterXP *= 12;
            break;
        case 35:
            nMonsterXP *= 12;
            break;
        default:
            nMonsterXP = 0;
        }
    }    if (fCR < 0.76 && nMonsterXP)
    {
        if (fCR <= 0.11)
            nMonsterXP = nMonsterXP / 10;
        else if (fCR <= 0.13)
            nMonsterXP = nMonsterXP / 8;
        else if (fCR <= 0.18)
            nMonsterXP = nMonsterXP / 6;
        else if (fCR <= 0.28)
            nMonsterXP = nMonsterXP / 4;
        else if (fCR <= 0.4)
            nMonsterXP = nMonsterXP / 3;
        else if (fCR <= 0.76)
            nMonsterXP = nMonsterXP /2;
       

        if (nMonsterXP == 0) nMonsterXP = 1;
    }


    nMonsterXP += GetLocalInt(oMod,"BONUSXP");
    int nCharXP;
    PrintString("Monster XP = "+IntToString(nMonsterXP));
    if (nPartyMembers < 5)
    {
        nCharXP = FloatToInt((nMonsterXP*(1+(0.3*(nPartyMembers-1))))/nPartyMembers);
    }
    else
    {
        nCharXP = FloatToInt((nMonsterXP*(1+(0.5*(nPartyMembers-1))))/nPartyMembers);
    }








    PrintString("Char XP = "+IntToString(nCharXP));
    oPC = GetFirstFactionMember(oKiller);
    while(GetIsObjectValid(oPC))
    {

        if(!GetIsDM(oPC) && oKilledArea == GetArea(oPC))
        {
            int nCurExp=GetXP(oPC);
            int modXP;
            if (nCharXP>0)
            {
                if(GetHitDice(oPC)<12)
                {
                    modXP=nCharXP;
                    if ((abs(GetHitDice(oPC)-FloatToInt(fAvgPartyLevel))>5) || (nHighestLevel-GetHitDice(oPC)>5))
                        modXP=modXP/4;

                                        if ((GetLevelByClass(CLASS_TYPE_SORCERER, oPC) == TRUE)||(GetLevelByClass(CLASS_TYPE_WIZARD, oPC) == TRUE))
                    modXP = modXP / 3;
                    if ((GetLevelByClass(CLASS_TYPE_SHIFTER, oPC) == TRUE)||((GetLevelByClass(CLASS_TYPE_RANGER, oPC) == TRUE)))
                    modXP = modXP * 2;
                    GiveXPToCreature(oPC, modXP);
                    PrintString("Rewarded "+GetName(oPC)+ " XP = "+IntToString(nCharXP));
                }
                else
                {
                    switch (GetHitDice(oPC))
                    {
                        case 12:modXP=nCharXP* 7 / 8;
                                break;
                        case 13:modXP=nCharXP* 13 / 16;
                                break;
                        case 14:modXP=nCharXP* 6 / 8;
                                break;
                        case 15:modXP=nCharXP* 11 / 16;
                                break;
                        case 16:modXP=nCharXP* 5 / 8;
                                break;
                        case 17:modXP=nCharXP* 9 / 16;
                                break;
                        case 18:modXP=nCharXP* 4 / 8;
                                break;
                        case 19:modXP=nCharXP* 7 / 16;
                                break;
                        case 20:modXP=nCharXP* 3 / 8;
                                break;
                        default: modXP=nCharXP* 3 /8;
                                break;
                    }
                    if (abs(GetHitDice(oPC)-FloatToInt(fAvgPartyLevel))>5 || (nHighestLevel-GetHitDice(oPC)>5))
                        modXP=modXP/4;

                                        if ((GetLevelByClass(CLASS_TYPE_SORCERER, oPC) == TRUE)||(GetLevelByClass(CLASS_TYPE_WIZARD, oPC) == TRUE))
                    modXP = modXP / 3;
                    if ((GetLevelByClass(CLASS_TYPE_SHIFTER, oPC) == TRUE)||((GetLevelByClass(CLASS_TYPE_RANGER, oPC) == TRUE)))
                    modXP = modXP * 2;
                    GiveXPToCreature(oPC, modXP);
                    PrintString("Rewarded "+GetName(oPC)+ " XP = "+IntToString(modXP)+ " (level "+IntToString(GetHitDice(oPC))+")");
                }
            }
        }
        oPC = GetNextFactionMember(oKiller, TRUE);
    }


откуда брать basexp и bonusxp понятия не имею
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jul 9 2005, 07:54
Сообщение #1581


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

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



Batkom вопросы по скриптингу в другой теме. Тут вопросы новичков. Еще раз увижу обсуждение кода, влеплю пред.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Batkom
сообщение Jul 9 2005, 13:39
Сообщение #1582


Level 4
**

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



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


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

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



Batkom, не бери из Нордока, там паршивая система распределения опыта. Она мне не понравилась. Лучше попробуй этот скрипт Neverwinter Vault - PWFXP.

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

Сообщение отредактировал Zirrex - Jul 9 2005, 13:57
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Batkom
сообщение Jul 9 2005, 22:46
Сообщение #1584


Level 4
**

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



То что качелей и паравозов нету есть гут, ибо я чего толкьо не делал и как только не извращался.
Сейчас попробую внедрить.

Все работает, пока не совсем так как хотелось бы, но это вопрос времени.

Огромное спасибо. :D
Добавлено в [mergetime]1120956151[/mergetime]
Еще раз спасибо, скрипт отлично работает, все настроил, теперь прусь :D

..ээм...вот еще пара вопросиков :unsure:
1 как увеличить продолжительность сна
2 как проверить есть ли в пределах 5 метров от игрока плсбл обьект с известным тегом?
Хочу сделать, чтобы без разведенного рядом костра восстанавливались не все хит поинты и просто увеличить продолжительность отдыха в 2 или 3 раза

Сообщение отредактировал Batkom - Jul 10 2005, 00:28
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jul 10 2005, 07:55
Сообщение #1585


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

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



QUOTE (Batkom @ Jul 10 2005, 01:46)
2 как проверить есть ли в пределах 5 метров от игрока плсбл обьект с известным тегом?

Сделай перебор объектов рядом в кубе. Если в кубе бушь перебирать, укажи размер куба и не нужно писать третий параметр в строках снизу.
Neverwinter Script Source
object GetFirstObjectInShape(int nShape, float fSize, location lTarget, int bLineOfSight=FALSE, int nObjectFilter=OBJECT_TYPE_CREATURE, vector vOrigin=[0.0,0.0,0.0])

Neverwinter Script Source
if (GetObjectType(oPlsb) == OBJECT_TYPE_PLACEABLE && GetTag(oPlsb) == "TAG_ОБЪЕКТА"
      && GetDistanceBetween(OBJECT_SELF, oPlsb)<=5.0)
      {
        // Делай с ним что хошь...
        }

Добавлено в [mergetime]1120971414[/mergetime]
Если через перебор всех объектов то
Neverwinter Script Source
GetDistanceBetween(OBJECT_SELF, oPlsb)<=5.0

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

205 страниц V  « < 62 63 64 65 66 > » 
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 15th July 2025 - 21:12