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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
14 страниц V  « < 9 10 11 12 13 > »   
Ответить в эту темуОткрыть новую тему
> Скрипты: Все вопросы, Алгоритмы, оптимизация, особености и хитрости в скриптинге
Marta
сообщение Jul 27 2009, 13:56
Сообщение #236


Level 1


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



Еще вопрос, - к azathoth, или еще к кому-нибудь.

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

Я попыталась приравнять гномов и хоббитов к дварфам, чтобы можно было в окошке sRase(String) выставить единицу, и не париться. Но, что ни напишу, все компилируется, но ни хрена не работает.

Сначала я просто написала

Neverwinter Script
else if(sRace == "gnome" || nRace == 1)


Не сработало. Оно и понятно, - выше по списку числятся дварфы, у которых тоже прописана цифра 1. Тогда я переписала:
Neverwinter Script
else if (sRace == "halfling" || nRace == 3)
    {
    return (nRacialType == 1 || nRacialType == 11);
    }

Опять не сработало. Пишу другой вариант:

Neverwinter Script
else if(sRace == "gnome" || nRace == 3)
    {
        nRacialType = GetRacialType(oPC);
        nCheck = RACIAL_TYPE_GNOME;
        return (nRacialType == 1 || nRacialType == 11);
    }

Не работает. Если я пишу гномам nRace == 1, это не влияет. Я думаю, может дело в субрасах. Пишу:
Neverwinter Script
else if(GetStringLeft(sRace, 13) == "lightfoothalf" || nRace == 15)
    {
    return (nRacialType == 1 || nRacialType == 11);
    }

И опять, блин, не работает. Вопрос, - что бы тут еще можно было написать, чтобы заработало, а то этот скрипт видит одних дварфов, как и стандартный скрипт gc_check_race_pc, и толку с него нет никакого. Почему не срабатывает return? Неясно. Если бы я разбиралась в скриптах, я бы, конечно, не мучила бы стандартный скрипт, а написала бы что-то вроде "дварфы, гномы, хоббиты == True, все остальные == False", но я вообще без понятия как и в какой форме такое пишут. Со стандартными скриптами иногда хоть что-то путное выходит. Так что, - в очередной раз, помогите, плиз, кто-нибудь.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Jul 28 2009, 11:48
Сообщение #237


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

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



должно быть что-то такое:

Neverwinter Script
int nRacialType = GetRacialType(oPC);
return (nRacialType==RACIAL_TYPE_GNOME || nRacialType==RACIAL_TYPE_DWARF || nRacialType==RACIAL_TYPE_HALFLING);

эта конструкция вернет TRUE, если раса игрока одна из трех. А на какие условия втыкать работу этого блока - тебе виднее. Можно замутить что-то универсальное, чтобы из диалога передавался символьный код, например GDH, который понимался бы скриптом как гномы/дварфы/халфлинги. Но имхо под конкретный модуль проще сделать несколько общих скриптов. Если у тебя всегда такая комбинация карликов, то проще сделать для этого отдельный скрипт и не париться.

зы: не уверен в правильности расовых констант, пишу по памяти.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Marta
сообщение Jul 28 2009, 14:30
Сообщение #238


Level 1


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



Lex, прости, но вообще не поняла. Я же говорю, - я не скриптер, не программер, - я сценарист.

Мне что, писать

Neverwinter Script
// gc_check_race_PC_correct

int StartingConditional(string sRace)
{
    object oPC = GetPCSpeaker();
    int nRacialType = GetRacialType(oPC);
    return (nRacialType==RACIAL_TYPE_GNOME || nRacialType==RACIAL_TYPE_DWARF || nRacialType==RACIAL_TYPE_HALFLING);
}

?

Но если я пишу (string sRace), это предполагает, что будет окно sRase(String), - и что мне в это окно писать? А если я не пишу (string sRace), то что вместо него написать-то?

Или мне по-прежнему основываться на стандартном скрипте, и расписывать все расы, типа if(sRace == "dwarf" || nRace == 1) , но как? Какой смысл возвращать расу гномов к "RACIAL_TYPE_GNOME", уж не говоря о том, что в стандартном скрипте не int nRacialType = GetRacialType(oPC); , а int nRacialType = GetSubRace(oPC); . На этом мысль останавливается.

А что касается таких замороченных заклинаний, как "символьный код GDH", так на нашем болоте об этой темной некромантии и не слыхивали, и я таких словов вообще не знаю. Ты уж, пожалуйста, будь проще с народом.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Jul 28 2009, 15:38
Сообщение #239


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

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



а ты не пиши (string sRace). И вместо него ничего не пиши. Для данного скрипта тебе вводные параметры из диалога не нужны.

Neverwinter Script
int StartingConditional()
{
    int nRacialType = GetRacialType(GetPCSpeaker());
    return (nRacialType==RACIAL_TYPE_GNOME || nRacialType==RACIAL_TYPE_DWARF || nRacialType==RACIAL_TYPE_HALFLING);
}


Цитата(Marta @ Jul 28 2009, 14:30) *
А что касается таких замороченных заклинаний, как "символьный код GDH", так на нашем болоте об этой темной некромантии и не слыхивали, и я таких словов вообще не знаю. Ты уж, пожалуйста, будь проще с народом.

я лишь имел ввиду передачу из диалога данных в виде строки "GHD", которая бы скриптом расценивалась как: "TRUE, если игрок Gnone, Halfling или Dwarf". Но сейчас я еще раз над этим подумал - плохая идея. Получится большой скрипт (разбор сторки на символы, анализ символов, формирование результата бинарным сложением для упрощения проверки и собственно сама проверка), и нужно будет каждый раз верно ставить буквы. Имхо проще несколько более простых скриптов без внешних параметров.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Marta
сообщение Jul 28 2009, 17:30
Сообщение #240


Level 1


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



Ес-с, работает. Не знала, что после int StartingConditional надо скобки оставлять :-). Может быть, в итоге я чему-то выучусь, и перестану уже тупить, но пока до этого далеко.
Спасибо огромное.

Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Chimeric
сообщение Aug 3 2009, 15:46
Сообщение #241


Пушкин
Иконки Групп

Класс: Обыватель
Характер: Chaotic Neutral
Раса: Гигант
NWN: Тексты



Общий вопрос. Известно, что Обсидиан отличается от Авроры интерфейсом и некоторыми функциями - я слышал про cutscenes и ActionSit. Я здесь не говорю про маппинг, который может отличаться сильно. Меня интересуют основные, традиционные функции скриптов Авроры. Годны ли они в целом? Иными словами, если я возьму типичный, средней сложности скрипт для Авроры с проверками пола, времени суток и т.п., или скрипт со spawn и уничтожением объектов, с установкой глобальных переменных, такого рода вещами, сколько из этого придется менять?

Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Griffon
сообщение Aug 3 2009, 16:14
Сообщение #242


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

Класс: Страж Тьмы
Характер: True Neutral
Раса: Человек
МАСТЕР D&D



В целом скрипты не отличаются и их можно использовать в обоих редакторах. Полный список неработающих функций должен быть на офф форумею К слову, ActionSit одна из них. Более подробно расскажет комадна шарда БГ или Ванес, он тож активно переносил все на НВН2.

http://nwvault.ign.com/View.php?view=NWN2A...6#_Toc146633941

Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Chimeric
сообщение Aug 6 2009, 16:56
Сообщение #243


Пушкин
Иконки Групп

Класс: Обыватель
Характер: Chaotic Neutral
Раса: Гигант
NWN: Тексты



Спасибо.

Еще вопрос: задавался ли кто-нибудь системой скриптов для изучения заклинаний (spell research)?

Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Georgus
сообщение Aug 25 2009, 14:57
Сообщение #244


Level 1


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



Приветствую уважаемых мастеров. У меня такой вопрос - как сделать, чтобы после смерти персонаж возрождался не в месте гибели, а в указанном мною. Вопрос второй - как сделать чтобы после смерти персонаж вообще не воскрешался, а вылетала табличка из НВН2 (игра окончена, все свободны: загрузка или выход). Заранее спасибо.


З.Ы Да да, я уже знаю. Я НУБ и ламер=)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Griffon
сообщение Aug 26 2009, 15:25
Сообщение #245


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

Класс: Страж Тьмы
Характер: True Neutral
Раса: Человек
МАСТЕР D&D



Neverwinter Script
V1.1                  l  Ќ                                                                                                                          gui_death_respawn_self              Щ  mod_onplayerdeath                Щ  mod_onplayerrespawn              Щ  0  Ц    ?  E  †  // gui_death_respawn_self
/*
    NWN2 Default Death Screen 'Respawn' callback
*/

// BMA-OEI 7/20/06
// BMA-OEI 11/08/06 -- Close SCREEN_DEATH_DEFAULT
/*
  You can place your real respawn script in here or
  you can use it like I did and execute it on the player.
*/



#include "ginc_death"


void main()
{
    //ResurrectCreature( OBJECT_SELF );
    ExecuteScript("mod_onplayerrespawn",OBJECT_SELF);
    CloseGUIScreen( OBJECT_SELF, "SCREEN_DEATH_DEFAULT" );
}/*
    mod_onplayerdeath
*/

const string GUI_DEFAULT_DEATH_SCREEN = "SCREEN_DEATH_DEFAULT";

// Display death pop-up to oPlayer
void ShowDefaultDeathScreen( object oPlayer );

void main()
{
    object oPlayer = GetLastPlayerDied();   
    DelayCommand( 2.5f, ShowDefaultDeathScreen( oPlayer ) );
}

// Display death pop-up to oPlayer
void ShowDefaultDeathScreen( object oPlayer )
{
    DisplayGuiScreen( oPlayer, GUI_DEFAULT_DEATH_SCREEN, FALSE );
    //DisplayMessageBox( oPlayer, 0, GetStringByStrRef(181408), "gui_death_respawn_self", "", FALSE, "", 6603, "", 0, "" );
}/*
    mod_onplayerrespawn
*/

#include "nw_i0_plot"
#include "ginc_death"
#include "x0_i0_transport"

//::  Applies an XP and GP penalty
//::    to the player respawning
//::  object oDead - Player who died.
void ApplyPenalty(object oDead);
//::  Gets the tag of the destination waypoint
//::  object oDead - Player who died.
string GetDestinationTag(object oDead);
//::  Gets the respawning player
object GetRespawningPlayer();
//::  Gets the respawn point, if any
//::  sDestTag - tag of the destination waypoint
//::  oDead - Player who died
object GetRespawnPoint(string sDestTag, object oDead);

void main()
{
    //Create initial variables
    object oRespawner = GetRespawningPlayer();
    object oArea = GetArea(oRespawner);
    string sDestTag = GetDestinationTag(oRespawner);
    object oRespawnPoint = GetRespawnPoint(sDestTag, oRespawner);
    location lDeathSpot = GetLocation(GetLastRespawnButtonPresser());
    location lRespawnPoint;
   
    //Apply effects to PC
    ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectRe
surrection(),oRespawner);
    ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHe
al(GetMaxHitPoints(oRespawner)), oRespawner);
    RemoveEffects(oRespawner);
   
    //Apply death penalty
    ApplyPenalty(oRespawner);
   
    //Transport PC
    if (GetIsObjectValid(oRespawnPoint))
    {
        lRespawnPoint = GetLocation(oRespawnPoint);
        TransportToLocation(oRespawner,lRespawnPoint);
    }
   
    //Bring PC back to life
    DelayCommand(1.5,ResurrectCreature(oRespawner));
}

void ApplyPenalty(object oDead)
{
    location lDeathSpot = GetLocation(oDead);
    int nXP = GetXP(oDead);
    int nPenalty = 50 * GetHitDice(oDead);
    int nHD = GetHitDice(oDead);
    // * You can not lose a level with this respawning
    int nMin = ((nHD * (nHD - 1)) / 2) * 1000;

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

string GetDestinationTag(object oDead)
{
    //You can go about determining where the respawn waypoint
    //is located a number of ways.  In here I have two examples.
    //    Determined by setting a string variable on the area called sRespawn
    //    Manually set it.
    string sTag = "";
    object oArea = GetArea(oDead);
    //Get tag based on area level variable
    sTag = GetLocalString(oArea,"sRespawnTag");
    //Check for tag and default to a module level variable
    if(sTag == "")
    {
        sTag = GetLocalString(GetModule(),"sRespawnTag");
    }
    //Manually set tag
    //sTag = "";
    return sTag;
}

object GetRespawningPlayer()
{
    //This should be OBJECT_SELF, however if not then
    //we can use the player that last pressed the respawn
    //button.
    object oPlayer = OBJECT_INVALID;
    oPlayer = OBJECT_SELF;
    //Make sure this is a PC
    if(!GetIsPC(oPlayer))
    {
        oPlayer = GetLastRespawnButtonPresser();
    }
    return oPlayer;
}

object GetRespawnPoint(string sDestTag, object oDead)
{
    //Get the waypoint object by using the destination
    //tag.  First we try for one in the current area by
    //using GetNearestObjectByTag, otherwise we jsut get
    //an object with that tag.
    object oRespawnPoint = OBJECT_INVALID;
    oRespawnPoint = GetNearestObjectByTag(sDestTag,oDead);
    if(!GetIsObjectValid(oRespawnPoint))
    {
        oRespawnPoint = GetWaypointByTag(sDestTag);
    }
    return oRespawnPoint;
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Aug 27 2009, 08:40
Сообщение #246


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

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



Грифон, ты опасен!
Подумай над своей реакцией, если бы я на твои ранние вопросы по скриптам так бы отвечал (IMG:style_emoticons/kolobok_light/smile.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Aug 27 2009, 11:15
Сообщение #247


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

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



Lex, тогда парня надо отправлять сразу в тему по обучению скриптам. Через месяц выкладывать даваемое по кускам (IMG:style_emoticons/kolobok_light/smile.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Georgus
сообщение Aug 27 2009, 12:46
Сообщение #248


Level 1


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



Хех, спасиб . Попробую разобраться в данном скрипте.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Griffon
сообщение Aug 27 2009, 13:35
Сообщение #249


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

Класс: Страж Тьмы
Характер: True Neutral
Раса: Человек
МАСТЕР D&D



Lex, я на то и рассчитывал, что гуру скриптинга сразу же прокомментируют, выкинут лишнее и вынесут вердикт. (IMG:style_emoticons/kolobok_light/biggrin.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Aug 27 2009, 14:45
Сообщение #250


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

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



Цитата(Griffon @ Aug 27 2009, 13:35) *
Lex, я на то и рассчитывал, что гуру скриптинга сразу же прокомментируют, выкинут лишнее и вынесут вердикт. (IMG:style_emoticons/kolobok_light/biggrin.gif)

я вердикт выше вынес: ты опаcен (IMG:style_emoticons/kolobok_light/smile.gif) )

по теме: если нужно ТОЛЬКО респ в какой-то точке (без штрафов и прочей фигни) или вообще его убрать - то 3/4 скрипта можно выкинуть.
А вот если планируется еще куча мелких фич, динамическое изменение места респауна и тд - то выкидывать придется не так уж и много.

Но в любом случае, чтобы скрипт заработал - нужно еще понаставить доп. объектов и переменные задать.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Melshin
сообщение Dec 15 2009, 06:00
Сообщение #251


Level 2
*

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



Реализую не стакающиеся бонусы к атаке разноименных типов (ДнД 3.5, ем буквы).

Вариант 1:

Код
effect MoraleBonus (effect eEffect)
{
    eEffect = SetEffectSpellId (eEffect, 1600);
    return eEffect;
}



Вариант 2 - хранение переменных/массивов на объекте-цели или в БД.

Вопрос - как сделать все так, чтобы и диспелл был меньше, чем на 20 страниц кода и длительность нескольких разных спеллов с одноименными эффектами выверялась нормально?

P.S. только что задумался о создании динамического списка на модуле...

Если что, у нас есть еще вот такой список своих функций:

void AppendArrayInt(object obj,string bufName,int value);
int GetArrayInt(object obj,string bufName,int index);
void SetArrayInt(object obj,string bufName,int index,int value);

void AppendArrayLoc(object obj,string bufName,location value);
location GetArrayLoc(object obj,string bufName,int index);
void SetArrayLoc(object obj,string bufName,int index,location value);

void AppendArrayString(object obj,string bufName,string value);
string GetArrayString(object obj,string bufName,int index);
void SetArrayString(object obj,string bufName,int index,string value);

void AppendArrayFloat(object obj,string bufName,float value);
float GetArrayFloat(object obj,string bufName,int index);
void SetArrayFloat(object obj,string bufName,int index,float value);


void AppendArrayObject(object obj,string bufName,object value);
object GetArrayObject(object obj,string bufName,int index);
void SetArrayObject(object obj,string bufName,int index,object value);


void DestroyArray(object obj,string bufName,int type=tINT);
int IsArraySet(object obj,string bufName);
int GetArrayIdxCount(object obj,string bufName);
void DestroyArrayIdx(object obj,string bufName,int index,int type=tINT);
int Split(object obj,string str,string bufName,int type=tSTR,string separator=",");
int SplitCount(string str,string separator=",");
void OutputArray(object obj,string bufName,int type,object oPC=OBJECT_INVALID);

void CreateMatrix(object obj,string bufName,int width,int height);
void DeleteMatrix(object obj,string bufName,int type=tINT);
void ExpandMatrix(object obj,string bufName,int xcount,int ycount);
int GetMatrixInt(object obj,string bufName,int x,int y);
string GetMatrixString(object obj,string bufName,int x,int y);
float GetMatrixFloat(object obj,string bufName,int x,int y);
object GetMatrixObject(object obj,string bufName,int x,int y);
void SetMatrixInt(object obj,string bufName,int x,int y,int value);
void SetMatrixString(object obj,string bufName,int x,int y, string value);
void SetMatrixFloat(object obj,string bufName,int x,int y,float value);
void SetMatrixObject(object obj,string bufName,int x,int y,object value);

Сообщение отредактировал Melshin - Dec 15 2009, 06:09
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Melshin
сообщение Dec 16 2009, 15:14
Сообщение #252


Level 2
*

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



Цитата
P.S. только что задумался о создании динамического списка на модуле...


Начал. Вопрос к опытным мастерам: стоит ли? Будет ли у этого нормальная производительность?

Смысл вышенаписанного: при загрузке в модуль первого персонажа инициализируется рекурсивная (6 секунд) ProcessEffects (). На модуле хранится массив, в котором каждый элемент - объект, на котором находится эффект какого-то заклинания или еще чего. На каждом объекте хранится массив, в котором каждый элемент - какой-то SpellId. Для каждого существующего SpellId берутся локальные интеджеры: кастер лвл, длительность в раундах, ДЦ (если нужно, еще можно весь дамаг для ДОТ-ов сразу рассчитать, т.к. всякие эмповерд нехорошие). Если длительность не закончилась - держим на объекте эффект заклинания 6 секунд до следующего выполнения ProcessEffects. Если длительность закончилась - стираем нафиг спелл из массива и всю информацию о нем. Если объект подвергся диспеллу - работаем с соответствующим массивом.

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

Так вот собственно объектов в модуле много, на каждом может быть несколько спеллов, а в каждом спелле разные эффекты...

Сообщение отредактировал Melshin - Dec 16 2009, 15:17
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Merkuta
сообщение Feb 22 2010, 00:33
Сообщение #253


Level 3
*

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



Извините если не по теме, но есть ли русскоязычные статьи по основам скриптинга для nwn2? Я недавно взялся за тулсет. Освоил практически всё кроме скриптов и не знаю как к ним подступиться. С использованием готовых скриптов в диалогах вроде разобрался, но дальше никак.

Вот например, нужны такие скрипты:

1) Если переменная Local Int "XXXXX" принимает значение 1, начинается отсчёт времени, после которого переменная возвращается в значение 0.

2) Если игрок покидает локацию, все открытые двери в этой локации закрываются.

3) Если в сундуке А есть вещи, они переносятся в сундук Б.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lorendroll
сообщение Feb 22 2010, 15:31
Сообщение #254


Level 9
***

Класс: Волшебник
Характер: Neutral Good
Раса: Эльф



Merkuta,
1) Для этого переменная твоя должна быть локальной, и где-то храниться. Например на игроке. Для этого задавай ее так:
Neverwinter Script
object oPC = GetFirstPC(); //будет брать первого игрока в модуле. Если игрок один это сработает. Иначе придумай как нам найти нужного (зависит от того, откуда запускается скрипт)

SetLocalInt(oPC, "A", 1); //А = 1


В другом месте, где надо ее проверять и запускать таймер, пиши:

Neverwinter Script
object oPC = GetFirstPC();

int A = GetLocalInt(oPC, "A"); //берем с первого попавшегося игрока переменную А

if (A == 1)
{
float fTime = 10.0; //через сколько секунд занулять будем?
DelayCommand(fTime, SetLocalInt(oPC, "A", 0));
}


2) Это намного сложнее.

3) Здесь нужно организовать цикл перебора всех вещей в сундуке А и копирования их в сундук Б.

Напиши мне в аську/пм, подскажу по ходу дела, если нужно.


Melshin, думаю если воспользуешься NWNX и подрубишь внешнюю БД, то производительность будет норм. Если юзать стандартные скрипты для работы с массивами - загрузишь его серьезно. Но наверняка не могу говорить.

Сообщение отредактировал Lorendroll - Feb 22 2010, 15:42
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Kcapra
сообщение May 26 2010, 15:15
Сообщение #255


Level 9
***

Класс: Фея
Характер: Chaotic Evil
Раса: Фея



Здрасте.
Нужно на хартбит повесить функцию, которая будет отсчитывать внутриигровое время начиная с первой загрузки модуля.
Neverwinter Script
#include "inc_array_system"

void main()
{
object oPC = GetFirstPC(1);
//if (!GetIsPC(oPC)) return;
int nInt; int nDay; int nMin; int nHr;
nInt = array_get_int(oPC, "timer", 3);
nInt = nInt + 3; //изменяется в зависимости от текущего таймскейла
array_set_int(oPC, "timer", 3, nInt);
/*if (array_get_int(oPC, "timer", 4) == 60)     //seconds into minutes
    {
        nMin = array_get_int(oPC, "timer", 3);
        nMin = nMin + 1;
        array_set_int(oPC, "timer", 3, nMin);
        array_set_int(oPC, "timer", 4, 0);
    }*/

if (array_get_int(oPC, "timer", 3) == 60)     //minutes into hours
    {   
        nHr = array_get_int(oPC, "timer", 2);
        nHr = nHr + 1;
        array_set_int(oPC, "timer", 2, nHr);
        array_set_int(oPC, "timer", 3, 0);
    }
if (array_get_int(oPC, "timer", 2) == 24)    //hours into days
    {   
        nDay = array_get_int(oPC, "timer", 1);
        nDay = nDay + 1;
        array_set_int(oPC, "timer", 1, nDay);
        array_set_int(oPC, "timer", 2, 0);
    }
}


в качестве inc_array_system используется этот скрипт.

Проблема в том, что нифига это ненадежно и недостоверно. Из-за фаст тревелов/возможных кастомных системах отдыхов и прочего. Может быть есть какой-нибудь более простой способ/функции о которых я даже не подозреваю?
Использоваться это будет в сингл модуле.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение May 26 2010, 16:17
Сообщение #256


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

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



самый простой способ работы с игровым временем, имхо, это его пересчет в игровые секунды. Те текущий месяц, день и час пересчитывается в секунды и сравнивается с контрольным для определения, прошло ли нужное количество времени или нет. Этим решается проблема временных скипов в скриптах. Проверять можно не каждые 6 секунд, а лишь когда нужно (в диалоге, в скрипте и тд), что экономит ресурсы. И тд.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Kcapra
сообщение May 26 2010, 17:01
Сообщение #257


Level 9
***

Класс: Фея
Характер: Chaotic Evil
Раса: Фея



Цитата(Lex @ May 26 2010, 21:17) *
самый простой способ работы с игровым временем, имхо, это его пересчет в игровые секунды. Те текущий месяц, день и час пересчитывается в секунды и сравнивается с контрольным для определения, прошло ли нужное количество времени или нет. Этим решается проблема временных скипов в скриптах. Проверять можно не каждые 6 секунд, а лишь когда нужно (в диалоге, в скрипте и тд), что экономит ресурсы. И тд.

Не, для меня это не подходит, нужно чтобы все юзер-френдли было (IMG:style_emoticons/kolobok_light/crazy.gif)

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

Только топорно все это, и, ввиду малого опыта работы с большими модами, спрашиваю скажется ли это негативно на перфомансе?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение May 26 2010, 23:43
Сообщение #258


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

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]
Gem of the North
Край Лесов



Почему бы не юзать аптайм в секундах в скриптах, а для юзерфрендли вывода не написать конвертер из секунд в остальное посредством деления с остатком?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение May 27 2010, 09:29
Сообщение #259


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

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



Цитата(Kcapra @ May 26 2010, 18:01) *
Не, для меня это не подходит, нужно чтобы все юзер-френдли было crazy.gif

для юзерфрендлиности нужно все расчеты спрятать внутрь инклуда, оставив снаружи несколько управляющих функций. Например:
* SetTimer(string sTimerName); - запоминаем текущее время и привязываем число к sTimerName для последующей работы с ним пользователя
* CheckTimer(string sTimerName, int nTimeHour, int nTimeMinute = 0); - проверемя разницу между текущим временем и запомненым по идентификатору. Тру - если прошло больше времени, чем указано в nTimeHour/nTimeMinute
* DeleteTimer(string sTimerName); - удалить таймер

Довольно плотно в свое время работал с внутриигровым временем, по своему опыту скажу: в 90% случаев не нужно в каждый момент знать сколько прошло (те каждые 6 секунд ничего пересчитывать не нужно), проверки прохождения энного количества времени стоят в весьма конкретных местах: вход в локу, фраза диалога и тд. У меня было лишь 2-3 случая, когда пришлось повесить на ХБ, потому что отложенное событие было само по себе. В этой связи завязывать систему на постоянный пересчет считаю не совсем верным, пересчет должен быть вызываемым. И пусть в паре случаев вызов будет в ХБ, ничего страшного.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Kcapra
сообщение Jun 5 2010, 06:33
Сообщение #260


Level 9
***

Класс: Фея
Характер: Chaotic Evil
Раса: Фея



Lex, спасибо, момент с вызовом функции по требованию что-то совсем выпал из головы (IMG:style_emoticons/kolobok_light/prankster2.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

14 страниц V  « < 9 10 11 12 13 > » 
Ответить в эту темуОткрыть новую тему
5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 19th July 2025 - 19:47