Sistema de Tiempo Persistente:
En primer lugar tenemos que crear un objeto para el PJ que será el portador de algunas variables importantes, este no tiene que poder dejarse y es aconsejable que sea de trama, le daremos para este ejemplo la etiqueta "Varita".
Luego crearemos un script que nos servirá de librería, mas adelante utilizaremos algunos de sus subprogramas para hacerlo funcionar, de momento bastara con tenerlo creado, le daremos de nombre "00_libreria_00".
Script nombre: 00_libreria_00
//:://///////////////////////////////////////////// //:: Creado por: Rafa R.C. [Xiulito] //:: El Último Ángel Caído //:: Copyright (c) 2001 Bioware Corp. //::////////////////////////////////////////////// /* */ //::////////////////////////////////////////////// //:: Creado el: 29-Jun-2008 //:: Modificado el: //:: Modificado el: //::////////////////////////////////////////////// //----------------------------------------------------------------------------\\ // Sistema Persistente de Calendario \\ //----------------------------------------------------------------------------\\ //Poner este subprograma en el OnHeartbeat del Modulo. void HeartbeatCalendario() { SetCampaignInt("SPC_RRC", "RRC_Millisecond", GetTimeMillisecond(), GetModule()); SetCampaignInt("SPC_RRC", "RRC_Second", GetTimeSecond(), GetModule()); SetCampaignInt("SPC_RRC", "RRC_Minute", GetTimeMinute(), GetModule()); SetCampaignInt("SPC_RRC", "RRC_Hour", GetTimeHour(), GetModule()); SetCampaignInt("SPC_RRC", "RRC_Day", GetCalendarDay(), GetModule()); SetCampaignInt("SPC_RRC", "RRC_Month", GetCalendarMonth(), GetModule()); SetCampaignInt("SPC_RRC", "RRC_Year", GetCalendarYear(), GetModule()); } //Poner este subprograma en el OnLoadModule. void SetCalendario() { int iMillisecond = GetCampaignInt("SPC_RRC", "RRC_Millisecond", GetModule()); int iSecond = GetCampaignInt("SPC_RRC", "RRC_Second", GetModule()); int iMinute = GetCampaignInt("SPC_RRC", "RRC_Minute", GetModule()); int iHour = GetCampaignInt("SPC_RRC", "RRC_Hour", GetModule()); int iDay = GetCampaignInt("SPC_RRC", "RRC_Day", GetModule()); int iMonth = GetCampaignInt("SPC_RRC", "RRC_Month", GetModule()); int iYear = GetCampaignInt("SPC_RRC", "RRC_Year", GetModule()); SetCalendar(iYear, iMonth, iDay); SetTime(iHour, iMinute, iSecond, iMillisecond); } //Transforma el numero de mes en el nombre correspondiente. string MesEnLetras(int iMonth) { string sMonth; switch(iMonth) { case 1: sMonth="Enero"; break; case 2: sMonth="Febrero"; break; case 3: sMonth="Marzo"; break; case 4: sMonth="Abril"; break; case 5: sMonth="Mayo"; break; case 6: sMonth="Junio"; break; case 7: sMonth="Julio"; break; case 8: sMonth="Agosto"; break; case 9: sMonth="Septiembre"; break; case 10: sMonth="Octubre"; break; case 11: sMonth="Noviembre"; break; case 12: sMonth="Diciembre"; break; default: sMonth=IntToString(iMonth);break; } return sMonth; } //Da la fecha actual. string FechaActual() { int iDay = GetCalendarDay(); int iMonth = GetCalendarMonth(); string s0Day; if (iDay<10){s0Day="0";} string sFecha; string sDay = s0Day+IntToString(iDay); string sYear = IntToString(GetCalendarYear()); string sMonth = MesEnLetras(iMonth); sFecha = "Fecha Actual: "+sDay+"-"+sMonth+"-"+sYear; return sFecha; } //Da la hora actual. string HoraActual() { int iMinute = GetTimeMinute(); int iHour = GetTimeHour(); string s0Minute; string s0Hour; if (iMinute<10){s0Minute="0";} if (iHour<10){s0Hour="0";} string sHora; string sMinute = s0Minute+IntToString(iMinute); string sHour = s0Hour+IntToString (iHour); sHora = "Hora Actual: ["+sHour+":"+sMinute+"]"; return sHora; } //----------------------------------------------------------------------------\\ // Sistema de edad de Jugador \\ //----------------------------------------------------------------------------\\ //Objeto en el que almacenaremos las variables. object Varita(object oPC) { return GetItemPossessedBy(oPC, "Varita"); } //Le damos al PJ una fecha de nacimiento al azar. void SetNacimiento(object oPC) { object oVara = Varita(oPC); SetLocalInt(oVara, "EdadPC", GetAge(oPC)); SetLocalInt(oVara, "DayNacimiento", Random(28)+1); SetLocalInt(oVara, "MonthNacimiento", Random(12)+1); SetLocalInt(oVara, "YearNacimiento", GetCalendarYear()-GetAge(oPC)); } //Chekea si Cumple en este año, return TRUE si todavia no cumplio. int SiEnEsteYearCumple(object oPC) { object oVara = Varita(oPC); int iDayNacimiento = GetLocalInt(oVara, "DayNacimiento"); int iMonthNacimiento = GetLocalInt(oVara, "MonthNacimiento"); int iDayActual = GetCalendarDay(); int iMonthActual = GetCalendarMonth(); if (iMonthNacimiento>iMonthActual){return TRUE;} if (iMonthNacimiento==iMonthActual && iDayNacimiento>=iDayActual){return TRUE;} return FALSE; } //Da la fecha completa de Nacimiento. string GetNacimiento(object oPC) { object oVara = Varita(oPC); int iEdad = GetLocalInt(oVara, "EdadPC"); int iDay = GetLocalInt(oVara, "DayNacimiento"); int iMonth = GetLocalInt(oVara, "MonthNacimiento"); int iYear = GetLocalInt(oVara, "YearNacimiento"); string s0Day; if (iDay<10){s0Day="0";} string sFechaTotal; string sFechaEdad; string sFechaNacimiento; string sProxCumple; string sEdad = IntToString(iEdad); string sDay = s0Day+IntToString(iDay); string sYear = IntToString(iYear); string sMonth = MesEnLetras(iMonth); if (SiEnEsteYearCumple(oPC)) {sProxCumple = "Fecha Cumpleaños: "+sDay+"-"+sMonth+"-"+IntToString(GetCalendarYear());} else {sProxCumple = "Fecha Cumpleaños: "+sDay+"-"+sMonth+"-"+IntToString(GetCalendarYear()+1);} sFechaEdad = "Edad Jugador: "+sEdad+" años"; sFechaNacimiento = "Fecha de Nacimiento: "+sDay+"-"+sMonth+"-"+sYear; sFechaTotal = sFechaEdad+"\n"+sFechaNacimiento+"\n"+sProxCumple; return sFechaTotal; } //Suma los year atrasados por si no entra al modulo en mucho tiempo. void SumaYears(object oPC) { object oVara = Varita(oPC); int iEdadASumar; int iEdad = GetLocalInt(oVara, "EdadPC"); int iDay = GetLocalInt(oVara, "DayNacimiento"); int iMonth = GetLocalInt(oVara, "MonthNacimiento"); int iYear = GetLocalInt(oVara, "YearNacimiento"); int iComparaYears = iYear+iEdad; if (iComparaYears==GetCalendarYear())return; if (iComparaYears<GetCalendarYear() && iMonth<GetCalendarMonth()) {iEdadASumar=GetCalendarYear()-iComparaYears;} if (iComparaYears<GetCalendarYear() && iMonth==GetCalendarMonth() && iDay<=GetCalendarDay()) {iEdadASumar=GetCalendarYear()-iComparaYears;} SetLocalInt(oVara, "EdadPC", iEdad+iEdadASumar); } //void main(){}
Nota: todos los scripts a los que añadamos subprogramas tendrán que tener el siguiente include fuera del cuerpo principal.
#include "00_libreria_00"
Bien, empezaremos por el script que tienes en el OnLoadModule, si no tienes ninguno tendrás que crearlo y añadir esta línea:
SetCalendario();Lo que hará esto es coger las variables de la fecha y reajustarla a la que tiene almacenada, que serán las que dejo guardadas en la última sesión.
Luego tocaremos con mucho cuidado el script que tienes en el OnHeartbeat, que seria mucho mejor si de antemano no tuvieras ninguno, añadiremos esta línea:
HeartbeatCalendario();
El problema de esta línea es que almacena 6 variables de campaña de una sola tajada, así que crearemos un pequeño paquete antilag de regalo, lo que tienes que añadir en el OnHeartbeat quedaría así:
int iTiempoFuera = GetLocalInt(GetModule(), "TiempoFuera"); if (iTiempoFuera<15){SetLocalInt(GetModule(), "TiempoFuera", ++iTiempoFuera);return;} HeartbeatCalendario(); SetLocalInt(GetModule(), "TiempoFuera", 0);En el caso de que tengas ya un script en el OnHeartbeat deberas poner ese trozo en la parte mas baja del script, ya que tiene un return; que solo traspasa cada minuto y medio.
El subprograma:
SetNacimiento(oPC);Dará una fecha de nacimiento al azar a tu PJ, así que lo podrás poner cuando el jugador entre por primera vez al modulo y siempre y cuando tenga la Varita ya en su poder, el subprograma debería actuar solo una vez sobre el PJ, así que procura acordarte de poner las restricciones adecuadas.
El subprograma:
SumaYears(oPC);Recomendable poner en el OnClientEnter, es mas que nada para Jugadores sin mucho tiempo libre, estos que entran cada cuatro meses en el Server, rastreara su ultimo cumpleaños y le dará todas las felicitaciones de golpe o simplemente chekeara si el PJ que entro esta en su día de cumpleaños y le sumara un añito.
Los subprogrmas:
string GetNacimiento(object oPC) string FechaActual() string HoraActual()
Los podrás utilizar en cualquier sitio informativo como; conversaciones, mensajes a jugadores, tokens etc...
Los cree por que me eran de mucha utilidad, ya que así podría mantener informado al jugador, puedes utilizarlos por ejemplo con:
SendMessageToPC(oPC, GetNacimiento(oPC));
Por ultimo acuérdate poner en cada script que añadas todos estos subprogramas un include tipo: #include "00_libreria_00" o no podrás utilizarlos.
Un saludo.