Name | Type | is_array | initial_value |
//TESH.scrollpos=121
//TESH.alwaysfold=0
/*
* Anti AFK library by jim7777
* version 1.8
*
* Allows you to retrieve and kick "Away from Keyboard" players.
*
* Requires:
* OrderEvent by Bribe - http://www.hiveworkshop.com/forums/jass-resources-412/snippet-order-event-190871/
* GetPlayerColored by Ammorth - http://www.wc3c.net/showthread.php?t=101692
*
* API:
*
* function RegisterAFKPlayer takes player p returns boolean
* function RemoveAFKPlayer takes player p returns nothing
* function ResetAFKPlayer takes player p returns nothing
* function GetAFKTime takes player p returns real
*/
library AntiAFK requires OrderEvent, GetPlayerColored
globals
private constant real INTERVAL = 1 //how often should we check for afk players? value should be in seconds
private constant string AFK = "-afk" //the chat command to enter for checking afk players
private constant string KICK = "-kickafk" //the chat comment to enter for kicking players
private constant integer MAX_TIME = 10 //the required amount of time (in seconds) to check if a player can be kicked
// value should be greater than 1
private constant integer MIN_TIME = 3 //the required amount of time (in seconds) to check if a player is afk
// value should be greater than 1
endglobals
//! textmacro AntiAFK_OnKickHook
/*
* Add your hook functions here if we have successfully kicked a player
* variable p is the afk player and variable t is the player who kicked that afk player
* Default Value:
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,8,GetPlayerNameColored(p) + " was kicked by " + GetPlayerNameColored(t) + " for being afk!")
call RemovePlayer(p,PLAYER_GAME_RESULT_VICTORY)
//===============================================*/
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,8,GetPlayerNameColored(p) + " was kicked by " + GetPlayerNameColored(t) + " for being afk!")
call RemovePlayer(p,PLAYER_GAME_RESULT_DEFEAT)
//===============================================
//! endtextmacro
//==== END OF CONFIGURABLES =====
globals
private hashtable ht = InitHashtable()
endglobals
private struct Afk
player pl
real dur
static method KickPlayer takes player t, player p, integer id returns nothing
call thistype(LoadInteger(ht,id,0)).destroy()
call FlushChildHashtable(ht,id)
//! runtextmacro AntiAFK_OnKickHook()
endmethod
static method CheckOutput takes nothing returns nothing
local integer i = 0
local integer int
loop
exitwhen i > 11
if HaveSavedInteger(ht,i,0) then
set int = LoadInteger(ht,i,0)
set thistype(int).dur = thistype(int).dur + INTERVAL
if thistype(int).dur >= MAX_TIME and not HaveSavedBoolean(ht,i,0) then
call SaveBoolean(ht,i,0,true)
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,5,GetPlayerNameColored(thistype(int).pl) + " has been afk for " + R2S(thistype(LoadInteger(ht,i,0)).dur/60) + " minute(s). Type |CFF7EBFF1" + KICK + " " + I2S(i+1) + "|r to kick this player." )
endif
endif
set i = i + 1
endloop
endmethod
static method OnChat takes nothing returns boolean
local string str = GetEventPlayerChatString()
local string st = ""
local integer i = 0
local integer int
local player p = GetTriggerPlayer()
if str == AFK then
loop
exitwhen i > 11
if HaveSavedInteger(ht,i,0) then
set int = LoadInteger(ht,i,0)
if thistype(int).dur > MIN_TIME then
set st = st + GetPlayerNameColored(Player(i)) + " has been afk for " + R2S(thistype(int).dur/60) + " minute(s). \n"
endif
endif
set i = i + 1
endloop
if st == "" then
call DisplayTimedTextToPlayer(p,0,0,5,"No one is afk.")
else
call DisplayTimedTextToPlayer(p,0,0,5,st)
endif
call DisplayTimedTextToPlayer(p,0,0,1," ")
elseif SubString(str,0,StringLength(KICK)) == KICK then
if S2I(SubString(str,StringLength(KICK)+1,2)) != 0 then
set int = S2I(SubString(str,StringLength(KICK)+1,2))
if int <= 12 and int > 0 then
set int = int - 1
if HaveSavedBoolean(ht,int,0) and int != GetPlayerId(p) then
call thistype.KickPlayer.execute(p,Player(int),int)
endif
endif
elseif S2I(SubString(str,StringLength(KICK)+1,1)) != 0 then
set int = S2I(SubString(str,StringLength(KICK)+1,1))
if int <= 12 and int > 0 then
set int = int - 1
if HaveSavedBoolean(ht,int,0) and int != GetPlayerId(p) then
call thistype.KickPlayer.execute(p,Player(int),int)
endif
endif
endif
endif
set p = null
return false
endmethod
static method OnOrder takes nothing returns boolean
local integer id = GetPlayerId(GetTriggerPlayer())
if HaveSavedInteger(ht,id,0) and thistype(LoadInteger(ht,id,0)).dur > (MIN_TIME-1) then
set thistype(LoadInteger(ht,id,0)).dur = 0
call RemoveSavedBoolean(ht,id,0)
endif
return false
endmethod
static method register takes player p returns nothing
local thistype dat
local integer i = GetPlayerId(p)
if not HaveSavedInteger(ht,i,0) and GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING then
set dat = thistype.allocate()
call SaveInteger(ht,i,0,dat)
set dat.pl = Player(i)
set dat.dur = 0
debug else
debug call BJDebugMsg("[AntiAfk] Player " + GetPlayerName(Player(i)) + " cannot be registered!")
endif
endmethod
static method onInit takes nothing returns nothing
local integer i = 0
local trigger t
local thistype dat
if MIN_TIME <= 1 or MAX_TIME <= 1 then
debug call BJDebugMsg("[AntiAFK] Crashed! Invalid values for MIN_TIME or MAX_TIME")
return
endif
set t = CreateTrigger()
call RegisterAnyOrderEvent(function thistype.OnOrder)
call TimerStart(CreateTimer(),INTERVAL,true,function thistype.CheckOutput)
loop
exitwhen i > 11
call TriggerRegisterPlayerChatEvent(t,Player(i),"-",false)
if GetPlayerController(Player(i)) == MAP_CONTROL_USER and GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING and not HaveSavedInteger(ht,i,0) then
set dat = thistype.allocate()
call SaveInteger(ht,i,0,dat)
set dat.pl = Player(i)
set dat.dur = 0
endif
set i = i + 1
endloop
call TriggerAddCondition(t,Filter(function thistype.OnChat))
set t = null
endmethod
endstruct
function RegisterAFKPlayer takes player p returns nothing
call Afk.register(p)
endfunction
function RemoveAFKPlayer takes player p returns nothing
call Afk(LoadInteger(ht,GetPlayerId(p),0)).destroy()
call FlushChildHashtable(ht,GetPlayerId(p))
endfunction
function ResetAFKPlayer takes player p returns nothing
set Afk(LoadInteger(ht,GetPlayerId(p),0)).dur = 0
call RemoveSavedBoolean(ht,GetPlayerId(p),0)
endfunction
function GetAFKTime takes player p returns real
return Afk(LoadInteger(ht,GetPlayerId(p),0)).dur
endfunction
endlibrary
//TESH.scrollpos=0
//TESH.alwaysfold=0
library GetPlayerColored initializer init
// GetPlayerColored by Ammorth
// v1.2
// functions should be self-explanatory
// Credits to DioD for multiple fixes
globals
private string array PlayerColor
private integer array redhex
private integer array greenhex
private integer array bluehex
endglobals
function GetPlayerNameColored takes player p returns string // colored player name
return PlayerColor[GetHandleId(GetPlayerColor(p))]+GetPlayerName(p)+"|r"
endfunction
function GetPlayerTextColor takes player p returns string // only textcode
return PlayerColor[GetHandleId(GetPlayerColor(p))]
endfunction
function GetPlayerRedHex takes player p returns integer // integer value for red
return redhex[GetHandleId(GetPlayerColor(p))]
endfunction
function GetPlayerGreenHex takes player p returns integer // integer value for green
return greenhex[GetHandleId(GetPlayerColor(p))]
endfunction
function GetPlayerBlueHex takes player p returns integer // integer value for blue
return bluehex[GetHandleId(GetPlayerColor(p))]
endfunction
private function init takes nothing returns nothing
set PlayerColor[0] = "|CFFFF0303" // red
set PlayerColor[1] = "|CFF0042FF" // blue
set PlayerColor[2] = "|CFF1CE6B9" // teal
set PlayerColor[3] = "|CFF540081" // purple
set PlayerColor[4] = "|CFFFFFF01" // yellow
set PlayerColor[5] = "|CFFFE8A0E" // orange
set PlayerColor[6] = "|CFF20C000" // green
set PlayerColor[7] = "|CFFE55BB0" // pink
set PlayerColor[8] = "|CFF959697" // grey
set PlayerColor[9] = "|CFF7EBFF1" // light blue
set PlayerColor[10] = "|CFF106246" // dark green
set PlayerColor[11] = "|CFF4E2A04" // brown
set redhex[0] = 255
set redhex[1] = 0
set redhex[2] = 28
set redhex[3] = 84
set redhex[4] = 255
set redhex[5] = 254
set redhex[6] = 32
set redhex[7] = 229
set redhex[8] = 149
set redhex[9] = 126
set redhex[10] = 16
set redhex[11] = 78
set greenhex[0] = 3
set greenhex[1] = 66
set greenhex[2] = 230
set greenhex[3] = 0
set greenhex[4] = 255
set greenhex[5] = 138
set greenhex[6] = 192
set greenhex[7] = 91
set greenhex[8] = 150
set greenhex[9] = 191
set greenhex[10] = 98
set greenhex[11] = 42
set bluehex[0] = 3
set bluehex[1] = 255
set bluehex[2] = 185
set bluehex[3] = 129
set bluehex[4] = 1
set bluehex[5] = 14
set bluehex[6] = 0
set bluehex[7] = 176
set bluehex[8] = 151
set bluehex[9] = 241
set bluehex[10] = 70
set bluehex[11] = 4
endfunction
endlibrary
//TESH.scrollpos=0
//TESH.alwaysfold=0
//============================================================================
// OrderEvent by Bribe, special thanks to Nestharus and Azlier, version 2.1.0.0
//
// API
// ---
// RegisterOrderEvent(integer orderId, code eventFunc)
// RegisterAnyOrderEvent(code eventFunc) //Runs for point/target/instant for any order
//
// Requires
// --------
// RegisterPlayerUnitEvent: hiveworkshop.com/forums/showthread.php?t=203338
//
library OrderEvent requires RegisterPlayerUnitEvent
globals
private trigger array t
endglobals
//============================================================================
function RegisterOrderEvent takes integer orderId, code c returns nothing
set orderId = orderId - 851968
if t[orderId] == null then
set t[orderId] = CreateTrigger()
endif
call TriggerAddCondition(t[orderId], Filter(c))
endfunction
//============================================================================
function RegisterAnyOrderEvent takes code c returns nothing
call RegisterPlayerUnitEvent(EVENT_PLAYER_UNIT_ISSUED_ORDER, c)
call RegisterPlayerUnitEvent(EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER, c)
call RegisterPlayerUnitEvent(EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER, c)
endfunction
//============================================================================
private function OnOrder takes nothing returns nothing
call TriggerEvaluate(t[GetIssuedOrderId() - 851968])
endfunction
//============================================================================
private module M
private static method onInit takes nothing returns nothing
call RegisterAnyOrderEvent(function OnOrder)
endmethod
endmodule
private struct S extends array
implement M
endstruct
endlibrary
//TESH.scrollpos=21
//TESH.alwaysfold=0
/**************************************************************
*
* RegisterPlayerUnitEvent
* v5.1.0.0
* By Magtheridon96
*
* I would like to give a special thanks to Bribe, azlier
* and BBQ for improving this library. For modularity, it only
* supports player unit events.
*
* Functions passed to RegisterPlayerUnitEvent must either
* return a boolean (false) or nothing. (Which is a Pro)
*
* Warning:
* --------
*
* - Don't use TriggerSleepAction inside registered code.
* - Don't destroy a trigger unless you really know what you're doing.
*
* API:
* ----
*
* - function RegisterPlayerUnitEvent takes playerunitevent whichEvent, code whichFunction returns nothing
* - Registers code that will execute when an event fires.
* - function RegisterPlayerUnitEventForPlayer takes playerunitevent whichEvent, code whichFunction, player whichPlayer returns nothing
* - Registers code that will execute when an event fires for a certain player.
* - function GetPlayerUnitEventTrigger takes playerunitevent whichEvent returns trigger
* - Returns the trigger corresponding to ALL functions of a playerunitevent.
*
**************************************************************/
library RegisterPlayerUnitEvent // Special Thanks to Bribe and azlier
globals
private trigger array t
endglobals
function RegisterPlayerUnitEvent takes playerunitevent p, code c returns nothing
local integer i = GetHandleId(p)
local integer k = 15
if t[i] == null then
set t[i] = CreateTrigger()
loop
call TriggerRegisterPlayerUnitEvent(t[i], Player(k), p, null)
exitwhen k == 0
set k = k - 1
endloop
endif
call TriggerAddCondition(t[i], Filter(c))
endfunction
function RegisterPlayerUnitEventForPlayer takes playerunitevent p, code c, player pl returns nothing
local integer i = 260 + 16 * GetHandleId(p) + GetPlayerId(pl)
if t[i] == null then
set t[i] = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(t[i], pl, p, null)
endif
call TriggerAddCondition(t[i], Filter(c))
endfunction
function GetPlayerUnitEventTrigger takes playerunitevent p returns trigger
return t[GetHandleId(p)]
endfunction
endlibrary