// TMW2 Scripts
// Author:
// 4144
// Jesusalva
// Description:
// Arena for Duels and PVP (003-13,31,31)
003-10,26,60,0 script Arnea NPC_ELF_F,{
npctalk3 l("Hello!");
if (gettime(GETTIME_MONTH) == DECEMBER)
mes("It's December! The arena will close for new year, be warned!");
L_Menu:
mes "";
mesn;
mesq l("Welcome to the Arena. Select your action");
menu
l("Create new arena"), L_NewArena,
l("Join existing arena"), L_JoinArena,
rif(is_staff(), l("Debug Information")), L_Debug,
l("Information"), L_Info,
l("Leave"), L_Quit;
L_NewArena:
.@price=.price / max(1, reputation("Tulim"));
mes "";
mesn;
if (Zeny < .@price) {
mesq l("You need @@ GP to use this arena.", .@price);
goto L_Menu;
}
mesq l("Okay, which arena will you rent? Cost is @@ GP.", .@price);
menu
rif(Zeny > .@price, l("Rent arena")), -,
l("Give Up"), L_Quit;
mes "";
mesn;
mesq l("Please type a password for your Arena, it must be unique.");
input .@user_password$;
// Leaving blank will close
if (.@user_password$ == "")
close;
.@m = htget($@ARENAS, .@user_password$, -1);
if (.@m > 0) {
mes "";
mesn;
mesq l("Sorry, this password was already used on another arena.");
next;
/*
mesn;
mesq l("You'll need to think on a new password!");
next;
mesn;
mesq l("If you don't know what to use, try using the current date or something.");
next;
*/
mesn;
mesq l("Now, let's try again.");
next;
goto L_NewArena;
}
// XXX - Important Note - XXX
// map name MUST be only 4 chars long (eg. "abcd") on char instances
.@ID=.curinst;
.curinst+=1;
htput($@ARENAS, .@user_password$, .@ID);
.@MAP$="ARENA@"+str(.@ID);
// Create the arena
.@INSTID = instance_create("ARX@"+(.@ID), 0, IOT_NONE);
.@instanceMapName$ = instance_attachmap("003-13", .@INSTID, 0, .@MAP$);
instance_set_timeout(1800, 1800, .@INSTID);
instance_init(.@INSTID);
// You are only charged once arena is all set
Zeny=Zeny-.@price;
dispbottom l("Arena created, it can be used for 30 minutes.");
dispbottom l("Room password: @@", .@user_password$);
mes "";
mesn;
mes l("Arena created, it can be used for 30 minutes.");
mes l("Room password: @@", .@user_password$);
if (is_staff()) mes l("Inst @@ Map @@", .@INSTID, .@instanceMapName$);
next;
goto L_Menu;
L_JoinArena:
// FIXME
/*
warp "003-13", 31, 31;
close;
*/
mes "";
mesn;
mesq l("Okay, to join an arena, you need the unique password. Leave blank if you don't know.");
input .@user_password$;
.@m = htget($@ARENAS, .@user_password$, -1);
if (.@m > 0) {
/*
if(has_instance2("ARENA@"+.@m) >= 0) {
warp "ARENA@"+str(.@m), 31,31;
*/
if (.@m < .curinst-2000) {
// Delete the arena entry so this doesn't happens anymore
htput $@ARENAS, .@user_password$, 0;
// Explain this arena has expired
mes "";
mesn;
mesq l("Sorry, that arena is already closed.");
next;
mesn;
mesq l("All arenas stay open for only 30 minutes after being purchased.");
} else {
closeclientdialog;
// If the arena has expired, this will fail.
// But because dialog was closed, players won't notice anything.
// It won't have any visual effect, just like when you don't use a password.
// However, a debug message will be printed to console.
// If I start seeing spam of this debug message, I'll take appopriate
// measures, including and not limited to permanent ban, including IP ban.
warp "ARENA@"+.@m, 31, 31;
dispbottom l("Good luck!");
}
}
close;
L_Debug:
mes "npc name: " + .name$;
mes "npc ext name: " + .extname$;
mes "npc id: " + .id;
mes "npc parent id: " + .parent;
mes "npc src id: " + .srcId;
mes "char id 3: " + getcharid(3);
if (instance_id() >= 0)
mes "instance id: " + instance_id();
goto L_Menu;
L_Info:
mesn;
mesq lg("Hello darling.");
next;
mesq l("I am @@, and I take care of the Arena.", .name$);
next;
mesq l("Guards use it to spar against each other on friendly matches, to see who is stronger.");
next;
mesq l("We arranged a small underground room for that, because the Colliseum is too far away.");
next;
goto L_Menu;
L_Quit:
close;
OnInit:
.@npcId = getnpcid(.name$);
setunitdata(.@npcId, UDT_HEADTOP, DarkHelm);
setunitdata(.@npcId, UDT_HEADMIDDLE, CopperArmor);
setunitdata(.@npcId, UDT_HEADBOTTOM, JeansChaps);
setunitdata(.@npcId, UDT_WEAPON, RockKnife);
setunitdata(.@npcId, UDT_HAIRSTYLE, 14);
setunitdata(.@npcId, UDT_HAIRCOLOR, 18);
.sex = G_FEMALE;
.distance = 5;
//.alwaysVisible = true; // This is dumb, why Jesusalva put it here?
.price=1000;
.curinst=1001;
npcsit;
// create hashtable
$@ARENAS = htnew();
// Structure:
// Password, Instance Control ID
end;
// Every half hour, advance curinst in 1000.
// This way, we don't need to use/rely-on hasinstance2()
OnMinute30:
OnMinute60:
.curinst+=1000;
end;
// Protect bugs by disabling NPC on new year. This NPC have two days off for vacations B-)
OnDay1231:
OnDay0101:
disablenpc(.name$);
end;
OnDay0102:
enablenpc(.name$);
end;
}