Vice City Multiplayer
VC:MP 0.3 => mIRC/pawn Scripting => Topic started by: Falcon on September 30, 2007, 03:40:39 pm
-
Location script using hash table instead of ini file.
Create and load hash table
!hmake -s area 2000
if ($exists(vcmp.area.txt)) { !hload area vcmp.area.txt }
Set max locations
var %a = 1
while ($hget(area,%a) != $null) {
!inc %a
}
set %max_loc %a
Get Players Locations
alias vcmp.area {
var %a = 1,%b = $hget(vcmp,pos.x. $+ $1),%c = $hget(vcmp,pos.y. $+ $1),%d
while (%a < %max_loc) {
%d = $hget(area,%a)
if ($inpoly(%b,%c, [ %d ] )) !return $hget(area,%a $+ .)
!inc %a
}
Convert old ini to hash
alias convert {
!hmake -s area 2000
var %a,%b = 1,%c
%a = AREA2
while (%b <= $ini(vcmp.data.ini,%a,0)) {
%c = $ini(vcmp.data.ini,%a,%b)
!hadd area %b %c
!hadd area %b $+ . $readini(vcmp.data.ini,%a,%c)
!inc %b
}
!hsave area vcmp.area.txt
}
Hope this is useful for some of you guys.
Falcon
-
nice work! 8)
-
nice script :D
But how about that table size? I'm not an expert of hash tables, but isn't 2000 quite big size for a location table? couldn't a table of that size contain few million entries...?
-
falcon rocks, of course. i love this! i will be adding it to the mirc echo i have been working on. im pretty impressed with the performance difference hash makes over ini.
a quick note about this code:
just incase you cut and pasted this code only to find your script buggin, this bit:
Get Players Locations
alias vcmp.area {
var %a = 1,%b = $hget(vcmp,pos.x. $+ $1),%c = $hget(vcmp,pos.y. $+ $1),%d
while (%a < %max_loc) {
%d = $hget(area,%a)
if ($inpoly(%b,%c, [ %d ] )) !return $hget(area,%a $+ .)
!inc %a
}
was missing a } at the end to close the alias. it should be this:
alias vcmp.area {
var %a = 1,%b = $hget(vcmp,pos.x. $+ $1),%c = $hget(vcmp,pos.y. $+ $1),%d
while (%a < %max_loc) {
%d = $hget(area,%a)
if ($inpoly(%b,%c, [ %d ] )) !return $hget(area,%a $+ .)
!inc %a
}
}
-
here is my adaptation of falcons above code(only slightly different):
convert your vcmp.data.ini locations to a hash table and save it
alias convert {
!hmake -s areatemp 500
var %b = 1, %c
while (%b <= $ini(vcmp.data.ini,AREA2,0)) {
%c = $ini(vcmp.data.ini,AREA2,%b)
!hadd areatemp %b %c
!hadd areatemp %b $+ . $readini(vcmp.data.ini,AREA2,%c)
!inc %b
}
!hadd areatemp max_loc %b
!hsave areatemp vcmp.area.hash
!hfree -s areatemp
}
create then load the hash table on script start
!hmake -s area 1000
if ($exists(vcmp.area.hash)) { !hload area vcmp.area.hash }
to find an xy coordinate's location name:
alias vcmp.area {
if (($1) && ($2)) {
var %a = 1
while (%a < $hget(area,max_loc)) {
if ($inpoly($1,$2, [ $hget(area,%a) ] )) !return $hget(area,%a $+ .)
!inc %a
}
}
!return Vice City
}
basically the same, except it gets rid of the "Set max locations" step and saves the max_loc value directly into the hash table at the time of conversion so it can be referenced from there.