Code: Select all
function main()
{
echo start!
declare players collection:player script
declare com comms script
while 1
{
com:pulse
wait 20
echo .............................
echo ${com.connected} connected players..
com:print
}
}
;atoms used for passing data using the relay commands
atom(global) update(string pname, int tid, int pid, int chp,int mmana, string ho, int mhp, int cmana, int cast, string comb)
{
if !${players.Element[${pname}](exists)}
{
players:Set[${pname}]
}
players.Element[${pname}]:update[${pname},${tid},${pid},${chp},${mmana},${ho},${mhp},${cmana},${cast},${comb}]
}
atom(global) removeme(string pname)
{
players:Erase[${pname}]
}
; comm objject
objectdef comms
{
variable string myHome = ${SettingXML[InnerSpace.XML].Set[Remote].GetString[Name].Escape}.${Session}
member:int connected()
{
variable int count = 0
if ${players.FirstKey(exists)}
{
count:Inc
while ${players.NextKey(exists)}
count:Inc
}
return ${count}
}
method pulse()
{
if ${players.FirstKey(exists)}
{
do
{
relay ${players.CurrentValue.host} update ${Me.Name} ${Target.ID} ${Me.ID} ${Me.CurrentHPs} ${Me.MaxMana} ${myHome} ${Me.MaxHPs} ${Me.CurrentMana} ${Me.Casting.ID} ${Me.Combat}
}
while ${players.NextKey(exists)}
}
}
method print()
{
if ${players.FirstKey(exists)}
{
do
{
echo Name:${players.CurrentValue.name} TargetID:${players.CurrentValue.target} playerid:${players.CurrentValue.playerid} currHP:${players.CurrentValue.currhp} MaxHp:${players.CurrentValue.maxhp} MaxMana:${players.CurrentValue.maxmana} CurrMana:${players.CurrentValue.currentmana} Casting:${Spell[${players.CurrentValue.casting}].Name} combat:${players.CurrentValue.combat}
}
while ${players.NextKey(exists)}
}
else
echo No Players connected!
}
method Initialize()
{
relay all squelch update ${Me.Name} ${Target.ID} ${Me.ID} ${Me.CurrentHPs} ${Me.MaxMana} ${myHome} ${Me.MaxHPs} ${Me.CurrentMana} ${Me.Casting.ID}
}
method Shutdown()
{
if ${players.FirstKey(exists)}
{
do
{
if ${Me.Name.NotEqual[${players.CurrentValue.name}]}
{
relay ${players.CurrentValue.host} removeme ${Me.Name}
echo Sending disconnect to ${players.CurrentValue.host}...
}
}
while ${players.NextKey(exists)}
}
}
}
;player object
objectdef player
{
variable string plname
variable string host
variable int targetid
variable int playerid
variable int currhp
variable int maxhp
variable int currmana
variable int maxmana
variable int casting
variable bool combat
method update(string pname, int tid, int pid, int chp,int mmana, string ho, int mhp, int cmana, int cast,string comb)
{
plname:Set[${pname}]
targetid:Set[${tid}]
playerid:Set[${pid}]
currhp:Set[${chp}]
maxmana:Set[${mmana}]
host:Set[${ho}]
maxhp:Set[${mhp}]
currmana:Set[${cmana}]
casting:Set[${cast}]
if ${comb.Equal[TRUE]}
combat:Set[TRUE]
else
combat:Set[FALSE]
}
member:int target()
{
return ${targetid}
}
member:int playerid()
{
return ${playerid}
}
member:int currhp()
{
return ${currhp}
}
member:int maxmana()
{
return ${maxmana}
}
member name()
{
return ${plname}
}
member host()
{
return ${host}
}
member:int currentmana()
{
return ${currmana}
}
member:int maxhp()
{
return ${maxhp}
}
member:int casting()
{
return ${casting}
}
member:int pcthp()
{
return ${Math.Calc[${currhp}/${maxhp}*100].Int}
}
member:int pctmana()
{
return ${Math.Calc[${currmana}/${maxmana}*100].Int}
}
member:bool combat()
{
return ${combat}
}
}
Im using a external players collection to hold the data (see main declaration) and the comms object is hardcoded to work against that. works for my little bot setup.
Mind the linewrap there is a few really long lines in the code.

