Riposo

Versione Completa   Stampa   Cerca   Utenti   Iscriviti     Condividi : FacebookTwitter
Pagine: [1], 2
faerdal
00venerdì 3 giugno 2005 17:00
Ma come funziona il rest in Nwn? Ho provato anche in single ed in pochissimo tempo (nemmeno un'ora) ho recuperato spell e HP.
Mi pare troppo facile cosi'....
Qualcuno ci capisce qualcosa?
Altair81
00venerdì 3 giugno 2005 17:58
Adesso provo a guardarci...
ckvans
00venerdì 3 giugno 2005 18:19
Re:

Scritto da: faerdal 03/06/2005 17.00
Ma come funziona il rest in Nwn? Ho provato anche in single ed in pochissimo tempo (nemmeno un'ora) ho recuperato spell e HP.
Mi pare troppo facile cosi'....
Qualcuno ci capisce qualcosa?



in effetti è abbastanza veloce la cosa... io per esempio riposo molto spesso durante il multy: quando finisco le magie riposo e nel giro di neppure 50sec sono di nuovo attivo!!
ckvans
00venerdì 3 giugno 2005 18:20
è anche vero però che se il riposo fosse più lungo, maghi e stregoni finirebbero immediatamente gli incantesimi e poi diventerebbero dei guierrieri superlofi!!!!!
faerdal
00venerdì 3 giugno 2005 19:03
Re:

Scritto da: ckvans 03/06/2005 18.20
è anche vero però che se il riposo fosse più lungo, maghi e stregoni finirebbero immediatamente gli incantesimi e poi diventerebbero dei guierrieri superlofi!!!!!


Va be', ma cosi' si snatura lo spirito del gioco... E' piu' bello dovere centellinare con cura gli incantesimi che non sapere di poterne lanciare a piacimento senza penalita' alcuna.
Altair81
00venerdì 3 giugno 2005 19:18
Ok fatto...
Ora si può dormire solo dalle 20 alle 6 ed ho inserito delle penalità ai px e ai soldi ogni volta che si muore...

Ciao
Altair81
00venerdì 3 giugno 2005 19:22
Dimenticavo: ho fatto lo script per le penalità in funzione del livello, cioè se si è sotto al 5° livello non persistono penalità...
Ciao
Kharzak
00venerdì 3 giugno 2005 19:40
Re:

Scritto da: Altair81 03/06/2005 19.22
Dimenticavo: ho fatto lo script per le penalità in funzione del livello, cioè se si è sotto al 5° livello non persistono penalità...
Ciao



Ecco, bravo.

Ciao
faerdal
00venerdì 3 giugno 2005 20:05
Re:

Scritto da: Altair81 03/06/2005 19.22
Dimenticavo: ho fatto lo script per le penalità in funzione del livello, cioè se si è sotto al 5° livello non persistono penalità...
Ciao


Ottimo
ckvans
00venerdì 3 giugno 2005 20:25
Re:

Scritto da: Altair81 03/06/2005 19.18
Ok fatto...
Ora si può dormire solo dalle 20 alle 6 ed ho inserito delle penalità ai px e ai soldi ogni volta che si muore...

Ciao



domanda:

1) come si fa a sapere che ore sono?

2) quanti minuti reali dura un'ora di gioco??
faerdal
00venerdì 3 giugno 2005 20:35
Re: Re:

Scritto da: ckvans 03/06/2005 20.25


domanda:

1) come si fa a sapere che ore sono?

2) quanti minuti reali dura un'ora di gioco??


Risposta alla 1: sposta il mouse sulla bussola in basso a destra...
Risposta alla 2: 10 minuti=1 ora nel tempo di gioco ma non sono sicuro... c'e' nel manuale comunque
Altair81
00venerdì 3 giugno 2005 20:35
L'ora di gioco appare se passi il mouse sopra la bussola in basso a destra(senza cliccare)...
Per quanto riguarda invece il tempo che ci vuole per far passare un'ora...bhe non lo so di preciso...
Ciao
Altair81
00venerdì 3 giugno 2005 20:38
Per vostra conoscenza posto il codice dei due script di cui vi parlavo prima:
Script Controllo Penalità PX e Oro :

// Il valore percentuale di penalità punti esperienza (default : 5%)
const float EXP_PENALTY = 2.0;
// Il valore percentuale di penalità monete d'oro (default : 10%)
const float GOLD_PENALTY = 5.0;
// La soglia di livelli di perdita minima di px (default : 0)
const int LEVEL_RANGE_IN_EXP_PENALTY = 5;

void main(){

object oDeadPC = GetLastPlayerDied();

int nCurrentXp = GetXP(oDeadPC);

float fPenalty = ((IntToFloat(nCurrentXp) / EXP_PENALTY) * 100.0);

int nNewXp = nCurrentXp - FloatToInt(fPenalty);

if(GetHitDice(oDeadPC) > LEVEL_RANGE_IN_EXP_PENALTY){

SetXP(oDeadPC,nNewXp);

//Messaggio al giocatore
FloatingTextStringOnCreature("Penalita' Punti Esperienza Applicata",oDeadPC,TRUE);
}

int nCurrentGold = GetGold(oDeadPC);

float fGoldPenalty = ((IntToFloat(nCurrentGold) / GOLD_PENALTY) * 100.0);
if(GetHitDice(oDeadPC) > LEVEL_RANGE_IN_EXP_PENALTY){
TakeGoldFromCreature(FloatToInt(fGoldPenalty),oDeadPC);
}

//Questa riga di codice esegue lo script standard di NWN,altrimenti il PG resterebbe a terra inerme
//Cancella o commenta questa riga,se hai altri handler per la morte.
ExecuteScript("x0_o0_death",OBJECT_SELF);
}



ed ecco invece il codice per la gestione del riposo limitato durante il gioco:


void main()
{
object pg = GetLastPCRested();
string no = " Non e' ancora notte non puoi riposare...dormiglione";
int evento = GetLastRestEventType();
if (evento==REST_EVENTTYPE_REST_STARTED)
{
if(GetTimeHour()<20 && GetTimeHour()>6)
{
FloatingTextStringOnCreature(no,pg,FALSE);
AssignCommand(pg,ClearAllActions());
}
else
{
effect Sleep = EffectVisualEffect(VFX_IMP_SLEEP, FALSE);
object Bed = CreateObject
(OBJECT_TYPE_PLACEABLE, "plc_bedrolls", GetLocati0n(pg), FALSE);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, Sleep, pg);
SetLocalObject(pg, "o_PL_BED", Bed);
DelayCommand(4.5, ApplyEffectToObject(DURATION_TYPE_PERMANENT, Sleep, pg));
DelayCommand(9.0, ApplyEffectToObject(DURATION_TYPE_PERMANENT, Sleep, pg));
DelayCommand(13.5, RemoveEffect(pg, Sleep));
}
}
if(evento == REST_EVENTTYPE_REST_CANCELLED)
{
effect Sleep = EffectVisualEffect(VFX_IMP_SLEEP, FALSE);
DelayCommand(0.0, RemoveEffect(pg, Sleep));
DestroyObject(GetLocalObject(pg, "o_PL_BED"), 0.0f);
DeleteLocalObject(pg, "o_PL_BED");
}
if(evento == REST_EVENTTYPE_REST_FINISHED)
{
DestroyObject(GetLocalObject(pg, "o_PL_BED"), 0.0f);
DeleteLocalObject(pg, "o_PL_BED");
}
}




Ciao

[Modificato da Altair81 03/06/2005 20.39]

ckvans
00venerdì 3 giugno 2005 20:40
cavolo!
sono veramente arrugginoso a livello di C!!!!!
faerdal
00venerdì 3 giugno 2005 20:52
Re:

Scritto da: Altair81 03/06/2005 20.38
...
if(GetTimeHour()<20 && GetTimeHour()>6)
....


Vedo che impedisci di riposare prima delle 20 e dopo le 6; mi pare un limite eccessivo, non esiste invece una funzione di sistema che verifica quanto tempo e' passato dall'ultimo riposo?
In questo modo diventa un po' piu' flessibile:

if((GetTimeHour()-GetLastRestHour()) < REST_INTERVAL)
... allora non si puo' dormire....

Con REST_INTERVAL indico una variabile che tu imposti, per esempio a 15 ore; con GetLastRestHour() indico la funzione di sistema che ritorna l'ora dell'ultimo sonnellino o una funzione custom che la memorizza in una variabile se non esistesse.

In una funzione custom dovresti ovviamente considerare anche le transizioni tra giorni; pero' permetterebbe una bella trovata: ad esempio, se sono passate piu' di 30 ore i PC potrebbero essere stanchi e avere una penalita' ad esempio sulla destrezza
Altair81
00venerdì 3 giugno 2005 20:55
Per questa sera provo con il codice originale poi domani ci penso a modificarlo...
Ciao
faerdal
00venerdì 3 giugno 2005 20:56
Re:

Scritto da: Altair81 03/06/2005 20.55
Per questa sera provo con il codice originale poi domani ci penso a modificarlo...
Ciao


Grande...
ckvans
00venerdì 3 giugno 2005 20:57
Re: Re:

Scritto da: faerdal 03/06/2005 20.52

Vedo che impedisci di riposare prima delle 20 e dopo le 6; mi pare un limite eccessivo, non esiste invece una funzione di sistema che verifica quanto tempo e' passato dall'ultimo riposo?
In questo modo diventa un po' piu' flessibile:

if((GetTimeHour()-GetLastRestHour()) < REST_INTERVAL)
... allora non si puo' dormire....

Con REST_INTERVAL indico una variabile che tu imposti, per esempio a 15 ore; con GetLastRestHour() indico la funzione di sistema che ritorna l'ora dell'ultimo sonnellino o una funzione custom che la memorizza in una variabile se non esistesse.

In una funzione custom dovresti ovviamente considerare anche le transizioni tra giorni; pero' permetterebbe una bella trovata: ad esempio, se sono passate piu' di 30 ore i PC potrebbero essere stanchi e avere una penalita' ad esempio sulla destrezza



sarebbe più realistico, ma mettere queste limitazioni trasformano il mio stregone in una spece di guerriero sfigato poiché finisco in fretta gli incantesimi e non duro poi nulla in battaglia... inoltre quando mi uccidono il famiglio ci metto una vita a poterlo richiamare nuovamente....
Altair81
00venerdì 3 giugno 2005 20:59
E' per questo che ho fatto il codice così, altrimenti per i maghetti è un casino...
Ciao
ckvans
00venerdì 3 giugno 2005 21:01
Re:

Scritto da: Altair81 03/06/2005 20.59
E' per questo che ho fatto il codice così, altrimenti per i maghetti è un casino...
Ciao



in che senso scusa?? proprio perché hai imposto le limitazioni sul riposo per maghi e stregoni E' un casino a mio avviso... sempre che, come al solito, non ho capito un cavolo e mi sta' sfuggendo qualcosa di ESTREMAMENTE importante....
Altair81
00venerdì 3 giugno 2005 21:03
in questo modo è assi più probabile che arrivi l'orario di riposo piuttosto che non con lo script di Faerdal...
In pratica se ti logghi e dormi con lo script di Faerdal dovrai aspettare 15 ore e passa, con il mio invece potrai farlo ancora fino alle 6 del mattino...
Ciao
faerdal
00sabato 4 giugno 2005 14:30
Re:

Scritto da: Altair81 03/06/2005 21.03
in questo modo è assi più probabile che arrivi l'orario di riposo piuttosto che non con lo script di Faerdal...
In pratica se ti logghi e dormi con lo script di Faerdal dovrai aspettare 15 ore e passa, con il mio invece potrai farlo ancora fino alle 6 del mattino...
Ciao


Comunque l'intervallo di attesa puo' essere configurato facilmente, si possono fare 3 ore invece di 15... anche se mi pare sempre troppo poco.
Scusatemi, ma io continuo a trovare poco credibile che uno possa fare un sonnellino a volonta' ogni mezzora....
faerdal
00sabato 4 giugno 2005 15:34
Re: Re:

Scritto da: faerdal 04/06/2005 14.30

Comunque l'intervallo di attesa puo' essere configurato facilmente, si possono fare 3 ore invece di 15... anche se mi pare sempre troppo poco.
Scusatemi, ma io continuo a trovare poco credibile che uno possa fare un sonnellino a volonta' ogni mezzora....


Altair, snasuplando tra gli script ho scoperto perche' il rest dura cosi' poco in multi: si causerebbe uno sfasamento temporale tra chi riposa e chi rimane sveglio. Cosi' hanno semplificato la cosa.

Si puo' comunque ovviare: ad esempio, si puo' permettere di avviare il riposo solo al party leader; inoltre, si puo' anche fare riposare il party tutte le volte che vuole, ma con una penalita' se piu' di una volta nell'arco delle 24 ore; ad esempio, al secondo riposo -10% XP, e cosi' via...

Verificare se un evento e' gia' successo nelle 24 ore e' facile:
imposta una variabile in questo modo
nVal = GetCalendarDay() + CalendarMonth()*100

sull'evento OnUse confronti se
nVal e' gia' uguale GetCalendarDay() + CalendarMonth()*100
Se si', l'evento ha avuto luogo, se no, no e si imposta la variabile

if (nVal = (GetCalendarDay() + CalendarMonth()*100))
{
/* gia' successo
allora incremento una variabile che memorizza il numero di volte
che si verifica */
++ncount;
}
else
{
// prima volta, imposto e azzero variabile di conteggio
nVal = (GetCalendarDay() + CalendarMonth()*100);
ncount=0;
}

Non so se funzioni ma suppongo di si', viene dai forum Bioware il suggerimento

[Modificato da faerdal 04/06/2005 15.36]

faerdal
00sabato 4 giugno 2005 15:43
Altair: script
Guarda cosa ho trovato sui forum. Ho evidenziato in grassetto cosa fanno i due script. Parliamo di single ovviamente, ma credo ci siano alcune utili info.
Specie la prima idea mi piace e credo sia adattabile al multi, sempre che l'evento OnPlayerRest del modulo si applichi a tutti i giocatori e non solo al leader.

NWScript:

/// /// /// /// /// /// /// /// /// /// /// /// /// ///
/// onplayerrest
/// by Gilgon Avalrock
///
/// This script goes in the OnPlayerRest event of the
/// module.
/// It will disallow players from resting unless they
/// are near a designated camp site.

/// /// /// /// /// /// /// /// /// /// /// /// /// ///
void CreateCampSite(object oPC){
object oCampSite = CreateObject(OBJECT_TYPE_PLACEABLE,"restcampfire",Locati0n(GetArea(oPC),GetPositi0n(oPC)+AngleToVector(GetFacing(oPC)),0.f));
DelayCommand(0.1f,SetPlaceableIlluminati0n(oCampSite, FALSE));
DelayCommand(0.2f,RecomputeStaticLighting(GetArea(oPC)));
}
void main()
{
object oPC = GetLastPCRested();
int eRestEvent = GetLastRestEventType();
object oCampSite;
float oDist;
//Change tags and/or add more checks for "free" rest areas
if(GetTag(GetArea(oPC))=="InsideTent" || GetTag(GetArea(oPC))=="InnRoom"){
//if you want them to bust out bedrolls or do something special, put it here
return;
}
//for areas that need campsites...
if(eRestEvent == REST_EVENTTYPE_REST_STARTED){
oCampSite=GetNearestObjectByTag("RestCampfire",oPC);
//must be within 5 feet of lit campfire
if(!GetIsObjectValid(oCampSite) || GetDistanceBetween(oPC,oCampSite) > 5.f){
//no campfire, check for invisable rest area
oCampSite=GetNearestObjectByTag("RestArea",oPC);
if(GetIsObjectValid(oCampSite) && GetDistanceBetween(oPC,oCampSite) <= 5.f){
//free rest area near invisible object
return;
}
//no close campsite
object oCampSiteKit=GetItemPossessedBy(oPC,"CampsiteKit");
if(GetIsObjectValid(oCampSiteKit)){
//player builds campsite
SendMessageToPC(oPC,"Preparing a camp site...");
AssignCommand(oPC,ClearAllActions());
AssignCommand(oPC,ActionPlayAnimati0n(ANIMATION_LOOPING_GET_LOW,1.0f,2.0f));
DelayCommand(1.0f,CreateCampSite(oPC));
DestroyObject(oCampSiteKit,1.0f);
}else{
//can't rest
SendMessageToPC(oPC,"You must rest near a camp site.");
AssignCommand(oPC,ClearAllActions());
}
}else if(!GetPlaceableIlluminati0n(oCampSite)){
//not lit...
SendMessageToPC(oPC,"You must light the campfire first.");
AssignCommand(oPC,ClearAllActions());
}else{
//rest
SetLocalObject(oPC,"Campsite",oCampSite);
}
}else if(eRestEvent == REST_EVENTTYPE_REST_FINISHED){
oCampSite=GetLocalObject(oPC,"Campsite");
//must be within 5 feet of fire
if(GetIsObjectValid(oCampSite) && GetDistanceBetween(oPC,oCampSite) <= 6.f){
DestroyObject(oCampSite);
}
}
}



Then the time restraint system

NWScript:

//:://////////////////////////////////////////////
//:: Name: Zimero's Limited Resting v1.2
//:: FileName: z_mod_onrest
//:://////////////////////////////////////////////
/*
What does it do?
The player must wait x hours between resting.
If the player(or someone else) cancels the rest
the waiting time is proportional to the amount of
time which passed before it was canceled.
For example, with the default setting, if the
player only rests 1/6 of the rest, he/she only has
to wait one hour, before he/she can rest again.
The formula for the resting time used:
0,5X + 10 (seconds) where x is the total level of the player.
How to use:
Assign this script to the onrest event of your module.
Thanks to the NWN Lexicon, it helped me alot!
*/
//:://////////////////////////////////////////////
//:: Created By: Jonas Boberg aka. zimero
//:: Created On: 20021212
//:: Modified On: 20030107
//:://////////////////////////////////////////////
//USER ADJUSTABLE VARIABLES
//the number of hours the players must wait between full rests
int TIMEBETWEENRESTING=6;
//do you want to display the time until next rest in real world minutes?
//(default: game hours)
int REALTIMEMINUTES=1;
//END USER ADJUSTABLE VARIABLES
int CurrentTime();
void main()
{
//initiate the variables
object oPC = GetLastPCRested();
int iCurrentTime, iLastRestTime, iTimeSinceRest, iTimeUntilRest;
float fTimePenalty;
switch (GetLastRestEventType())
{
case REST_EVENTTYPE_REST_STARTED:
//get the current time
iCurrentTime = CurrentTime();
//gets the last time the player rested
iLastRestTime = GetLocalInt(oPC,"REST_HOUR");
//the time (in hours) since the last rest
iTimeSinceRest = iCurrentTime-iLastRestTime;
//stores the second the player begins to rest
SetLocalInt(oPC, "REST_SECOND", GetTimeSecond());
//if the player has never rested before or if the
//necessary time has passed, allow the player to rest
if (iLastRestTime==0 || iTimeSinceRest >= TIMEBETWEENRESTING)
{
SetLocalInt(oPC, "REST_ALLOWED", TRUE);
}
//else display a message and cancel the rest
else
{
SetLocalInt(oPC, "REST_ALLOWED", FALSE);
//count the time until next rest
iTimeUntilRest = TIMEBETWEENRESTING-iTimeSinceRest;
//if the script is configured to display the time in
//real minutes, do that
if (REALTIMEMINUTES == 1)
{
iTimeUntilRest = FloatToInt(HoursToSeconds(iTimeUntilRest)/60);
//if there is just one minute to wait, change the message
//a bit
if (iTimeUntilRest == 1)
{
FloatingTextStringOnCreature("You must wait another" +
" minute before you can rest again", oPC);
}
else
{
FloatingTextStringOnCreature("You must wait another "+
IntToString(iTimeUntilRest)+
" minutes before you can rest again", oPC);
}
}
else
{
//if there is just one minute to wait, change the message
//a bit
if (iTimeUntilRest == 1)
{
FloatingTextStringOnCreature("You must wait another" +
" hour before you can rest again", oPC);
}
else
{
FloatingTextStringOnCreature("You must wait another "+
IntToString(iTimeUntilRest)+
" hours before you can rest again", oPC);
}
}
//cancel the rest
AssignCommand(oPC,ClearAllActions());
}
break;
case REST_EVENTTYPE_REST_CANCELLED:
//variable to check that the player was allowed to rest
if (GetLocalInt(oPC, "REST_ALLOWED") == TRUE)
{
//get the current second
iCurrentTime = GetTimeSecond();
//get the second the rest beginned
iLastRestTime = GetLocalInt(oPC, "REST_SECOND");
//the time (in seconds) the rest lasted
iTimeSinceRest = iCurrentTime - iLastRestTime;
//if the time is negative, add 60 to it
if (iTimeSinceRest<0) iTimeSinceRest+= 60;
//formula for the time which the player must wait
//until next rest
fTimePenalty = TIMEBETWEENRESTING*(iTimeSinceRest/(0.5*GetHitDice(oPC)+10));
//set the variable which controlles when the player may rest again
SetLocalInt(oPC,"REST_HOUR", CurrentTime()-(TIMEBETWEENRESTING-FloatToInt(fTimePenalty)));
}
break;
case REST_EVENTTYPE_REST_FINISHED:
//set the variable which controlles when the player may rest again
SetLocalInt(oPC, "REST_HOUR", CurrentTime());
}
}
int CurrentTime()
{
//converts current year, month, day and hour to hours
return GetCalendarYear()*8064 + GetCalendarMonth()*672 + GetCalendarDay()*24 + GetTimeHour();
}
Altair81
00sabato 4 giugno 2005 15:54
me li devo studiare un attimo perchè inserirli così non mi fido...
Comunque ottimo lavoro caro collega...
Che ne dici se la prossima volta il master lo fai tu???

Ciao
faerdal
00sabato 4 giugno 2005 16:03
Re:

Scritto da: Altair81 04/06/2005 15.54
me li devo studiare un attimo perchè inserirli così non mi fido...
Comunque ottimo lavoro caro collega...


Veramente, e' stato un lavoro di ricerca, come ho detto li ho trovati belli caldi sul forum bioware...
Assolutamente non usarli cosi' come sono!
Se comunque vai sul forum di scripting di NWN, trovi una marea di suggerimenti e soprattutto link a cose gia' create e testate.
Una ricerca sul forum con la funzione che ti interessa come stringa di ricerca produce miracoli.



Che ne dici se la prossima volta il master lo fai tu???

Ciao


Va bene, ma a Natale, sempre che il tempo a disposizione non si riduca ulteriormente....[SM=x349530] [SM=x349530] [SM=x349530]
Altair81
00sabato 4 giugno 2005 16:07
Altra raccolta che potremo fare cmq sono le sclamazioni più colorite che appaiono durante il gioco da parte di voi pg...
Ti giuro che ieri sera quando ha esclamato "Vaccona!!" sono quasi caduto a terra da ridere...e il bello è che non mi fermavo più...
Cosa ne dici?
ckvans
00sabato 4 giugno 2005 20:15
Re: Altair: script

Scritto da: faerdal 04/06/2005 15.43
Guarda cosa ho trovato sui forum. Ho evidenziato in grassetto cosa fanno i due script. Parliamo di single ovviamente, ma credo ci siano alcune utili info.
Specie la prima idea mi piace e credo sia adattabile al multi, sempre che l'evento OnPlayerRest del modulo si applichi a tutti i giocatori e non solo al leader.

NWScript:

/// /// /// /// /// /// /// /// /// /// /// /// /// ///
/// onplayerrest
/// by Gilgon Avalrock
///
/// This script goes in the OnPlayerRest event of the
/// module.
/// It will disallow players from resting unless they
/// are near a designated camp site.

/// /// /// /// /// /// /// /// /// /// /// /// /// ///
void CreateCampSite(object oPC){
object oCampSite = CreateObject(OBJECT_TYPE_PLACEABLE,"restcampfire",Locati0n(GetArea(oPC),GetPositi0n(oPC)+AngleToVector(GetFacing(oPC)),0.f));
DelayCommand(0.1f,SetPlaceableIlluminati0n(oCampSite, FALSE));
DelayCommand(0.2f,RecomputeStaticLighting(GetArea(oPC)));
}
void main()
{
object oPC = GetLastPCRested();
int eRestEvent = GetLastRestEventType();
object oCampSite;
float oDist;
//Change tags and/or add more checks for "free" rest areas
if(GetTag(GetArea(oPC))=="InsideTent" || GetTag(GetArea(oPC))=="InnRoom"){
//if you want them to bust out bedrolls or do something special, put it here
return;
}
//for areas that need campsites...
if(eRestEvent == REST_EVENTTYPE_REST_STARTED){
oCampSite=GetNearestObjectByTag("RestCampfire",oPC);
//must be within 5 feet of lit campfire
if(!GetIsObjectValid(oCampSite) || GetDistanceBetween(oPC,oCampSite) > 5.f){
//no campfire, check for invisable rest area
oCampSite=GetNearestObjectByTag("RestArea",oPC);
if(GetIsObjectValid(oCampSite) && GetDistanceBetween(oPC,oCampSite) <= 5.f){
//free rest area near invisible object
return;
}
//no close campsite
object oCampSiteKit=GetItemPossessedBy(oPC,"CampsiteKit");
if(GetIsObjectValid(oCampSiteKit)){
//player builds campsite
SendMessageToPC(oPC,"Preparing a camp site...");
AssignCommand(oPC,ClearAllActions());
AssignCommand(oPC,ActionPlayAnimati0n(ANIMATION_LOOPING_GET_LOW,1.0f,2.0f));
DelayCommand(1.0f,CreateCampSite(oPC));
DestroyObject(oCampSiteKit,1.0f);
}else{
//can't rest
SendMessageToPC(oPC,"You must rest near a camp site.");
AssignCommand(oPC,ClearAllActions());
}
}else if(!GetPlaceableIlluminati0n(oCampSite)){
//not lit...
SendMessageToPC(oPC,"You must light the campfire first.");
AssignCommand(oPC,ClearAllActions());
}else{
//rest
SetLocalObject(oPC,"Campsite",oCampSite);
}
}else if(eRestEvent == REST_EVENTTYPE_REST_FINISHED){
oCampSite=GetLocalObject(oPC,"Campsite");
//must be within 5 feet of fire
if(GetIsObjectValid(oCampSite) && GetDistanceBetween(oPC,oCampSite) <= 6.f){
DestroyObject(oCampSite);
}
}
}



Then the time restraint system

NWScript:

//:://////////////////////////////////////////////
//:: Name: Zimero's Limited Resting v1.2
//:: FileName: z_mod_onrest
//:://////////////////////////////////////////////
/*
What does it do?
The player must wait x hours between resting.
If the player(or someone else) cancels the rest
the waiting time is proportional to the amount of
time which passed before it was canceled.
For example, with the default setting, if the
player only rests 1/6 of the rest, he/she only has
to wait one hour, before he/she can rest again.
The formula for the resting time used:
0,5X + 10 (seconds) where x is the total level of the player.
How to use:
Assign this script to the onrest event of your module.
Thanks to the NWN Lexicon, it helped me alot!
*/
//:://////////////////////////////////////////////
//:: Created By: Jonas Boberg aka. zimero
//:: Created On: 20021212
//:: Modified On: 20030107
//:://////////////////////////////////////////////
//USER ADJUSTABLE VARIABLES
//the number of hours the players must wait between full rests
int TIMEBETWEENRESTING=6;
//do you want to display the time until next rest in real world minutes?
//(default: game hours)
int REALTIMEMINUTES=1;
//END USER ADJUSTABLE VARIABLES
int CurrentTime();
void main()
{
//initiate the variables
object oPC = GetLastPCRested();
int iCurrentTime, iLastRestTime, iTimeSinceRest, iTimeUntilRest;
float fTimePenalty;
switch (GetLastRestEventType())
{
case REST_EVENTTYPE_REST_STARTED:
//get the current time
iCurrentTime = CurrentTime();
//gets the last time the player rested
iLastRestTime = GetLocalInt(oPC,"REST_HOUR");
//the time (in hours) since the last rest
iTimeSinceRest = iCurrentTime-iLastRestTime;
//stores the second the player begins to rest
SetLocalInt(oPC, "REST_SECOND", GetTimeSecond());
//if the player has never rested before or if the
//necessary time has passed, allow the player to rest
if (iLastRestTime==0 || iTimeSinceRest >= TIMEBETWEENRESTING)
{
SetLocalInt(oPC, "REST_ALLOWED", TRUE);
}
//else display a message and cancel the rest
else
{
SetLocalInt(oPC, "REST_ALLOWED", FALSE);
//count the time until next rest
iTimeUntilRest = TIMEBETWEENRESTING-iTimeSinceRest;
//if the script is configured to display the time in
//real minutes, do that
if (REALTIMEMINUTES == 1)
{
iTimeUntilRest = FloatToInt(HoursToSeconds(iTimeUntilRest)/60);
//if there is just one minute to wait, change the message
//a bit
if (iTimeUntilRest == 1)
{
FloatingTextStringOnCreature("You must wait another" +
" minute before you can rest again", oPC);
}
else
{
FloatingTextStringOnCreature("You must wait another "+
IntToString(iTimeUntilRest)+
" minutes before you can rest again", oPC);
}
}
else
{
//if there is just one minute to wait, change the message
//a bit
if (iTimeUntilRest == 1)
{
FloatingTextStringOnCreature("You must wait another" +
" hour before you can rest again", oPC);
}
else
{
FloatingTextStringOnCreature("You must wait another "+
IntToString(iTimeUntilRest)+
" hours before you can rest again", oPC);
}
}
//cancel the rest
AssignCommand(oPC,ClearAllActions());
}
break;
case REST_EVENTTYPE_REST_CANCELLED:
//variable to check that the player was allowed to rest
if (GetLocalInt(oPC, "REST_ALLOWED") == TRUE)
{
//get the current second
iCurrentTime = GetTimeSecond();
//get the second the rest beginned
iLastRestTime = GetLocalInt(oPC, "REST_SECOND");
//the time (in seconds) the rest lasted
iTimeSinceRest = iCurrentTime - iLastRestTime;
//if the time is negative, add 60 to it
if (iTimeSinceRest<0) iTimeSinceRest+= 60;
//formula for the time which the player must wait
//until next rest
fTimePenalty = TIMEBETWEENRESTING*(iTimeSinceRest/(0.5*GetHitDice(oPC)+10));
//set the variable which controlles when the player may rest again
SetLocalInt(oPC,"REST_HOUR", CurrentTime()-(TIMEBETWEENRESTING-FloatToInt(fTimePenalty)));
}
break;
case REST_EVENTTYPE_REST_FINISHED:
//set the variable which controlles when the player may rest again
SetLocalInt(oPC, "REST_HOUR", CurrentTime());
}
}
int CurrentTime()
{
//converts current year, month, day and hour to hours
return GetCalendarYear()*8064 + GetCalendarMonth()*672 + GetCalendarDay()*24 + GetTimeHour();
}




Approvo in pieno l'utilizzo di uno o dell'altro script!! come già suggerito durante il gioco, si potrebbero creare solamente un paio di aree per ogni ambientazione, opportunamente segnalate con enomormi cartelli luminosi, ove solo lì sia possibile riposare... tali aree devono necessariamente essere libere da nemici altrimenti il riposo comunque non si fa!

per quanto riguarda imporre un intervallo di tempo tra un riposo ed il successivo, io proporrei un intervanno non inf. a 3 ore e non sup a 6
ckvans
00sabato 4 giugno 2005 20:16
script di limitazione del riposo
ma li avevi attivati? forse te l'ho già chiesto, ma a me è sembrato che non avessero per nulla funzionato...
Altair81
00sabato 4 giugno 2005 20:34
in effetti l'avevo provato in single palyer e funzionava...forse funzia solo con il capo gruppo...[SM=x349551] [SM=x349551]
Questa è la versione 'lo-fi' del Forum Per visualizzare la versione completa clicca qui
Tutti gli orari sono GMT+01:00. Adesso sono le 23:57.
Copyright © 2000-2024 FFZ srl - www.freeforumzone.com