Saltar al contenido

Más en DLAN: Nuestras Traducciones | Otras Traducciones | Mods y modding | Revisiones y Guías | Videojuegos | Arte | Literatura | Rol y Rol por foro e IRC | Mapa de la web
Foto

Sistema persistente de Calendario y edad...


  • Por favor, ingresa para responder
4 respuestas al tema

#1 Xiulito

Xiulito

    Neonato

  • Miembro
  • PipPip
  • 168 posts

Posteado 13 August 2008 - 12:36 PM

Hola, se me ocurrió la idea de crear un sistema de algo y como estaba aburrido pos salio esto, lo dejo por si le sirve a alguien.

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.
¿Saben cual es la diferencia entre un hombre inteligente y uno sabio?
Que el inteligente sabe lo que dice y el sabio sabe cuando decirlo.


#2 Immortality

Immortality

    The Captn, Almirante de la flota estelar.

  • Admin
  • 26562 posts

Posteado 13 August 2008 - 12:39 PM

Hala! ???

Muy buen post! Te parece bien si lo muevo a la seccion de tutoriales?? ???

Besos!
All Hail the lucky ones,
I refer to those in love, yeah.

Nasnoches, señoras y señores. Sepan que forman parte de la mejor comunidad online de la web : D


#3 Xiulito

Xiulito

    Neonato

  • Miembro
  • PipPip
  • 168 posts

Posteado 13 August 2008 - 12:53 PM

Perfecto Immortality, pero no hace mucho que lo cree y aunque de momento no encontré ningún bug de esos tan odiosos que siempre se nos escapan, lo puse por aquí para ver si con el uso de otros usuarios alguien por casualidad daba con alguno, vamos de momento parece ir bien, así que si quieres darle un poco de tiempo para que haga el rodaje no me importaría, gracias.

Saludos.
¿Saben cual es la diferencia entre un hombre inteligente y uno sabio?
Que el inteligente sabe lo que dice y el sabio sabe cuando decirlo.


#4 Ankhalas

Ankhalas

    Ancillae

  • Miembro DLAN
  • PipPipPip
  • 427 posts

Posteado 13 August 2008 - 04:43 PM

Yo tengo algo parecido, pero retocable por 2da, a mi ver más editable al público generaL. La cosa en cuestión es un .2da propio donde se meten ahí los días y meses, y es por ello que uno puede retocar al completo los tipos de años y días (véase si uno quiere montarse el calendario de Reinos Olvidados, o uno chino). El calendario este andaba como subsistema en las HCR, con UI que mostraba las horas del día y festividades concretas.

Otra cosa opcional era la de añadir eventos a determinadas fechas, como eso de la edad del jugador (se puede forzar su muerte a X años, darle penalizadores por edad, etc).

De todas formas, buen script, lo casero suele saber mejor ???
Si te caes siete veces, levántate ocho.

#5 adepto23

adepto23

    Humano

  • Miembro
  • Pip
  • 6 posts

Posteado 19 October 2011 - 11:30 AM

pero que grandes sois todos los de dlan, gracias xiulito




A Bragol. Tus amigos te echan de menos.