ppmateos

29/09/2009 12:48:36

Tengo uno en mi módulo, pero sólo quiero que los personajes puedan dormir cada 8 horas en cualquier sitio, sin necesidad de objetos únicos ni nada parecido. Si no lo hacen en una posada que no recuperen toda la vida (algo así como en neverun) (y que en la posada pueda descansar ls veces que quiera sin necesidad de esperar las horas)

A ver si me puede echar alguien una manita :)

mviper

28/12/2009 23:24:59

Haber, se trata de 2 scripts, y dos modificaciones en el OnEnter y el OnExit (una en cada una), del area (o desencadenante) donde quieras que descansen tantas veces como deseen:

El primero va puesto en "Propiedades del Modulo -> Sucesos -> OnPlayerRest" e incluye la posibilidad de que el pj se quite yelmo, armas, botas y armaduras al dormir, auque por defecto lo he dejado desactivado.

[quote:2617e4c6b4]
#include "mo_tiempo001"

void main()
{
effect eBlind = EffectBlindness();//Preparamos el efecto de ceguera
effect eSnore = EffectVisualEffect(VFX_IMP_SLEEP);//Preparamos la visualizacion de las zetas

int iRestDelay = 8;//Marcamos las horas que han de pasar entre sueo y sueo
int iHostileRange = 10;//Distancia a la que no debe haber enemigos para poder dormir

object oPC = GetLastPCRested();//EL pj que se echo a dormir
object oHench = GetHenchman(oPC);//El compaero pnj

int iPv=GetCurrentHitPoints(oPC);//Guardamos los PV que tieen antes de dormir, para despues reducirle los puntos de vida si no durmio en posada


//Desequipamos los trastos para poder dormir (Opcional para activarlo borrar el /* de la linea 17 y el */ de la linea 28)

/* object oItem;

int iSlot=5;
while(iSlot>=0)
{
oItem=GetItemInSlot(iSlot,oPC);

if(iSlot==1&&GetArcaneSpellFailure(oPC)<=10)iSlot=1;
else AssignCommand(oPC,ActionUnequipItem(oItem));

iSlot-=1;
} */

//------Empieza el descanso-----
if (GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED)
{
if (GetHourTimeZero() < GetLocalInt (oPC, "i_TI_LastRest") + iRestDelay && GetLocalInt(oPC,"dormir001")!=1)//Comprobamos que paso el tiempo necesario y si esta en el area de descanso ignoramos el tiempo
{//Si no paso el tiempo.
AssignCommand (oPC, ClearAllActions());
SendMessageToPC (oPC, "Debes esperar " + IntToString (iRestDelay - (GetHourTimeZero() - GetLocalInt (oPC, "i_TI_LastRest"))) + " hora(s) antes de dormir otra vez.");
return;
}
else
{//Si puede dormir
object oCreature = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY);//Miramos la criatura enemiga mas cercana
if (iHostileRange == 0 || (iHostileRange != 0 && GetDistanceToObject(oCreature) <= IntToFloat(iHostileRange)))//Si no hay enemigos cerca
{
//Aplicando efectos visuales y sonoros de dormir
object oRestbedroll = CreateObject (OBJECT_TYPE_PLACEABLE, "plc_bedrolls", GetLocation (oPC), FALSE);//Creamos la cama
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSnore, oPC, 10.0);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBlind, oPC, 20.0);
DelayCommand(10.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSnore, oPC, 10.0));
SetLocalObject (oPC, "o_PL_Bedrollrest", oRestbedroll);
}
else
{//En caso de enemigos cerca
AssignCommand (oPC, ClearAllActions());
SendMessageToPC (oPC, "No puedes descansar, hay enemigos cerca.");
return;
}
}
}


// -----Termina el descanso-----
if ((GetLastRestEventType() == REST_EVENTTYPE_REST_FINISHED) && GetIsObjectValid(GetLocalObject (oPC, "o_PL_Bedrollrest")))
{//Borramos la cama y guardamos el pj
DestroyObject (GetLocalObject (oPC, "o_PL_Bedrollrest"), 0.0f);
DeleteLocalObject (oPC, "o_PL_Bedrollrest");
ExportSingleCharacter(oPC);// Se guarda el personaje
}

// -----Si es abortado-----
if ((GetLastRestEventType() == REST_EVENTTYPE_REST_CANCELLED) && GetIsObjectValid(GetLocalObject (oPC, "o_PL_Bedrollrest")))
{
DestroyObject (GetLocalObject (oPC, "o_PL_Bedrollrest"), 0.0f);
DeleteLocalObject (oPC, "o_PL_Bedrollrest");
ExportSingleCharacter(oPC);

SetLocalInt (oPC, "i_TI_LastRest", GetHourTimeZero());
return;
}

// -----Si el descanso a concluido sin problemas-----
if (GetLastRestEventType() == REST_EVENTTYPE_REST_FINISHED)
{
SetLocalInt (oPC, "i_TI_LastRest", GetHourTimeZero()); // Guardar la hora en que ha concluido el descanso
}

// -----Si no durmio en posada le ajustamos la vida, para que no la recupere entera ----
if (GetLocalInt(oPC,"dormir001")!=1)
{
if (iPv<=1) iPv=1;
else iPv= iPv/10; // Ajustamos la cantidad de vida que vamos a sustraerle dependiendo de la que hubiese perdido antes de dormir, para ello, solo ahce falta modificar el 10, cuanto mas alto, menos vida le quitamos.

effect ePv=EffectDamage(iPv,DAMAGE_TYPE_DIVINE,DAMAGE_POWER_NORMAL);
ApplyEffectToObject(DURATION_TYPE_INSTANT,ePv,oPC);
}
}
[/quote:2617e4c6b4]

El segundo, simplemente ponlo entre tus scripts, no necesita estar puesto en nigun lugar especifico, solo existir como script, y muy importante, llamarse: mo_tiempo001

O el primer script no podra encontrarlo, cuando lo necesite.

[quote:2617e4c6b4]
int GetHourTimeZero(int iYear = 99999, int iMonth = 99, int iDay = 99, int iHour = 99)
{
if (iYear > 30000)
iYear = GetCalendarYear();
if (iMonth > 12)
iMonth = GetCalendarMonth();
if (iDay > 28)
iDay = GetCalendarDay();
if (iHour > 23)
iHour = GetTimeHour();

int iHourTimeZero = (iYear)*12*28*24 + (iMonth-1)*28*24 + (iDay-1)*24 + iHour;
return iHourTimeZero;
}
[/quote:2617e4c6b4]

Como imaginaras, este script puede ser usado por todos los demas, para controlar sucesos que ocurran por el tiempo (regeneración de objetos, tiempos de descanso, tiempos de trabajo etc).

Y por ultimo, en el OnEnter del area (o desencadenante generico, si no quieres que pueda descansarse en todo el area, sino en las habitaciones, por ejemplo) dodne quieres que descansen debes incluir

object oPC=GetEnteringObject();
SetLocalInt(oPC,"dormir001",1);

Es importante que pongas "dormir001" para que el script de descanso, sea capaz de encontrar esa variable.

En el script OnExit del area (o desencadenante generico) donde quieres que descansen, debes incluir:

object oPC=GetEnteringObject();
DeleteLocalInt(oPC,"dormir001");

Por supuesto la linea "object oPC..." puede ser eliminada, si ya tenias un script donde se identifica al pj que entra o sale del area, pero recuerda ajustar entonces la llamada al personaje en las otras dos lineas.

Si tienes alguna duda... vere de responder, ahora que tengo un pcoo de tiempo estos dias...