View Single Post
  #1  
Old 03-24-2009, 11:48 PM
xXziroXx xXziroXx is offline
Malorian
xXziroXx's Avatar
Join Date: May 2004
Posts: 5,289
xXziroXx has a brilliant futurexXziroXx has a brilliant futurexXziroXx has a brilliant futurexXziroXx has a brilliant futurexXziroXx has a brilliant futurexXziroXx has a brilliant futurexXziroXx has a brilliant future
Events System (Automated hosting included)

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 = "";
} 
__________________
Follow my work on social media post-Graal:Updated august 2025.

Last edited by xXziroXx; 03-25-2009 at 12:05 AM..
Reply With Quote