Level 10
Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]
|
Ой, чето зачастил я со скриптами:) Но надеюсь пригодится :xz: Этот скрипт на отдых. Для начала разберемся с условиями отдыха:
1. У игрока должна быть кроватка(подстилка) aka бэдролл 2. Так же должна быть в наличие еда. 3. Расстояние от разведенного костра должно быть не более 3х метров. 4. Если игрок спит в тяжелых доспехах (более 20 lbs) то у него есть риск заболеть, вредно ведь для здоровьица геройского. Но спасы рулят;) А если не рулят то придется переодеваться в пижамку (гы-гы :D )
Чтобы развести костер надо: 1. Найти дрова (сами запихнете их в какое нить дупло и т.п.) 2. Разложить дрова на земле. 3. Пожечь факелом. 4. Костер горит 180 сек (можете сами регулировать) 5. Если вы используете выложенные дрвоа без факела - игрок их поднимает, если с факелом - разводит костер.
Теперь с предметами:
Item'ы: Подстилка - тэг [bedroll] Еда - тэг [food] Дрова - тэг [wood]
Placeable'ы: Костер - синька [camp] Подстилка (внешне выглядит как раскатаная из рулона ткань) - синька [place_bedroll] Дрова (внешне выглядит как куча дров aka woodpile :D) - синька [place_wood] .
P.S. Синька это Blueprint ResRef
Со всех плейсов снимите галочку Static! А плейс Дрова должен быть Используемый.
Поехали...
Скрипт ставится на OnPlayerRest
Neverwinter Script Source | ////////////////////////////////////////////////// ////////////Avaddon's Rest System////////// ////////// Script On Player Rest //////////// ////////// Date: 12.10.2004 /////////////// //////// Created by: Avaddon //////////// /////////////////////////////////////////////
#include "nw_i0_tool" void main() { object oPC = GetLastPCRested(); object oCamp = GetNearestObjectByTag("camp",oPC); object oBedroll = GetNearestObjectByTag("place_bedroll",oPC); effect eSleep = EffectVisualEffect(VFX_IMP_SLEEP); effect eBlind = EffectBlindness(); effect eDisease = EffectDisease(DISEASE_SOLDIER_SHAKES);
if (GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED) //отдых начат { if(GetIsObjectValid(oCamp)!=TRUE) //проверка расстоЯниЯ до костра { FloatingTextStringOnCreature("Здесь слишком холодно",oPC,FALSE); AssignCommand(oPC,ClearAllActions()); //отмена отдыха } else { if(GetDistanceBetween(oPC,oCamp)>3.0) { FloatingTextStringOnCreature("Здесь слишком холодно",oPC,FALSE); AssignCommand(oPC,ClearAllActions()); //отмена отдыха } else { if (HasItem(oPC,"bedroll")==TRUE) //проверка на наличие подстилки { if (HasItem(oPC,"food")==TRUE) //проверка на наличие еды { ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSleep,oPC,30.0); // Эффект Z-z-z FadeToBlack(oPC, FADE_SPEED_SLOW); //тушим свет CreateObject(OBJECT_TYPE_PLACEABLE,"place_bedroll",GetLocation(oPC)); // Расстилаем подстилку DestroyObject(GetItemPossessedBy(oPC,"food")); //съедаем еду DestroyObject(GetItemPossessedBy(oPC,"bedroll")); //забираем у игрока подстилку из инвентори (реализм, блин) SetLocalInt(oPC,"slept",1); //сон удачен } else { FloatingTextStringOnCreature("Не боитесь помереть во сне от голода?!",oPC,FALSE); AssignCommand(oPC,ClearAllActions()); } } else { FloatingTextStringOnCreature("Вам не на чем спать",oPC,FALSE); AssignCommand(oPC,ClearAllActions()); } } } } if (GetLastRestEventType() == REST_EVENTTYPE_REST_FINISHED) //отдых закончен { FadeFromBlack(oPC, FADE_SPEED_SLOW); //продираем глазки DestroyObject(oBedroll); //убираем подстилку SetLocalInt(oPC,"slept",0); //отдых удачно окончен CreateItemOnObject("bedroll", oPC,1); // отдаем игроку в инвентори его подстилку if (GetWeight(GetItemInSlot(INVENTORY_SLOT_CHEST,oPC))>20) // проверка на вес брони { ApplyEffectToObject(DURATION_TYPE_INSTANT,eDisease,oPC); //игрок заболел }
}
if (GetLastRestEventType() == REST_EVENTTYPE_REST_CANCELLED) //отдых прерван { if(GetLocalInt(oPC,"slept")==1) //если отдых был прерван после того как он был успешно начат { FadeFromBlack(oPC, FADE_SPEED_FAST); //быстро продираем глазки DestroyObject(oBedroll); //убираем подстилку FloatingTextStringOnCreature("Вы проснулись от сильного шума, но глаза еще не привыкли к свету.",oPC,FALSE); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSleep,oPC,10.0); //сонный игрок ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eBlind,oPC,10.0); //еще не проснулсЯ SetLocalInt(oPC,"slept",0); //успешный отдых прерван CreateItemOnObject("bedroll", oPC,1); // возвращаем в инвентори подстилку } }
} |
Скрипт ставится на UnAcquireItem
Neverwinter Script Source | ///////////////////////////////////////// //////////Avaddon's Rest System////////// ////// Script On UnAcquireItem ////////// //////// Date: 12.10.2004 /////////////// //////// Created by: Avaddon //////////// ///////////////////////////////////////// void main() { object oLost = GetModuleItemLost(); object oPC = GetModuleItemLostBy(); if (GetTag(oLost)=="wood") { CreateObject(OBJECT_TYPE_PLACEABLE,"place_wood",GetLocation(oPC)); //выкладываем плейс дров DestroyObject(oLost); //уничтожаем выложенны мешочек с итемом дров } } |
Скрипт ставится на On Used плейса дров
Neverwinter Script Source | ///////////////////////////////////////// //////////Avaddon's Rest System////////// ////// Script On Used Woodpile ////////// //////// Date: 12.10.2004 /////////////// //////// Created by: Avaddon //////////// ///////////////////////////////////////// #include "nw_i0_tool" void main() { object oPC = GetLastUsedBy();
if (GetIsPC(oPC)==TRUE) { if (GetTag(GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC))=="NW_IT_TORCH001") //проверка - есть ли факел в руке { AssignCommand(oPC,PlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,2.0)); CreateObject(OBJECT_TYPE_PLACEABLE,"camp",GetLocation(OBJECT_SELF),TRUE);// если есть - поджигаем костер DestroyObject(OBJECT_SELF); //убираем дрова } else { DestroyObject(OBJECT_SELF); CreateItemOnObject("wood",oPC,1); //если нет - игрок поднимает дрова } } } |
Скрипт ставится на On Heartbeat костра
Neverwinter Script Source | ///////////////////////////////////////// //////////Avaddon's Rest System////////// ////// Script On Heartbeat Campfire ///// //////// Date: 12.10.2004 /////////////// //////// Created by: Avaddon //////////// /////////////////////////////////////////
void main() { int iFire = GetLocalInt(OBJECT_SELF,"fire");
if (iFire<1) { SetLocalInt(OBJECT_SELF,"fire",6); } else { SetLocalInt(OBJECT_SELF,"fire",iFire+6); }
if (iFire>180) //проверка - прошло ли более 180 секунд { DeleteLocalInt(OBJECT_SELF,"fire"); DestroyObject(OBJECT_SELF); } } |
Эээ вроде ничего не напутал. Если что не получается - скажите, я поправлю.
Сообщение отредактировал Аваддон - Nov 13 2004, 16:51
|