Estimados, colegas muy buenas tardes recurro a ustedes para poder ajustar el siguiente NPC de "Auto Event" a un emulador Rathena Actualizado, con una versión de cliente 2018 PRE-Renewal, en la siguiente versión posteada e logrado corregir algunos errores como por ejemplo:
Se realizo la traducción de alguno textos a español, según se realiza pruebas de los eventos (la codificación del archivo es ANSI)
Cambie los Item de premio por x100 Poring Coin y 1M de zeny.
Comente el "Evento Shops" ya no se justificaba en mi servidor.
Algunas correcciones de mapas.
Solucionar problema de la función "dispell"
Se realiza correcciones de consultas query_sql en el evento "Devil Square"
Se modifico el mod del evento "Zombie Survival" ya que al ser PRE-Renewal no existía al ID
Se comentaron líneas de ítems que no existen en PRE-Renewal
Pero aun no logro corregir algunos errores y es por eso que recurro a ustedes, para que me puedan ayudar
El evento de Emp Breaker manda un error después de agregar la instancia, anuncia al ganador pero no genera el precio
[Info]: [Instance] Created map '0282#000003' (921) from 'sword_1-1' (282).
[Error]: status_calc_mob: No castle set at map 0282#000003
//===== Comments: ============================================
//= [Stolao]
// Instance.yml
// - Id: 44
// Name: Emp Breaker
// TimeLimit: 900
// Enter:
// Map: sword_1-1
// X: 215
// Y: 206
//==================================
OnEmpStart: //-- Emperium Event
//==================================
$@CurrentEvent = 1;
waitingroom "Emperium Event",99;
Func_Countdown;
$@CurrentEvent = -1;
$@BestTime = 2000000000;
$@BestCid = 0;
getwaitingroomusers strnpcinfo(3);
if(.@waitingroom_usercount >= .MinPlayers[1]){
freeloop(1);
for(.@i = 0; .@i < .@waitingroom_usercount; .@i++){
attachrid(.@waitingroom_users[.@i]);
callfunc("dispell");
if(instance_id(IM_CHAR))
instance_destroy(IM_CHAR);
instance_create("Emp Breaker",IM_CHAR);
instance_enter("Emp Breaker",215,206,getcharid(0),instance_id(IM_CHAR));
}
freeloop(0);
delwaitingroom;
if(.TestMode)
sleep 60000;
else
sleep 10000;
} else {
delwaitingroom;
announce .EventName$[1]+" ¡Detenido! No hay suficientes jugadores que se unieron al "+.EventName$[1]+"!",bc_blue|bc_area|bc_npc;
}
if($@BestCid)
Func_Prizes($@BestCid,.EventName$[1]);
$@CurrentEvent = 0;
end;
//==================================
//-- Emperium Event Extras
//==================================
sword_1-1,216,208,4 script Emp_Break -1,{
OnBreak:
stopnpctimer;
.@Time = getnpctimer(0);
.@m = .@Time / 60000;
.@s = (.@Time - .@m * 60000) / 1000;
.@ms = .@Time % 1000;
if(.@Time < BestTime || !BestTime)
BestTime = .@Time;
if(.@Time < $@BestTime){
$@BestTime = .@Time;
$@BestCid = getcharid(0);
announce "[Emperium Event]: "+strcharinfo(0)+" now holds the top time of "+((.@m)?callfunc("F_InsertPlural",.@i,"minute")+" ":"")+""+((.@s)?.@s+""+((.@ms)?"."+.@ms:"")+" seconds":"")+".",bc_all|bc_blue;
}
mapannounce 'Map$,"You have a "+((.@Time == BestTime)?"new personal best ":"")+"time of "+((.@m)?callfunc("F_InsertPlural",.@i,"minute")+" ":"")+""+((.@s)?.@s+""+((.@ms)?"."+.@ms:"")+" seconds":"")+".",bc_area|bc_blue;
sleep2 2500;
instance_destroy;
end;
OnInstanceInit:
initnpctimer;
stopnpctimer;
setnpctimer 0,strnpcinfo(3);
'Map$ = strnpcinfo(4);
monster 'Map$,223,206,"Emperium",1288,1,strnpcinfo(3)+"::OnBreak";
'GID = $@mobid;
setunitdata 'GID,UMOB_DMGIMMUNE,1;
sleep 2000;
mapannounce 'Map$,"[Emperium Event]: Goal is simple, kill the Emperium as fast as you can~",bc_map|bc_blue;
sleep 1000;
mapannounce 'Map$,"[Emperium Event]: Once Countdown is done have at it.",bc_map|bc_blue;
sleep 2000;
mapannounce 'Map$,"5",bc_map|bc_blue;
sleep 1000;
mapannounce 'Map$,"4",bc_map|bc_blue;
sleep 1000;
mapannounce 'Map$,"3",bc_map|bc_blue;
sleep 1000;
mapannounce 'Map$,"2",bc_map|bc_blue;
sleep 1000;
mapannounce 'Map$,"1",bc_map|bc_blue;
sleep 1000;
mapannounce 'Map$,"Go~",bc_map|bc_blue;
startnpctimer strnpcinfo(3);
setunitdata 'GID,UMOB_DMGIMMUNE,0;
end;
}
El Evento "Poring Event" no warpea al jugador a prontera, después de matar al poring correcto, pero si termina el evento de forma correcta al matar al segundo poring.
[Error]: buildin_warp: fatal error ! player not attached!
[Debug]: Function: warp (3 parameters):
[Debug]: Data: string value="prontera"
[Debug]: Data: number value=155
[Debug]: Data: number value=172
//==================================
OnPoringStart: //-- Poring Event
//==================================
killmonsterall .EnterMap$[6];
mapwarp .EnterMap$[6],"prontera",155,172;
$@CurrentEvent = 6;
pvpoff .EnterMap$[6];
for ( .@i = 0; .@i < getarraysize( .bombflag ); .@i++ )
setmapflag .EnterMap$[6], .bombflag[.@i];
Func_Countdown;
$@CurrentEvent = -6;
if(getmapusers(.EnterMap$[6]) < .MinPlayers[6]){
mapannounce .EnterMap$[6],"¡Evento detenido! No hay suficientes jugadores que se unieron a "+.EventName$[6]+"!",bc_blue;
} else {
killmonsterall .EnterMap$[6];
mapannounce .EnterMap$[6],"Las reglas son simples",bc_blue;
sleep 3000;
mapannounce .EnterMap$[6],"Mata al 'Poring' con el nombre correcto y regresaras a Prontera con tu premio.",bc_blue;
sleep 4000;
mapannounce .EnterMap$[6],"Mata al equivocado y vete a Prontera sin nada.",bc_blue;
sleep 4000;
mapannounce .EnterMap$[6],"Hay 2 'Poring' correctos y un temporizador de 30 minutos.",bc_blue;
sleep 4000;
mapannounce .EnterMap$[6],"El evento comienza ahora~",bc_blue;
for(.@i = 0; .@i < getarraysize(.Poring$); .@i++)
monster .EnterMap$[6],0,0,.Poring$[.@i],1725,5,strnpcinfo(3)+"::OnKillWrong";
monster .EnterMap$[6],0,0,"--ja--",1725,.PoringSpawn,strnpcinfo(3)+"::OnKillRight";
.PoringSpawn = 2;
for(.@poring = 30; .@poring > 0; .@poring--){
if(getmapusers(.EnterMap$[6]) < 1)
.@poring = 0;
mapannounce .EnterMap$[6],callfunc("F_InsertPlural",.@poring,"Minuto")+" Restantes.",bc_blue;
sleep 60000;
}
}
mapannounce .EnterMap$[6],"El tiempo ha terminado",bc_blue;
killmonsterall .EnterMap$[6];
for ( .@i = 6; .@i < getarraysize( .bombflag ); .@i++ )
removemapflag .EnterMap$[6], .bombflag[.@i];
$@CurrentEvent = 0;
sleep 5000;
mapwarp .EnterMap$[6],"prontera",155,172;
end;
OnKillWrong:
monster .EnterMap$[6],0,0,.Poring$[rand(1,getarraysize($@Mobs))],1725,1,strnpcinfo(3)+"::OnKillWrong";
warp "prontera",155,172;
end;
OnKillRight:
Func_Prizes(getcharid(0),.EventName$[6]);
.PoringSpawn -= 1;
if(.PoringSpawn < 1){
mapannounce .EnterMap$[6],"El tiempo ha terminado",bc_blue;
killmonsterall .EnterMap$[6];
for ( .@i = 6; .@i < getarraysize( .bombflag ); .@i++ )
removemapflag .EnterMap$[6], .bombflag[.@i];
$@CurrentEvent = 0;
sleep 5000;
mapwarp .EnterMap$[6],"prontera",155,172;
end;
}
warp "prontera",155,172;
end;
El emulador buega el símbolo "¡" al tratar de crear el mail de premio, trate de modificar la codificación de la base de datos, pero la solución fue omitir el símbolo
[SQL]: DB error - Incorrect string value: '\xA1Felic...' for column `rohispano_main`.`mail`.`message` at row 1
//==================================
//-- Reward Function
//==================================
function script Func_Prizes {
announce "Felicidades a "+strcharinfo(0,getarg(0))+", ganador del evento "+getarg(1)+", revisa tu correo para ver tu recompensa.",bc_all|bc_blue;
if(!getattachedrid())
attachrid(getcharid(3,strcharinfo(0,getarg(0))),1);
WonEvents++;
MWonEvents++;
if($@Mail){
mail getarg(0), "no-reply", getarg(1), "Felicitaciones!% Has ganado el evento "+getarg(1)+" % % % [ Se adjunta tu recompensa. ]", $@RewardZeny, $@RewardID, $@RewardQNT;
sleep 2000;
query_sql("UPDATE `mail` SET message = REPLACE(`message`,'%',CHAR(13)) WHERE send_name = 'no-reply'");
} else {
getitem $@RewardID,$@RewardQNT;
zeny += $@RewardZeny;
}
return;
}
desde ya cualquier ayuda es bienvenida, también adjunto el avance del script por si lo quieren utilizar
Auto_Event_2022.txt