I don't think an awful lot of explanation is required, if you got questions, post them. Everything commented with // ** are comments specifically made for this thread, all other comments were there from when I scripted it.
Enjoy! If you like it, don't hesitate to +rep me
Database NPC named "Control-Events" (in my case anyways)
PHP Code:
function onInitialized() onCreated();
function onCreated()
{
onEndEvent();
// Prizes
// ** JUST AN EXAMPLE **
// { "arc", minQuantity, maxQuantity }
this.eventPrizes = {
{ "gold", 10, 100 },
{ "aurablade", 1, 1 },
{ "combatknife", 1, 1 },
{ "phasonblade", 1, 1 }
};
// ** HOW EVENTS ARE SETUP **
// Foot Race
this.(@"event_Foot Race").level = "event_footrace.nw";
this.(@"event_Foot Race").startx = 8;
this.(@"event_Foot Race").starty = 60.5;
this.(@"event_Foot Race").eventType = "Race";
// Cave Race
this.(@"event_Cave Race").level = "event_caverace.nw";
this.(@"event_Cave Race").startx = 47.5;
this.(@"event_Cave Race").starty = 53;
this.(@"event_Cave Race").eventType = "Race";
// CLEAN UP (DO NOT REMOVE)
temp.stringKeys = getStringKeys("this.event_");
for (temp.string: temp.stringKeys) {
if (temp.string in { "_", "_0", "", NULL }) {
this.(@"event_" @ temp.string) = "";
}
}
echo(getStringKeys("this.event_").size() SPC "events found!");
setTimer(5);
}
function onTimeOut()
{
// Is an event still running?
if (this.hostedEvent != NULL) {
setTimer(60);
return;
}
// Check for ET's on tag
for (temp.pl: allplayers) {
if (temp.pl.guild == "Events Team") {
temp.eventsTeam.add(temp.pl);
}
}
// Events Team member(s) on tag, aborting
if (temp.eventsTeam.size() != NULL) {
echo("[" @ name @ "]:" SPC temp.eventsTeam.size() SPC "Events Team member(s) online, aborting...");
setTimer(60);
return;
}
// No Events Team member(s) on tag, continuing
else {
echo("[" @ name @ "]: No Events Team member(s) found, proceeding...");
temp.event = randomString(getStringKeys("this.event_"));
temp.prizeInfo = randomString(this.eventPrizes);
temp.prize = temp.prizeInfo[0];
temp.quantity = int(random(temp.prizeInfo[1], temp.prizeInfo[2] + 1));
onHostEvent(temp.event, temp.prize, temp.quantity);
}
setTimer(getEventsTimer());
}
function getEventsTimer()
{
// Weed out RC's from player count
for (temp.pl: allplayers) {
if (temp.pl.level.name != NULL) {
temp.players.add(temp.pl);
}
}
temp.playerStages = {
{ 7, 5 },
{ 3, 10 },
{ 1, 15 }
};
for (temp.stage: temp.playerStages) {
if (temp.players.size() >= temp.stage[0]) {
echo("[" @ name @ "]: More than" SPC temp.stage[0] SPC "players online, setting timer to" SPC temp.stage[1] SPC "minutes.");
return temp.stage[1]*60;
}
}
echo("[" @ name @ "]: No players online, setting timer to 20 minutes.");
return 20*60;
}
public function getEvents()
{
return getStringKeys("this.event_");
}
function onHostEvent(event, prize, quantity)
{
if (this.hostedEvent != NULL) {
echo("[" @ name @ "] Error: Attempted to overwrite currently hosted event, aborting...");
return;
}
temp.eventData = new TStaticVar();
temp.eventData.copyFrom(this.(@"event_" @ event));
this.hostedEvent = { event, prize, quantity };
this.eventCalls = 1;
serverr.hostedEvent = { event, this.eventCalls, quantity, findNPC("ItemCache").getEntry(prize).itemName, temp.eventData.level, temp.eventData.startx, temp.eventData.starty };
scheduleEvent(20, "onNextCall", "");
}
function onNextCall()
{
if (this.eventCalls + 1 <= 3) {
this.eventCalls ++;
serverr.hostedEvent[1] = this.eventCalls;
scheduleEvent(20, "onNextCall", "");
} else scheduleEvent(10, "onCloseEvent", "");
}
function onCloseEvent()
{
temp.event = new TStaticVar();
temp.event.copyFrom(this.(@"event_" @ this.hostedEvent[0]));
for (temp.pl: allplayers) {
if (temp.pl.level.name == temp.event.level) {
temp.players.add(temp.pl);
}
}
if (temp.players.size() == NULL) {
echo("[" @ name @ "] Error: Event aborted due to no players attending!");
onEndEvent();
return;
}
this.eventCalls = NULL;
serverr.hostedEvent[1] = -1;
// ** USED TO START THE EVENT, IT TRIGGERS "onStartEvent" IN A NPC
// ** PLACED IN THE CURRENT EVENTS LEVEL, THAT HAS THIS IN IT:
// function onCreated() {
// level.startGate = this;
// }
findLevel(temp.event.level).startGate.trigger("StartEvent", "");
}
public function onEndEvent()
{
cancelevents("onEndEvent");
temp.event = new TStaticVar();
temp.event.copyFrom(this.(@"event_" @ this.hostedEvent[0]));
warpto(temp.event.level, temp.event.startx, temp.event.starty);
for (temp.pl: this.level.players) {
temp.pl.setLevel2("events_house.nw", 30.5, 30);
}
sendtorc("/updatelevel" SPC this.level.name);
// ** WARPS PLAYERS TO THE EVENTS HOUSE
warpto("events_house.nw", 30.5, 30);
this.hostedEvent = "";
serverr.hostedEvent = "";
}