I've got the kill log to sync the killstreak message but now it's looping the messages every step for both host and client (along with the annoying notice sound) until the milestone has been passed, code is as follows
plugin.gml
//set argument0 and argument1 as necessary
globalvar ksRTDPacket, resourceFolder;
resourceFolder = argument0;
ksRTDPacket = argument1;
//define sprites
globalvar Streak3S, Streak6S, Streak9S, Streak12S, Streak15S, Streak20S, Streak25S, Streak30S;
Streak3S = sprite_add_sprite(resourceFolder+"/KSRTD/Streak3S.gmspr");
Streak6S = sprite_add_sprite(resourceFolder+"/KSRTD/Streak6S.gmspr");
Streak9S = sprite_add_sprite(resourceFolder+"/KSRTD/Streak9S.gmspr");
Streak12S = sprite_add_sprite(resourceFolder+"/KSRTD/Streak12S.gmspr");
Streak15S = sprite_add_sprite(resourceFolder+"/KSRTD/Streak15S.gmspr");
Streak20S = sprite_add_sprite(resourceFolder+"/KSRTD/Streak20S.gmspr");
Streak25S = sprite_add_sprite(resourceFolder+"/KSRTD/Streak25S.gmspr");
Streak30S = sprite_add_sprite(resourceFolder+"/KSRTD/Streak30S.gmspr");
sprite_set_offset(Streak3S,8,5);
sprite_set_offset(Streak6S,8,5);
sprite_set_offset(Streak9S,8,5);
sprite_set_offset(Streak12S,8,5);
sprite_set_offset(Streak15S,8,5);
sprite_set_offset(Streak20S,8,5);
sprite_set_offset(Streak25S,8,5);
sprite_set_offset(Streak30S,8,5);
object_event_add(Character,ev_create,0,"
currentStreak = player.stats[KILLS];
killStreak = 0;
");
/* Maybe I'll work something out with maxStreaks later
object_event_add(Player,ev_create,0,"
tempStreak = 0;
maxStreak = 0;
");
*/
/* This is debug and should be commented out
object_event_add(Character,ev_draw,0,"
var xr, yr;
xr = round(x);
yr = round(y);
if(distance_to_point(mouse_x, mouse_y)<25) {
if cloak && team!=global.myself.team exit;
draw_set_alpha(1);
draw_set_halign(fa_center);
draw_set_valign(fa_bottom);
if(team==TEAM_RED) {
draw_set_color(c_red);
} else {
draw_set_color(c_blue);
}
draw_text(xr, yr+40, 'Current KS/Max KS/Total Kills: ' + string(killStreak) + '/' + string(player.maxStreak) + '/' + string(player.stats[KILLS]));
}
");
*/
/*
object_event_add(Character,ev_destroy,0,"
player.tempStreak = killStreak;
with (player) {
if !variable_local_exists('maxStreak') {
maxStreak = 0;
}
if tempStreak > maxStreak {
maxStreak = tempStreak;
}
}
");
*/
object_event_add(Character,ev_step,ev_step_normal,"
if (player.stats[KILLS] > currentStreak && player.stats[KILLS] - currentStreak != killStreak) {
killStreak = player.stats[KILLS] - currentStreak;
}
if (global.isHost) {
var KSSwitch;
KSSwitch = 0;
if (killStreak == 3 || killStreak == 6 || killStreak == 9 || killStreak == 12 ||
killStreak == 15 || killStreak == 20 || killStreak == 25 || killStreak == 30){
KSSwitch = 1;
var ksSend;
ksSend = buffer_create();
write_ubyte(ksSend,killStreak);
write_ubyte(ksSend,ds_list_find_index(global.players, player));
PluginPacketSend(ksRTDPacket,ksSend);
buffer_destroy(ksSend);
if KSSwitch = 1 {
var isMe;
isMe = (player == global.myself);
execute_file(resourceFolder + '/recordStreakInLog.gml',killStreak,player.team,player,isMe);
KSSwitch = 0;
}
}
}
");
object_event_add(Player,ev_step,ev_step_begin,"
while(PluginPacketGetBuffer(ksRTDPacket) != -1) {
ksReceive = PluginPacketGetBuffer(ksRTDPacket);
streak = read_ubyte(ksReceive);
streakPlayer = ds_list_find_value(global.players, read_ubyte(ksReceive));
var isMe;
isMe = (streakPlayer == global.myself);
execute_file(resourceFolder + '/recordStreakInLog.gml',streak,streakPlayer.team,streakPlayer,isMe);
buffer_destroy(ksReceive);
PluginPacketPop(ksRTDPacket);
exit;
}
");
recordStreakInLog.gml:
// Record killstreak log
// argument0: level of killstreak
// argument1: The team
// argument2: The player name
// argument3: Am I involved?
var message, sprite, icon, name, action;
message = "";
sprite = -1;
icon = "";
name = string_copy(argument2.name, 1, 20);
action = "";
if argument0==3 {
message = "got a triple kill (3)!";
icon = "kill3";
}
else if argument0==6 {
message= "got a M-M-M-Monster kill (6)!";
icon = "kill6";
}
else if argument0==9 {
message = "got a ludicrous kill (9)!!";
icon = "kill9";
}
else if argument0==12 {
message = "is merciless (12)!!";
icon = "kill12";
}
else if argument0==15 {
action = "is unstoppable (15)!!!";
icon = "kill15";
}
else if argument0==20 {
action = "is GODLIKE (20)!!!";
icon = "kill20";
}
else if argument0==25 {
action = "is a 1337 |-|4><0|2 (25)!!!!";
icon = "kill25";
}
else if argument0==30 {
action = "should stop playing this game (30)!!!!";
icon = "kill30";
}
else exit;
if icon == "kill3" { sprite = Streak3S;
} else if icon == "kill6" { sprite = Streak6S;
} else if icon == "kill9" { sprite = Streak9S;
} else if icon == "kill12" { sprite = Streak12S;
} else if icon == "kill15" { sprite = Streak15S;
} else if icon == "kill20" { sprite = Streak20S;
} else if icon == "kill25" { sprite = Streak25S;
} else if icon == "kill30" { sprite = Streak30S;
}
with (KillLog) {
map = ds_map_create();
ds_map_add(map, "name1", name);
ds_map_add(map, "team1", argument1);
ds_map_add(map, "weapon", sprite);
ds_map_add(map, "string", message);
ds_map_add(map, "name2", action);
ds_map_add(map, "team2", argument1);
ds_map_add(map, "inthis", argument3);
ds_list_add(kills, map);
if (ds_list_size(kills) > 5) {
ds_map_destroy(ds_list_find_value(kills, 0));
ds_list_delete(kills, 0);
}
alarm[0] = 30*5;
}
playsound(view_xview[0]+400,view_yview[0]+300,NoticeSnd);
exit;
I don't think the resetTimer (or KSSwitch as I've named it here) is gonna be the solution but I can't think of what other checks I can do. Oddly enough the frankenplugin didn't run into this problem...