backExamples

Xelagot action script

PaintBall Bot

This script manages a PaintBall game, and the bot needs to have Eject and Build rights. Read the instructions at the begining of the script to customise it.

To count the objects dropped by the bot when it ejects some-one and clear them, use the SkullCounter Bot.

You can download this script: click here

[Head]
Type=Script
Version=2.0

[Settings]
Origin=0.000n 0.000w 0.00a 0.0°
Run

[Script]

                         ###################################
                         #       The PaintBall Bot         #
                         #        a Xelagot script         #
                         # (c) 1999 Alex Grigny de Castro  #                       
                         ###################################

# This is a paintball bot
# which is trained to eject on left mouse click
# outside the GZ zone, within a certain range
# it will eject for 5 seconds
# but will not eject other bots, nor the Caretaker
# define in Sub Settings the safe zone (GZ)
# by entering the NW and SE coords of GZ
# and the other parameters as necessary
# if you wish it to put an object (e.g.) a skull
# where the victim was hit
# (in worlds without registry only, it must have Build rights)
# define the $Model, otherwise leave it blank

var $Error
var %Avatar, @Pos, @Center, @Seat, @LimitA, @LimitB
var @gz_NW, @gz_SE
var @InGZ, %InGZ
var %maxd
var &Hunter, &Victim, %Session
var ~mem, $Model
var $rules
var /t_Ejected

   ClearLists
   OnWorldReconnectEvent Reconnect
   $Error = ""
   Stop
   GetLocation @Pos
   Gosub Settings

   WarpLocal @Seat
   OnAvatarClickEvent Click1
   Say Ready to shoot...
   Stop
   RandomMove


Label MainLoop
   Goto MainLoop

Label End
   IfString $Error <> "" Say $Error
End

Sub Settings
   # bot's avatar
   %Avatar = 255
   # maximum shooting range in meters
   %maxd = 60
   Concat $rules "Rules: 1. not in GZ  2. target within " %maxd "m"
   # select a model for the bot to dump where he hits the victim
   # if $Model left blank, no object will be dumped
   # otherwise, define it as for example
   # $Model = "skull.rwx"
   $Model = ""
   GetModel ~mem $Model
   @Center = 0n 0w 0a 0
   # GZ WAR: North-West and South-East coordinates of GZ area
   @gz_NW = 2.050n 1.560w 0a 0
   @gz_SE = 0.950s 1.460e 0a 0
   # coords of where bot remains, and of area covered by bot
   @Seat = @Center
   @LimitA = 20n 20w 0a
   @LimitB = 20s 20e 0a
   # set Random motion parameters, and avatar
   RandomCentre @Seat
   RandomHRadius 10
   RandomHStep 2
   RandomHShift 20
   RandomHAngle 30
   RandomVHeight 3
   RandomVStep 1
   RandomWait 0
   Avatar %Avatar
EndSub

Event Click1
   # get ejector data
   GetSourcePerson &Hunter
   # get target (= victim) data
   GetTargetPerson &Victim
   # check source is in own area
   IfLoc &Hunter IsInSquare @LimitA @LimitB # carry on LOL
   Else EndEvent
   # Victim's session to check eject timeout
   GetSession %Session &Victim
   # if target <> bot, gosub...
   IfPerson &Victim IsNotBot Gosub CheckEject
EndEvent

Sub CheckEject
   # check if just ejected
   %t = 0
   TItemGetTimeout /t_Ejected %Session %t
   IfInt %t = 0 Goto CheckDistance
   EndSub   
Label CheckDistance
   # check distance
   Distance %d &Hunter &Victim
   IfInt %d <= %maxd Goto DistanceOK
   Gosub SayRules
   EndSub   
Label DistanceOK
   # check ejector is outside gz
   @InGZ = &Hunter
   %InGZ = -1
   Gosub DetermineInGZ
   %i = %InGz
   # check victim is out of GZ
   @InGZ = &Victim
   %InGZ = -1
   Gosub DetermineInGZ
   %j = %InGz
   IfInt %i = 0 IfInt %j = 0 Gosub Eject   
   Else Gosub SayRules
EndSub

Sub DetermineInGZ
   IfLoc @InGZ IsInSquare @gz_NW @gz_SE %InGZ = 1
   Else %InGZ = 0
EndSub

Sub SayRules
   Whisper &Hunter $rules
EndSub

Sub Eject
   Gosub ClearConfirmed
   wait 0
   # warp to target
   @v = &Victim
   LocTurn @v 180
   Stop
   #WarpLocal @v
   # warn target
   GetName $n &Hunter
   concat $a $n " ejects you!"
   Whisper &Victim $a
   # warn ejector
   GetName $v &Victim
   GetName $h &Hunter
   Concat $a "You ejected " $v
   Whisper &Hunter $a
   # eject 5 seconds
   Eject &Victim 5
   IfString $Model = "" Goto Eject_end
   TItemSet /t_Ejected %Session "" 5
   Concat $d $v " ejected by " $h
   GetDescription ~mem $d
   GetAction ~mem "create solid off"
   GetLocation ~mem &Victim
   ObjectAdd ~mem
Label Eject_end
   Stop
   RandomMove
EndSub

Event Reconnect
   # reload and run the script after disconnection
   Say Disconnected...
   Run
EndEvent

Sub ClearConfirmed
  ClearListAS
  ClearListAF
  ClearListDS
  ClearListDF
EndSub



backExamples