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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
147 страниц V  « < 55 56 57 58 59 > »   
Ответить в эту темуОткрыть новую тему
> Скрипты, Все вопросы и ответы по скриптам
Batkom
сообщение Jul 18 2005, 01:41
Сообщение #1391


Level 4
**

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



сделал простенькую систему вархаузов, стоит сундук,оа onOpen стоит
Neverwinter Script Source
void main()
{
SetLocked(OBJECT_SELF, TRUE);
object oPC = GetLastUsedBy();
int kItems = GetCampaignInt(GetModuleName(), "kwares" + GetPCPlayerName(oPC) + GetPCPublicCDKey(oPC));
while (kItems > 0)
    {
    string sItem = GetCampaignString(GetModuleName(), "wares" + GetPCPlayerName(oPC) + GetPCPublicCDKey(oPC) + IntToString(kItems));
    CreateItemOnObject(sItem, OBJECT_SELF, 1);
    kItems = kItems -1;
    }
}


на onClose
Neverwinter Script Source
void main()
{
object oPC = GetLastUsedBy();
int kItems = 0;
object oItem = GetFirstItemInInventory(OBJECT_SELF);
SetLocked(OBJECT_SELF, TRUE);
while(GetIsObjectValid(oItem) == TRUE)
    {
        kItems = kItems + 1;
        string sRes = GetResRef(oItem);
        SetCampaignString(GetModuleName(), "wares" + GetPCPlayerName(oPC) + GetPCPublicCDKey(oPC) + IntToString(kItems), sRes);
        DestroyObject(oItem);
        oItem = GetNextItemInInventory(OBJECT_SELF);
    }
    SetCampaignInt(GetModuleName(), "kwares" + GetPCPlayerName(oPC) + GetPCPublicCDKey(oPC), kItems);
}

ве вроди бы работает, только есть две проблемы, во первых траблы со стак предметами, во вторых иногда исчезает какая нибудь одна вещь
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
GoingPro)
сообщение Jul 18 2005, 10:30
Сообщение #1392


Level 3
*

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



Помогите не работает чете =\....Вот скрипт:
На ОнЕкзит
Neverwinter Script Source
string LocationToString(location lLocation)
{
    object oArea = GetAreaFromLocation(lLocation);
    vector vPosition = GetPositionFromLocation(lLocation);
    float fOrientation = GetFacingFromLocation(lLocation);
    string sReturnValue;

    if (GetIsObjectValid(oArea))
        sReturnValue = "#AREA#" + GetTag(oArea) + "#POSITION_X#" + FloatToString(vPosition.x) + "#POSITION_Y#" + FloatToString(vPosition.y) + "#POSITION_Z#" + FloatToString(vPosition.z) + "#ORIENTATION#" + FloatToString(fOrientation) + "#END#";
    return sReturnValue;
}



void main()
{
  object oPC = GetExitingObject();
  object oItem = GetItemPossessedBy(oPC, "tag_of_item");
  string sReturnValue;
  location lLocation = GetLocation(oPC);
  if (GetIsPC(oPC))
  {
    LocationToString(lLocation);
    SetLocalString(oItem, "Location" + GetPCPlayerName(oPC), sReturnValue);
  }
}


И на ОнЕнтер
Neverwinter Script Source
location StringToLocation(string sLocation)
{
    location lReturnValue;
    object oArea;
    vector vPosition;
    float fOrientation, fX, fY, fZ;

    int iPos, iCount;
    int iLen = GetStringLength(sLocation);

    if (iLen > 0)
    {
        iPos = FindSubString(sLocation, "#AREA#") + 6;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        oArea = GetObjectByTag(GetSubString(sLocation, iPos, iCount));

        iPos = FindSubString(sLocation, "#POSITION_X#") + 12;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fX = StringToFloat(GetSubString(sLocation, iPos, iCount));

        iPos = FindSubString(sLocation, "#POSITION_Y#") + 12;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fY = StringToFloat(GetSubString(sLocation, iPos, iCount));

        iPos = FindSubString(sLocation, "#POSITION_Z#") + 12;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fZ = StringToFloat(GetSubString(sLocation, iPos, iCount));

        vPosition = Vector(fX, fY, fZ);

        iPos = FindSubString(sLocation, "#ORIENTATION#") + 13;
        iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#");
        fOrientation = StringToFloat(GetSubString(sLocation, iPos, iCount));

        lReturnValue = Location(oArea, vPosition, fOrientation);
    }

    return lReturnValue;
}


void main()
{
  object oPC = GetEnteringObject();
  object oItem = GetItemPossessedBy(oPC, "tag_of_item");
  location lReturnValue;
  string sLocation = GetLocalString(oItem, "Location" + GetPCPlayerName(oPC));
  if (GetIsPC(oPC))
  {
      StringToLocation(sLocation);
      AssignCommand(oPC, ActionJumpToLocation(lReturnValue));
  }
}


Скрипты упростил на максимум что бы было проще разобраться...
Непонемаю почему он не работает, вроде бы все правильно по логике...
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
dumbo
сообщение Jul 18 2005, 12:43
Сообщение #1393


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

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



QUOTE (GoingPro) @ Jul 18 2005, 11:30)
На ОнЕкзит

выражайся точнее. судя по всему, это таки "ОнКлиентЛив" и "ОнКлиентЕнтер"...
что такое Lexicon знаешь? цитата оттуда:
QUOTE
All data that pertains to the player is unavailable (GetPCPlayerName, GetPCPublicCDKey, GetPCIPAddress) and the player has become detatched from the character object, hence GetIsPC returns false. If you want any of this information at time of client leave, you must have already stored this information (on client enter is a good time to do this). Also, due to this, no locals can be stored on the PC at this time.

да и ошибок в скриптах куча. :yes: особенно затейливо у тебя используются переменные, содержащие в имени ReturnValue. :crazy: короче, вот твои main'ы:
OnClientLeave:
Neverwinter Script Source
object oPC = GetExitingObject();
  object oItem = GetItemPossessedBy(oPC, "tag_of_item");
  SetLocalString(oItem, "Location",LocationToString(GetLocation(oPC)));

OnClientEnter:
Neverwinter Script Source
object oPC = GetEnteringObject();
  object oItem = GetItemPossessedBy(oPC, "tag_of_item");
  if (oItem == OBJECT_INVALID)
    // если еще нету, создаем.
    CreateItemOnObject("tag_of_item", oPC);
  else
    ActionJumpToLocation(StringToLocation(GetLocalString(oItem, "Location")));

Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Batkom
сообщение Jul 18 2005, 19:22
Сообщение #1394


Level 4
**

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



Так и не нашел скрипта смерти(ну точно видел, но повторнео найти так и не смог)
написал свой код
Neverwinter Script Source
//ôëàã
    SetCampaignString("deathsystem", "flag" + GetPCPlayerName(oPlayer),"yes");
    //ëîêàöèÿ
    location lDeath = GetLocation(oPlayer);
    SetCampaignLocation("deathsystem", "location" + GetPCPlayerName(oPlayer), lDeath);
    //âàðï â ôóãó
    Raise(oPlayer);
    AssignCommand(oPlayer, ActionJumpToLocation(GetLocation(GetObjectByTag("fugue"))));
     //òðóï
    object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "blueprint032", lDeath);
    object oItemcorpse = CreateItemOnObject("item369", oCorpse, 1);
    //óñòàíîâêà ïåðåìåííûõ
    SetLocalString(oCorpse, "master", GetPCPlayerName(oPlayer));
    SetLocalString(oItemcorpse, "master", GetPCPlayerName(oPlayer));
    //ãîëä
    int iGP = GetGold(oPlayer);
    TakeGoldFromCreature(iGP, oPlayer, TRUE);
    CreateItemOnObject("NW_IT_GOLD001", oCorpse, iGP);
    //ëóò
    int iSlot;
    int iLoot = d10(1);
    switch (iLoot){
    case 1: iSlot = INVENTORY_SLOT_ARMS;         break;
    case 2: iSlot = INVENTORY_SLOT_BELT;         break;
    case 3: iSlot = INVENTORY_SLOT_BOOTS;        break;
    case 4: iSlot = INVENTORY_SLOT_CLOAK;        break;
    case 5: iSlot = INVENTORY_SLOT_HEAD;         break;
    case 6: iSlot = INVENTORY_SLOT_LEFTHAND;     break;
    case 7: iSlot = INVENTORY_SLOT_LEFTRING;     break;
    case 8: iSlot = INVENTORY_SLOT_NECK;         break;
    case 9: iSlot = INVENTORY_SLOT_RIGHTHAND;    break;
    case 10: iSlot = INVENTORY_SLOT_RIGHTRING;   break;
    default: break;   }

    if (d10(1)>5)             {
object oLoot = GetItemInSlot(iSlot, oPlayer);
     CreateItemOnObject(GetResRef(oLoot), oCorpse);
     DestroyObject(oLoot);

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

Сообщение отредактировал Batkom - Jul 18 2005, 19:26
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
-fenix-
сообщение Jul 18 2005, 20:58
Сообщение #1395


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

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



Batkom, сорри, там на второй странице - вот код.
QUOTE (Lex @ Jan 27 2005, 22:14)
Скрипт на смерть НПС. НПС исчезает, а на его месте появляется труп на который переносятся все вещи покойного. Сам труп исчезает через 250 секунд.

"low_plc_loot" - резреф трупа в палитре.


Neverwinter Script Source
//::Created by      Лито
//::Modificated by  Lex
void Clear(object oBag = OBJECT_SELF)
{
object oItem = GetFirstItemInInventory(oBag);
while (GetIsObjectValid(oItem))
  {
  DestroyObject(oItem);
  oItem = GetNextItemInInventory(oBag);
  }
DestroyObject(oBag,1.0);
}
void main()
{
string sTemplate = "low_plc_loot";
string sTag = GetTag(OBJECT_SELF);
location lLoc = GetLocation(OBJECT_SELF);
object oloot = CreateObject(OBJECT_TYPE_PLACEABLE, sTemplate, lLoc, TRUE, sTag);
int i = 0;
object oItem = GetFirstItemInInventory(OBJECT_SELF);
while (GetIsObjectValid(oItem))
    {
    if (GetDroppableFlag(oItem))
      CopyObject(oItem,lLoc,oloot);
    DestoyObject(oItem);
    oItem = GetNextItemInInventory(OBJECT_SELF);
    }
oItem = GetItemInSlot(i,OBJECT_SELF);
while (i<14)
    {
    if (GetDroppableFlag(oItem))
      CopyObject(oItem,lLoc,oloot);
    DestoyObject(oItem);
    i++;
    oItem = GetItemInSlot(i,OBJECT_SELF);
    }
AssignCommand(oloot,DelayCommand(250.0,Clear(oloot)));
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Batkom
сообщение Jul 19 2005, 03:36
Сообщение #1396


Level 4
**

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



Сделал шардовую деф систему: это первая более менее серьезная взаимосвязаная система скриптов которую я написал, потому может не работать(еще не проверял, всевроде компилируется)
Если найдете ошибки, пишите, если все будет работать, выложу в базу скриптов.
Поехали:
Хертбит(работает):
Neverwinter Script Source
//игрока козявит, пока тот окончательно не умрет, козявит в принципе не особо долго, но успеть хелнуть можно
void main()
{
object oPC = GetFirstPC();
effect eDam = EffectDamage(1);
while (GetIsObjectValid(oPC) == TRUE)
{
int iHits = GetCurrentHitPoints(oPC);
if (iHits < 1)
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oPC);
oPC = GetNextPC();
}
}

onDying(совсем просто, тоже работает)
Neverwinter Script Source
//игроку выдается токен винвентарь, ибо случались попытки альта во время даинга, с последующим созданием нового чара и восстановления хит поинтов старому при совпаденииимен(баг игры, практиковался на gem of the north) при ентере игрок умерщвляется за альт
void main()
{

object oPC = GetLastPlayerDying();
CreateItemOnObject("item034", oPC, 1);

}


onPlayerDeath(как не странно, тоже работает)
Neverwinter Script Source
#include "nw_i0_plot"


void Raise(object oPlayer)
{
        effect eVisual = EffectVisualEffect(VFX_IMP_RESTORATION);

        effect eBad = GetFirstEffect(oPlayer);
        ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPlayer);
        ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPlayer)), oPlayer);

        //Search for negative effects
        while(GetIsEffectValid(eBad))
        {
            if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS ||
                GetEffectType(eBad) == EFFECT_TYPE_DEAF ||
                GetEffectType(eBad) == EFFECT_TYPE_PARALYZE ||
                GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL)
                {
                    //Remove effect if it is negative.
                    RemoveEffect(oPlayer, eBad);
                }
            eBad = GetNextEffect(oPlayer);
        }

        SignalEvent(oPlayer, EventSpellCastAt(OBJECT_SELF, SPELL_RESTORATION, FALSE));
        ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oPlayer);
}

void main()
{

    object oPlayer = GetLastPlayerDied();
    string sArea = GetTag(GetArea(oPlayer));
//если наарене, то варпает к флажку arenaspawn
    if (sArea == "arena")
    {

        Raise(oPlayer);

        object oSpawnPoint = GetObjectByTag("arenaspawn");
        AssignCommand(oPlayer, DelayCommand(1.0, JumpToLocation(GetLocation(oSpawnPoint))));

        return;
    }

  
    //Флажок
    SetCampaignString("deathsystem", "flag" + GetPCPlayerName(oPlayer),"yes");
    //Локация
    location lDeath = GetLocation(oPlayer);
    SetCampaignLocation("deathsystem", "location" + GetPCPlayerName(oPlayer), lDeath);
    //Варп в фугу, флажок respawn
    Raise(oPlayer);
    AssignCommand(oPlayer, DelayCommand(1.0, ActionJumpToLocation(GetLocation(GetObjectByTag("respawn")))));
     //Создание трупака и итима трупака в нем
    object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "blueprint032", lDeath);
    object oItemcorpse = CreateItemOnObject("item369", oCorpse, 1);
    //Установка переменных
    SetLocalString(oCorpse, "master", GetPCPlayerName(oPlayer));
    SetLocalString(oItemcorpse, "master", GetPCPlayerName(oPlayer));
    SetLocalString(GetModule(), "hascorpse" + GetPCPlayerName(oPlayer), "yes");
    //Взять золото и положить в труп
    int iGP = GetGold(oPlayer);
    AssignCommand(oPlayer, TakeGoldFromCreature(iGP, oPlayer, TRUE));
    CreateItemOnObject("NW_IT_GOLD001", oCorpse, iGP);
    //Вывалить рандомную вещичку из екиперовки если не повезет
    int iSlot;
    int iLoot = d10(1);
    switch (iLoot){
    case 1: iSlot = INVENTORY_SLOT_ARMS;         break;
    case 2: iSlot = INVENTORY_SLOT_BELT;         break;
    case 3: iSlot = INVENTORY_SLOT_BOOTS;        break;
    case 4: iSlot = INVENTORY_SLOT_CLOAK;        break;
    case 5: iSlot = INVENTORY_SLOT_HEAD;         break;
    case 6: iSlot = INVENTORY_SLOT_LEFTHAND;     break;
    case 7: iSlot = INVENTORY_SLOT_LEFTRING;     break;
    case 8: iSlot = INVENTORY_SLOT_NECK;         break;
    case 9: iSlot = INVENTORY_SLOT_RIGHTHAND;    break;
    case 10: iSlot = INVENTORY_SLOT_RIGHTRING;   break;
    default: break;   }

    if (d10(1)>5)             {
object oLoot = GetItemInSlot(iSlot, oPlayer);
     CreateItemOnObject(GetResRef(oLoot), oCorpse);
     DestroyObject(oLoot);
     }}

OnEnter в фуге
Neverwinter Script Source
void main()
{
object oPC = GetEnteringObject();
if(GetIsPC(oPC))
{
//превращаем игрока в духа
effect eGhost = EffectPolymorph(POLYMORPH_TYPE_SPECTRE, TRUE);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oPC);
//отбираем токен если он есть
object oItem = GetItemPossessedBy(oPC, "deathtoken");
if (GetIsObjectValid(oItem)) DestroyObject(oItem);
}
}


на OnExit в фуге
Neverwinter Script Source
void main()
{
object oPC = GetExitingObject();
effect eEf = GetFirstEffect(oPC);
//снимаем полиморф а заодно и все остальное
while (GetIsEffectValid(eEf))
{
RemoveEffect(oPC, eEf);
eEf = GetNextEffect(oPC);
}
//ищем труп с запомненойлокации и дестроим трупак в инвентаре пласибла, а потом сам пласибл, по умолчанию лут выпадает в виде мешочка
location lCorpse = GetCampaignLocation("deathsystem", "location" + GetPCPlayerName(oPC));
object oCorpse = GetNearestObjectToLocation(OBJECT_TYPE_PLACEABLE, lCorpse, 1);
if (GetTag(oCorpse) == "playercorpse")
    {
    object oItemcorpse = GetFirstItemInInventory(oCorpse);
    while(GetIsObjectValid(oItemcorpse))
        {
        if(GetTag(oItemcorpse) == "corpseitem") DestroyObject(oItemcorpse);
        oItemcorpse = GetNextItemInInventory(oCorpse);
        }
    }
    DelayCommand(1.0, DestroyObject(oCorpse));
//ставим флажок в выключеное состояние
SetCampaignString("deathsystem", "flag" + GetPCPlayerName(oPC),"no");
//говорим, что больше у игрока нет трупа
SetLocalString(GetModule(), "hascorpse" + GetPCPlayerName(oPC), "no");

на onenter в модуль
Neverwinter Script Source
void main()
{
//проверяем альтнулся ли игрок, если да, умерщвляем
object oPC = GetEnteringObject();
if (HasItem(oPC, "deathtocken"))
{
effect death = EffectDeath(TRUE);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, death, oPC);
}
//проверяем флажок и наличие у игрока трупа(в теории локальные переменные после рестарта обнуляются)
if((GetCampaignString("deathsystem", "flag" + GetPCPlayerName(oPC)) == "yes")&&(GetLocalString(GetModule(), "hascorpse" + GetPCPlayerName(oPC))!="yes"))
{
//летим в фугу
AssignCommand(oPC, DelayCommand(1.0, ActionJumpToLocation(GetLocation(GetObjectByTag("respawn")))));
    //создаем трупак и итем трупак
    location lDeath = GetCampaignLocation("deathsystem", "location" + GetPCPlayerName(oPC));
    object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "blueprint032", lDeath);
    object oItemcorpse = CreateItemOnObject("item369", oCorpse, 1);
    //показываем кто хозяин всего этого великолепия
    SetLocalString(oCorpse, "master", GetPCPlayerName(oPC));
    SetLocalString(oItemcorpse, "master", GetPCPlayerName(oPC));
}
}

при открытии инвентаря трупа
Neverwinter Script Source
void main()
{
string sMaster = GetLocalString(OBJECT_SELF, "master");
SpeakString("Здесь покоится " + sMaster, TALKVOLUME_TALK);
}

на закрытие инвентаря трупа
Neverwinter Script Source
void main()
{
//проверяем инвентарь трупа, если итем труп есть, дестроим плесибл труп
int i = 0;
object oItemcorpse = GetFirstItemInInventory(OBJECT_SELF);
while (GetIsObjectValid(oItemcorpse))
    {
    if(GetTag(oItemcorpse) == "corpseitem") i=1;
    oItemcorpse = GetNextItemInInventory(OBJECT_SELF);
    }
    if(i=0) DestroyObject(OBJECT_SELF);
}

Ну помоему стандартный скрипт на OnActivateItem
Neverwinter Script Source
void main()
{
    ExecuteScript(GetTag(GetItemActivated()), OBJECT_SELF);
}

Предмет трупак имеет свойство ыть использованным один раз скрипт называется в честь тега предмета а именно corpseitem
Neverwinter Script Source
void main()
{
//если не было рестарта, то происходит уже выше описанная процедура создания трупа, если был, ничего не происходит и труп просто исчезает, нужно бежать за нормальным
location lPlace = GetItemActivatedTargetLocation();
string sMaster = GetLocalString(GetItemActivated(), "master");
if (sMaster != "")
    {
    object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "blueprint032", lPlace);
    object oItemcorpse = CreateItemOnObject("item369", oCorpse, 1);
    SetLocalString(oCorpse, "master", sMaster);
    SetLocalString(oItemcorpse, "master", sMaster);
    }
}

Кусок райздеда(nw_s0_raisdead)
Neverwinter Script Source
object oTarget = GetSpellTargetObject();
    string sMaster = GetLocalString(oTarget, "master");
if ((sMaster != "")&& (GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE))
    {
    object oRaise = GetFirstPC();
    while(GetIsObjectValid(oRaise))
        {
        if(GetPCPlayerName(oRaise) == sMaster)
            {
            AssignCommand(oRaise, ActionJumpToLocation(GetLocation(oTarget)));
            DelayCommand(1.0, DestroyObject(oTarget));
            effect eDamage = EffectDamage(GetCurrentHitPoints(oRaise)-1);
            ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oRaise);
            }
          object oRaise = GetNextPC();
        }
    }

Кусок ресуректа(nw_s0_resserec)
Neverwinter Script Source
object oTarget = GetSpellTargetObject();
    string sMaster = GetLocalString(oTarget, "master");
if ((sMaster != "")&& (GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE))
    {
    object oRaise = GetFirstPC();
    while(GetIsObjectValid(oRaise))
        {
        if(GetPCPlayerName(oRaise) == sMaster)
            {
            AssignCommand(oRaise, ActionJumpToLocation(GetLocation(oTarget)));
            DelayCommand(1.0, DestroyObject(oTarget));
            }
          object oRaise = GetNextPC();
        }
    }


Вот собственно и все, надеюсь ничего не пропустил.
Не судите строго, не идеально, зато сам :D .

Сообщение отредактировал Batkom - Jul 19 2005, 04:00
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
dumbo
сообщение Jul 19 2005, 03:59
Сообщение #1397


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

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



Batkom, тут пока негде искать ошибки. советую таки не изобретать велосипед, а вопользоватся готовыми(которые, правда, порой оказываются инвалидными колясками): идешь сюда вводишь в поле title слово death и жмешь enter.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Batkom
сообщение Jul 19 2005, 04:03
Сообщение #1398


Level 4
**

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



сорри за то, что было сначала, теперь все полностью
Добавлено в [mergetime]1121767396[/mergetime]
тестинг показал, что при выходе из игры попутно выполняется скрипт выходаиз фуги....это не хорошо, можно ли сделать из него инклуд? (я правда никогда инклуды не делал)
Добавлено в [mergetime]1121773445[/mergetime]
игрок не воскрешается :unsure:
пишет, что ошибка скрипта реса, слишком много инструкций

Добавлено в [mergetime]1121777505[/mergetime]
не работают флажки, что не делай, игрок либо все время в фуге, либо все время живой при перезаходе и рестарте
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
zmey
сообщение Jul 21 2005, 11:01
Сообщение #1399


Level 4
**

Класс: Маг
Характер: Chaotic Evil
Раса: Дракон



Люди! Мне нужна такая хреновина: Например, с моим персом идет напарник. Мне надо, чтобы в определенном месте он остановился, и сказав типа "Я дальше не пойду" выбыл из компаниии уже НЕ ПРИСОЕДИНЯЛСЯ НИКОГДА.

и ещё: как сделать, чтобы непись после диалога ушёл В ДРУГУЮ ЛОКАЦИЮ, НЕ СМЕЖНУЮ С ИСХОДНОЙ?

......(я маг начинающий, в скриптах разбираюсь кое-как) заранее спасибо :crazy:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
-fenix-
сообщение Jul 21 2005, 12:07
Сообщение #1400


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

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



zmey, есть функция
Neverwinter Script Source
void RemoveHenchman(object oMaster, object oHenchman=OBJECT_SELF)

где
oMaster - это тот от кого уходит хенчмен
oHenchman - это хенчмен, каторый уходит

То, что ты хочешь можно сделать с помощью тригера и скрипта на нем проверяющего кто наступил. Рисуешь тригер и на ОнЭнтер ставишь скрипт
Neverwinter Script Source
void main()
{
object oMaster = GetEnteringObject();
object oHenchman = GetHenchman(oMaster);

if (GetIsPC (oMaster) && !GetLocalInt(OBJECT_SELF, "TRIGER") == 1)
  {
  AssignCommand(oHenchman, ActionSpeakString("Я дальше не пойду"));
  RemoveHenchman(oMaster, oHenchman);
  SetLocalInt(OBJECT_SELF, "TRIGER", 1);
  SetLocalInt(oHenchman, "TRUS", 1); // устанавливаем локалку, а на ветке   
  // диалога, где хенча можно обратно взять, ставим проверку на эту локалку
  }
}

QUOTE (zmey @ Jul 21 2005, 11:01)
как сделать, чтобы непись после диалога ушёл В ДРУГУЮ ЛОКАЦИЮ, НЕ СМЕЖНУЮ С ИСХОДНОЙ?

Вот функция

Neverwinter Script Source
void ActionMoveToLocation(location lDestination, int bRun=FALSE)
// location lDestination - задается сама локация, куда идти
// int bRun - собственно TRUE включает бег, FALSE отключает бег...

С помощью нее кидаешь непися куда хочешь.

Сообщение отредактировал -fenix- - Jul 21 2005, 12:26
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
zmey
сообщение Jul 21 2005, 12:25
Сообщение #1401


Level 4
**

Класс: Маг
Характер: Chaotic Evil
Раса: Дракон



fenix, спасибо!!! :crazy:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
BoB4ik
сообщение Jul 21 2005, 19:07
Сообщение #1402


Level 2
*

Класс: Обыватель
Характер: Chaotic Good
Раса: Человек



Ребята, мне очень нужен Trueseeing скрипт(чтобы допустим ставил вместо него еффект See Invisibility и +20 к споту),я сам скриптить не умею, искал в разных местах, не нашел, а без него, воры у меня на шарде практически не встречаются...
Помогите пожалуйста, буду благодарен.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Batkom
сообщение Jul 21 2005, 22:14
Сообщение #1403


Level 4
**

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



я например заменил трусы на заклинание превращения цели в слабое существо(корова, пингвин, крыса, курица), если не прокинет спас по воле. Имхо так интереснее.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 22 2005, 08:56
Сообщение #1404


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

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



BoB4ik ищи в модуле скрипт "nw_s0_truesee". Изменяем код:

Neverwinter Script Source
#include "x2_inc_spellhook"

void main()
{
    if (!X2PreSpellCastCode())
    {
        return;
    }

    //Declare major variables
    object oTarget = GetSpellTargetObject();
    effect eVis = EffectVisualEffect(VFX_DUR_MAGICAL_SIGHT);
    effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
//    effect eSight = EffectTrueSeeing();
//->
    effect eSight = EffectSeeInvisible();
//<-
    effect eLink = EffectLinkEffects(eVis, eSight);
    effect eSpot = EffectSkillIncrease(SKILL_SPOT, 20);
    eLink = EffectLinkEffects(eLink, eDur);
//->
    eLink = EffectLinkEffects(eLink, eSpot);
//<-
    //Fire cast spell at event for the specified target
//    SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_TRUE_SEEING, FALSE));
//->
    SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_SEE_INVISIBILITY, FALSE));
//<-
    int nDuration = GetCasterLevel(OBJECT_SELF);
    int nMetaMagic = GetMetaMagicFeat();

    //Enter Metamagic conditions
    if (nMetaMagic == METAMAGIC_EXTEND)
    {
        nDuration = nDuration * 2; //Duration is +100%
    }
    //Apply the VFX impact and effects
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, TurnsToSeconds(nDuration));
}

Стрелочками я указал, что добавил нового в скрипт. А воры почему не встречаются, просто незаметны? :D
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
BoB4ik
сообщение Jul 22 2005, 10:45
Сообщение #1405


Level 2
*

Класс: Обыватель
Характер: Chaotic Good
Раса: Человек



Спасибо Тебе, Зиррекс!
Сейчас исправлю:)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
DEM
сообщение Jul 24 2005, 20:06
Сообщение #1406


Level 7
**

Класс: Маг
Характер: Lawful Neutral
Раса: Эльф



Вот у меня вопрос... как сделать так, если монстр далеко убежал от определённой точки гоняясь за игроком, предположим на X футов, он вернёться назад.
Можно ли сделать, что бы НеПиСь давал квест на убийство монстра, а этот монстр появился бы в какой нибудь локации (наугад из трёх определённых)...
И как сделать что бу если у героя здоровье 0, он не погибал, а экран темнел и он оказывался в определённой локе (например больница), его вещи находились в определённом ящики и отнялось пару золотых...
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Jul 25 2005, 06:19
Сообщение #1407


Level 10
***

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



QUOTE (DEM @ Jul 24 2005, 20:06)
Вот у меня вопрос... как сделать так, если монстр далеко убежал от определённой точки гоняясь за игроком, предположим на X футов, он вернёться назад. Можно ли сделать, что бы НеПиСь давал квест на убийство монстра, а этот монстр появился бы в какой нибудь локации (наугад из трёх определённых)... И как сделать что бу если у героя здоровье 0, он не погибал, а экран темнел и он оказывался в определённой локе (например больница), его вещи находились в определённом ящики и отнялось пару золотых...

Угу... А еще напишите мне всю эту систему, и скажите что куда поставить чтоб все заработало.
Получая сразу все готовые скрипты - сложно будет научится скриптить. Даже исходя из //комментариев.
Скачай NWScripts Лексикон, чуть-чуть английского и все будет окей.

1.Про расстояние: Проверить расстояние до объекта можно функцией GetDistanceToObject. Между третьими объектами - GetDistanceBetween. Сделай проверку на расстояние до атакера (игрока). Или же окружи монстра триггером и при выходе за зону тригерра - очищай список действий(ClearAllActions), и отправляй его на вэйпоинт (ActionMoveToObject).

2. Чтобы монстр появлялся в разных точках.. Сделай три разных точки. Потом сделай Интегер равный случайному числу (Random(макс. значение)). И делай проверку... Если int равен 1 - монстра в первую точку(JumpToObject на монстра или же CreateObject на той самой точке), если 2, то во вторую итд.

3. Когда у игрока здоровье от 0 до -11 - идет скрипт OnPlayerDying - правь в свойствах модуля. Так же поправь там OnPlayerDeath - некоторые сильные монстры могут так звездануть что игрок скопытится мгновенно.

4. Вещи перебросить можно таким способом. Задаешь циклический алгоритм на перебирание вещей у игрока в инвентаре (в начале функции предмет из инвентаря = GetFirstItemInInventory). Затем - CopyItem в тот самый ящик, и DestroyObject этого предмета в инвентаре у самого игрока. В конце цикла предмент из инвентаря = GetNextItemInInventory.

5. Пару золотых убрать так TakeGoldFromCreature (Кол-во золота, Игрок).

Удачи... Почитай описание функций - разберешься!
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
DEM
сообщение Jul 25 2005, 09:57
Сообщение #1408


Level 7
**

Класс: Маг
Характер: Lawful Neutral
Раса: Эльф



Спасибо... я бы прочитал лексикон, да вот учил не английский :vava: :swoon: :this:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Jul 25 2005, 10:54
Сообщение #1409


Level 10
***

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



DEM Учи. Иначе будет тяжко в скриптинге. Да там англ. базовый на уровне 5го класса.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jul 26 2005, 20:01
Сообщение #1410


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

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



Привет всем. Запарился я тут с одной траблой... Есть книга Итем и есть книга плэйсебл. Я при выкладывании итема книги из инвентаря создаю плэйс на его месте. Так вот. Все работает и прочее. Но когда я выкладываю в сумке, все книги удаляются... Хоть 10 хоть 1. Никак контейнер не реагирует на мой код. Я знаю и таг его и ресреф... Видать это движковое что то. Как обмануть? Скрипт стоит на слоте модуля OnUnAcquireItem.

Neverwinter Script Source
#include "x2_inc_switches"
#include "am_inc_debug"
void main()
{
    object oItem = GetModuleItemLost(); // Сам Item объект
    object oPC = GetModuleItemLostBy(); // Тот кто выложил его
    object oItemBy =  GetItemPossessor(oItem); // Тот кому достается объект
    string sTagItem = GetTag(oItem); // Таг Item-a
    string sTagItemBy = GetTag(oItemBy); // Таг нового хозяина
    // -------------------------------------------------------------------------
    //
    // -------------------------------------------------------------------------
    if (GetStringLeft(sTagItem, 10) =="AM_IT_BOOK") // Первые 10 знаков тага книг
    {
        // ВОТ ТУТ БЫ ПРОВЕРКУ, ЧТО ТИПА ЕСЛИ КНИГА В КОНТЕЙНЕРЕ ТО return;
        location lLoc = GetLocation(oItem);
        if (!GetHasInventory(oItemBy)) // Если нет инвентаря туда, куда кладем
          {
            object oBook = CreateObject(OBJECT_TYPE_PLACEABLE, "am_plc_usedbook1", lLoc);
            // Присвоим стоку равную ResRef-у, что бы потом создать такую же книгу
            SetLocalString(oBook, "PUT_DOWN_BOOK", GetResRef(oItem));
            DestroyObject(oItem);
          }
    }
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 26 2005, 22:00
Сообщение #1411


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

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



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

Простое условие:
Neverwinter Script Source
if (GetBaseItemType(oItem) == BASE_ITEM_LARGEBOX) return;

не действует? Ведь в данном случае ты выкладываешь не книгу, а сумку, и она уже является объектом "oItem".
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jul 27 2005, 05:01
Сообщение #1412


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

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



Zirrex не работает :( я уже пробовал...
Neverwinter Script Source
if (GetBaseItemType(oItem) == BASE_ITEM_LARGEBOX) return;

К тому же если в инвентаре три книги, то скрипт запустится три раза. Где-то ответ должен быть... Не хотелось бы прятать от игрока сумки.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 27 2005, 09:31
Сообщение #1413


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

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



Aiwan, собственно, с какой стати, это же не цикл. У меня в модуле выкладывается тело из инвентаря, и при выкладывании тут же создается невидимый объект, куда тело и вкладывается. Лежит себе спокойно и не удаляется ничего. Правда, у меня условие, что если выкладываются такие-то тэги, то ничего с ними не делать. Но тут ведь первой выкладывается всегда сумка, почему этот скрипт берет в расчет вещи в ней, хм...

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

Забавно, одна только эта команда "!GetHasInventory" уже должна тормозить скрипт, но видимо она тормозит на сумке, но выполняется на остальных вещах. А если делать проверку на сумку не в самом скрипте, а снаружи?

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

Сообщение отредактировал Zirrex - Jul 27 2005, 09:33
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jul 27 2005, 14:15
Сообщение #1414


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

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



Zirrex , спасибо. Я уже сам разобрался. Короче работает это так:
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: OnItemUnAcquireScript  am_mod_unacquire
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
  OnItemUnAcquireScript
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 26.07.2005
//:://////////////////////////////////////////////
#include "x2_inc_switches"
#include "am_inc_debug"
void main()
{
    object oItem = GetModuleItemLost(); // Сам Item объект
    object oPC = GetModuleItemLostBy(); // Тот кто выложил его
    object oPossessor = GetItemPossessor(oItem); // Тот кому достается объект
    string sTagItem = GetTag(oItem); // Таг Item-a
    string sTagPossessor = GetTag(oPossessor); // Таг нового хозяина
    // -------------------------------------------------------------------------
    //
    // -------------------------------------------------------------------------
    if (GetStringLeft(sTagItem, 10) =="AM_IT_BOOK") // Первые 10 знаков тага книг
    {
    if (sTagPossessor == GetTag(GetArea(oItem)) ||
        GetObjectType(oPossessor) == OBJECT_TYPE_PLACEABLE)
        {
          return;
        }
          else
        {
          object oBook;
          location lLoc = GetLocation(oItem);
          oBook=CreateObject(OBJECT_TYPE_PLACEABLE, "am_plc_usedbook1", lLoc);
          // Присвоим строку равную ResRef-у, что бы потом создать такую же книгу
          SetLocalString(oBook, "PUT_DOWN_BOOK", GetResRef(oItem));
          DestroyObject(oItem);
        }
    }
}


Как работает этот код я не могу понять, так как определить объект которому принадлежат книги после того как онтейнер выложен НЕВОЗМОЖНО. Мож я туплю :xz: Но шкаф, получаемый книги дебагится, а объект кому отдаем книги кладя на землю сумку нет. Вот от этого и вся байда. Не знаю почему, но работает вот этот код... :crazy: два дня с утра до вечера я мучался :lol: :lol:

Neverwinter Script Source
if (sTagPossessor == GetTag(GetArea(oItem)) ||
        GetObjectType(oPossessor) == OBJECT_TYPE_PLACEABLE)
        {
          return;
        }

Добавлено в [mergetime]1122463094[/mergetime]
Итог: итем можно класть в ящики, сундуки и сумку на локу и просто. Если чисто сам итем кладешь на локу то он десторится и получается плейс. Ну а превратить обратно его в книгу-итем 5 секунд.
Добавлено в [mergetime]1122463375[/mergetime]
Странно, но при такой проверке ареа не пеленгуется как получатель итема... И при поклаже сумки не пеленгуется, но проверяется :D Мда.
Добавлено в [mergetime]1122467318[/mergetime]
Neverwinter Script Source
if (sTagPossessor == GetTag(GetArea(oItem)) ||
        GetObjectType(oPossessor) == OBJECT_TYPE_PLACEABLE ||
        GetObjectType(oPossessor) == OBJECT_TYPE_STORE ||
        GetIsAssociate(oPC, oPossessor))
        {
          return;
        }

Еще надо на магазин и хеньчей проверить... Теперь все пахаеть как часы.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
-fenix-
сообщение Jul 27 2005, 16:13
Сообщение #1415


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

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



У меня почемуто в кутсценке один NPC не хочет говорить фразы. Все действия совершает, а фраза над ним не появляется, однако она отображается в информационном окне(или как оно правельно называется). Пишу через DelayCommand-> AssignCommand-> SpeakString.
Над другими NPC фраза отображается, в чем тут дело?
Привести скрипт не могу, ибо пишу сценку на конкурс.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

147 страниц V  « < 55 56 57 58 59 > » 
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



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