Gonar Patos@
Edad : 47 Puntos de Actividad : 5199
Cantidad de envíos : 19 Fecha de inscripción : 10/02/2011
Nº. de Miembro : 132 Respeto por el Foro :
| Tema: Sistema de descanso, muy completo, util y facil ... Jue 10 Feb 2011, 1:26 am | |
| Bueno aqui van mis scripts de descanso. En el evento OnPlayerRest del modulo, iria el siguiente script: - Código:
-
//:://///////////////////////////////////////////// //:: go_mod_def_rest //:: Copyright (c) 2011 Bioware Corp. //::////////////////////////////////////////////// /* Este es un sistema mas completo que el basico de bioware para descansos, tanto en modulos, como en servidores. Entre sus caracteristicas esta: 1.- No se puede descansar con armaduras de CA 2 o superior. Son muy rigidas. 2.- No se puede descansar si se tiene en la mano una antorcha, escudo o arma. 3.- Solo se puede descansar en zonas que se hallan definido como seguras. 4.- Deben de haber pasado 8 horas desde el ultimo descanso del personaje. 5.- No se puede descansar montado, esto es solo aplicable para el parche 1.69. 6.- Se recuperaran solo un punto de vida por nivel total del personaje, mas uno extra y siempre y cuando se complete todo el tiempo de descanso. 7.- No se recupera vida si se cancela el descanso. 8.- Efectos visuales cuando se duerme. */ //::////////////////////////////////////////////// //:: Creado por Gonar. //:: Creado el 07 de febrero del 2011. //:://////////////////////////////////////////////
// includes necesarios. #include "x2_inc_restsys" #include "x2_inc_switches" // El siguiente include solo debe de ponerse si se usa el parche 1.69, en caso contrario borrar las lineas 36 y 37. #include "x3_inc_horse" // Variable que recoge el momento actual. int HoraActual = GetTimeHour() + GetCalendarDay() * 24 + GetCalendarMonth() * 672 + GetCalendarYear() * 8064; void main() { // Declaracion de variables necesarias. object oPC = GetLastPCRested(); int HoraUltima = GetLocalInt(oPC, "Durmio"); effect eDormir, eSueno; int iNivel, iAntes, iActual, iDano; // Analizamos si lleva armadura puesta, si la lleva no podra descansar y lo notificamos. if(GetItemACValue(GetItemInSlot(INVENTORY_SLOT_CHEST, oPC)) >= 2) { AssignCommand(oPC, ClearAllActions(TRUE)); FloatingTextStringOnCreature("No puedes dormir con armaduras cuyo valor de CA sea superior a 1.", oPC, TRUE); return; } // Analizamos si porta algun objeto en la mano dercha o izquierda, si lleva algo no podra descansar y lo notificamos. else if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC)) || GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC))) { AssignCommand(oPC, ClearAllActions(TRUE)); FloatingTextStringOnCreature("No puedes dormir con escudo, antorcha o arma alguna en tus manos.", oPC, TRUE); return; } // Analizamos si esta en zona segura, si no lo esta no podra descansar y lo notificamos. else if(GetLocalInt(oPC, "LugarSeguro") != 1) { AssignCommand(oPC, ClearAllActions(TRUE)); FloatingTextStringOnCreature("Busca un lugar apropiado para dormir, esta zona no es segura.", oPC, TRUE); return; } // Analizamos si han pasado 8 horas desde el ultimo descanso, si no han pasado no podra descansar y lo notificamos. // El valor de hora para el ultimo descanso se guarda al dormir, y la primera vez como se vera despues, funciona mediante el evento // del modulo OnEnter. else if(HoraUltima >= HoraActual) { AssignCommand(oPC, ClearAllActions(TRUE)); FloatingTextStringOnCreature("No puedes dormir aun, han de pasar " + IntToString(HoraUltima - HoraActual) + " horas para que puedas descansar.", oPC, TRUE); return; } // Analizamos si esta montado, en caso afirmativo no podra descansar y lo notificamos. // Esto solo es aplicable con el parche 1.69, si no es el caso borrar desde la linea 77, hasta la linea 84. else if(HorseGetIsMounted(oPC)) { AssignCommand(oPC, ClearAllActions(TRUE)); FloatingTextStringOnCreature("No puedes descansar estando montado.", oPC, TRUE); return; } // Si todos los requisitos se cumplen, se inicia el descanso y ahora tendremos que valorar las tres opciones distintas de // descanso. Cuando empieza, cuando se cancela y cuando se acaba. if(GetLastRestEventType()==REST_EVENTTYPE_REST_STARTED) { // Esto se ejecutara cuando se inicie el descanso. Se aplicaran los efectos visuales y se guardara la vida poseida al // iniciar el descanso. eDormir = EffectVisualEffect(VFX_DUR_DARKNESS); eSueno = EffectVisualEffect(VFX_IMP_SLEEP); SetLocalInt(oPC, "VidaAntes", GetCurrentHitPoints(oPC)); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDormir, oPC); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSueno, oPC); } else if (GetLastRestEventType()==REST_EVENTTYPE_REST_CANCELLED) { // Esto se ejecutara cuando se cancele el descanso. Se anularan los efectos visuales, se cancelara la recuperacion de // vida, y se guardara la hora de inicio de descanso +2 horas. Como no se completo el descanso, no se aplican las 8 // horas entre descansos, pero se aplican 2 horas de penalizacion. eDormir = EffectVisualEffect(VFX_DUR_DARKNESS); eSueno = EffectVisualEffect(VFX_IMP_SLEEP); iAntes = GetLocalInt(oPC, "VidaAntes"); iActual = GetMaxHitPoints(oPC); iDano = (iActual - iAntes); RemoveEffect(oPC, eDormir); RemoveEffect(oPC, eSueno); SetLocalInt(oPC, "Durmio", HoraActual + 2); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(iDano), oPC); } else if (GetLastRestEventType()==REST_EVENTTYPE_REST_FINISHED) { // Esto se ejecutara cuando finalize un descanso completo. Se anularan los efectos visuales, se aplicara la recuperacion // de un punto de vida por nivel mas uno de bonificacion, se guardara la hora de inicio de descanso mas las 8 respectivas // de entre descansos. eDormir = EffectVisualEffect(VFX_DUR_DARKNESS); eSueno = EffectVisualEffect(VFX_IMP_SLEEP); iNivel = GetHitDice(oPC) + 1; iAntes = GetLocalInt(oPC, "VidaAntes"); iActual = GetMaxHitPoints(oPC); iDano = (iActual - iAntes) - iNivel; RemoveEffect(oPC, eDormir); RemoveEffect(oPC, eSueno); SetLocalInt(oPC, "Durmio", HoraActual + 8); // Debug necesario para si el calculo da negativos no le quite dano cuando no deberia. if(iDano <= 0) iDano = 0; // Fin del Debug. ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(iDano), oPC); } } Al evento OnClientEnter habria que añadir, el siguiente codigo: - Código:
-
SetLocalInt(oPC, "Durmio", (GetTimeHour() + (GetCalendarDay() * 24) + (GetCalendarMonth() * 672) + (GetCalendarYear() * 8064)) - 8); Para hacer zonas seguras concretas, se debería utilizar desencadenantes genericos dentro de un area y usar sus eventos OnEner y OnExit. Para hacer zonas seguras totales, es decir toda un area, se deberia de usar los eventos OnEnter y OnExit del area. En los eventos OnEnter, se debe de usar el siguiente script: - Código:
-
//:://///////////////////////////////////////////// //:: go_ent_area //:: Copyright (c) 2011 Bioware Corp. //::////////////////////////////////////////////// /* Designa un area entera o la zona que cubre un desencadenante como area segura. */ //::////////////////////////////////////////////// //:: Creado por Gonar. //:: Creado el 07 de febrero del 2011. //:://////////////////////////////////////////////
void main() { SetLocalInt(GetEnteringObject(), "LugarSeguro", 1); FloatingTextStringOnCreature("Estas en un area segura de descanso", GetEnteringObject()); } Y en el evento OnExit, se deberia de poner el siguiente script: - Código:
-
//:://///////////////////////////////////////////// //:: go_ext_area //:: Copyright (c) 2011 Bioware Corp. //::////////////////////////////////////////////// /* Estipula que se sale de un area segura de descanso, sea area o desencadenante. */ //::////////////////////////////////////////////// //:: Creado por Gonar. //:: Creado el 07 de febrero del 2011. //::////////////////////////////////////////////// void main() { SetLocalInt(GetEnteringObject(), "LugarSeguro", 0); FloatingTextStringOnCreature("Estas saliendo de un area segura de descanso", GetEnteringObject()); } El sistema es el que uso yo y lo he testeado, funciona correctamente, si no te va, mira haber que has echo mal. Si aun asi sigue sin funcionarte, planteame tus dudas aqui mismo. En el sistema no he añadido comidas, bebidas, etc ... por que ya existen bastantes requisitos, pero se podria ampliar a esto y complicar mucho mas. | |
|