a1 is like he said the entity number. The parameters you use are stored in the stack of cod script. They get retrieved by Script_GetString(0). (different function in libcod)
Printable View
Because it is a method being called on a player, and the integer is the entitynumber.
The function itself gets the string you want, using getStackString() or something named quite similar.
Alright so keep in mind that libcod is new for me so I don't understand it much at all.
That being said... I have a really noob problem.
I'm getting this when compiling;
So i'm guessing those functions don't exist?Code:##### COMPILE cod2_1_0 GSC_PLAYER.CPP #####
gsc_player.cpp: In function "void PlayerCmd_renamebot(int)":
gsc_player.cpp:59:35: error: "Script_GetString" was not declared in this scope
gsc_player.cpp:60:19: error: "MAX_STRING_CHARS" was not declared in this scope
gsc_player.cpp:61:21: error: "userinfo" was not declared in this scope
gsc_player.cpp:61:47: error: "getuserinfo" was not declared in this scope
gsc_player.cpp:68:46: error: "Info_SetValueForKey" was not declared in this scope
gsc_player.cpp:69:29: error: "setuserinfo" was not declared in this scope
gsc_player.cpp:71:5: error: "client_t" was not declared in this scope
gsc_player.cpp:71:15: error: "cl" was not declared in this scope
gsc_player.cpp:71:32: error "getclient" was not declared in this scope
Edit: aha... looking through the q3 source code I see some of these methods... might be able to work this out
Edit2: Yeah.. nah. Do I really have to move over all these methods from the q3 source? Some of them require more methods (Example: "getuserinfo" requires "Q_strncpyz" which requires "strncpy" etc) which is making this a mess for me to understand/work out.
Is it possible for you to supply a precompiled version?
Lol i'm dumb I only just realized that your code was for cod1 CodExtended.
Could someone with the skills change the bot names for cod2 using libcod and share the code? Would be a very very very useful feature for me. =D
I'm getting some weird errors when kicking meatbots.
Basically, I created a monitor (code below) to add a bot if team size < 6, and remove a bot if team size > 6 && there is at least one bot in the team.
The problem is:
I join the server and a team, the bot is kicked;
The bot is still in the server, although the slot was freed (first image);
The bot still counts as being in the team I joined, so the server keeps trying to kick it constantly;
When I leave the server, this "ghost" bot rejoins the team (the server shows 11 players only, since its slot was freed);
When I reconnect, I use the slot of the kicked bot. The team score hud is duplicated (second image), and, as a spectator, I keep aiming at the other bots (which is what meatbot's check enemy function does, in an infinite loop);
At this moment, when I join the same team I joined earler, I get disconnected - it seems that I have self.isbot defined (the kicked bot had this it defined), so I count as a bot and the bot monitor tries to kick me to make room for myself, lol;
After I disconnect, the server keeps trying to kick whoever is in the slot I was using, so, in the console, it prints "Client 1 is not active" every time it goes through the monitor function.
Attachment 1309
Attachment 1308
PHP Code:
botMonitor()
{
self endon("intermission");
currentteam = "allies";
for(;;)
{
// start the monitor a while after map loading
timepassed = (getTime() - level.starttime) / 1000;
delayonstart = 20;
if
(
(timepassed > delayonstart) &&
(getCvar("mod_allow_bots") == "1")
)
{
// get bot count and player count for the current team
botsonteam = 0;
playersonteam = 0;
players = getentarray("player", "classname");
for(i = 0; i < players.size; i++)
{
if(players[i].pers["team"] == currentteam)
{
if
(
(isDefined(players[i].isbot)) ||
(players[i] getIP() == "0")
)
{
botsonteam++;
}
else
{
playersonteam++;
iprintln(players[i].name);
}
}
}
// add a bot to the current team if it is not complete
botmaxnumber = getCvarInt("mod_bots_" + currentteam);
if((playersonteam + botsonteam) < botmaxnumber)
{
reAddBot(currentteam);
}
else
{
// remove a bot from the current team if it has too many
if
(
(botsonteam > 0) &&
((playersonteam + botsonteam) > botmaxnumber)
)
{
iprintln("trying to kick a bot from " + currentteam);
level kickBotFromTeam(currentteam);
}
}
if(currentteam == "allies")
{
currentteam = "axis";
}
else
{
currentteam = "allies";
}
}
wait(0.5);
}
}
Any ideas?PHP Code:
kickBotFromTeam(team)
{
players = getentarray("player", "classname");
for(i = 0; i < players.size; i++)
{
if
(
(players[i].pers["team"] == team) &&
(
(isDefined(players[i].isbot)) ||
(players[i] getIP() == "0")
)
)
{
entnum = players[i] getentitynumber();
kick(entnum);
free_slot(entnum);
break;
}
}
}
You have to wait a little bit before freeing slot or just use libcod from my repo, has an autofreeslot for bots so you can just normally kick it. Also your isBot definiton seems wrong, just use:
PHP Code:
isBot()
{
return self getAddressType() == 0;
}
if (self isBot())
{
bla bla...
}
1 - I tried using getAddressType() but my version of libcod is a little old :) so, whenever I'm not using .isbot I'm using getIP() == 0.
.isbot works well because it is defined when the test client is added;
2 - Are you serious??? All I had to do was to add a wait before freeing the slot??? I wasted hours last night trying to figure this out, testing and testing and testing, before writing everything in details... lol
Thanks :D