-
Notifications
You must be signed in to change notification settings - Fork 2
/
tag.lua
128 lines (105 loc) · 4.13 KB
/
tag.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
-- constants
-- this is another player role, a custom one, you will notice it's set to the same thing
-- as main.lua's WILDCARD_ROLE variable, this is intentional
local ELIMINATED = 2
---@param m MarioState
local function mario_update(m)
if gGlobalSyncTable.gamemode ~= TAG then return end
m.health = 0x880 -- set mario's health to full
if gPlayerSyncTable[m.playerIndex].state == ELIMINATED then
-- set model state
m.marioBodyState.modelState = MODEL_STATE_NOISE_ALPHA -- vanish cap style
-- make mario have vanish cap and wing cap (wait so why did I do the line above? Idk)
m.flags = m.flags | MARIO_VANISH_CAP
m.flags = m.flags | MARIO_WING_CAP
end
end
local function hud_render()
if gGlobalSyncTable.gamemode ~= TAG then return end
-- set djui font and resolution
djui_hud_set_font(djui_menu_get_font())
djui_hud_set_resolution(RESOLUTION_N64)
-- check that we dont have the modifier MODIFIER_NO_RADAR enabled
if gGlobalSyncTable.modifier ~= MODIFIER_NO_RADAR then
-- render radar for each player
for i = 1, MAX_PLAYERS - 1 do
if gNetworkPlayers[i].connected then
-- make sure the states line up
if gPlayerSyncTable[i].state == RUNNER and gPlayerSyncTable[0].state == TAGGER then -- check if we meet the checks to render the radar
render_radar(gMarioStates[i], icon_radar[i], false) -- render radar on player
end
end
end
end
end
local function on_warp()
---@type MarioState
local m = gMarioStates[0]
if gGlobalSyncTable.gamemode ~= TAG then return end
if gGlobalSyncTable.roundState ~= ROUND_ACTIVE then return end
if not gGlobalSyncTable.eliminateOnDeath then return end
if m.playerIndex ~= 0 then return end
-- set us to eliminated
if gPlayerSyncTable[0].state == RUNNER then
gPlayerSyncTable[0].state = ELIMINATED
eliminated_popup(0)
end
end
---@param a MarioState
---@param v MarioState
local function allow_pvp(a, v)
if gGlobalSyncTable.gamemode ~= TAG then return end
-- check if eliminated player is trying to perform a pvp attack
if gPlayerSyncTable[v.playerIndex].state == ELIMINATED or gPlayerSyncTable[a.playerIndex].state == ELIMINATED then return false end
end
---@param a MarioState
---@param v MarioState
local function on_pvp(a, v)
if gGlobalSyncTable.gamemode ~= TAG then return end
if v.playerIndex ~= 0 then return end
-- handle pvp if we are the victim
tag_handle_pvp(a.playerIndex, v.playerIndex)
end
---@param aI number
---@param vI number
function tag_handle_pvp(aI, vI)
-- this checks and sets our states
local a = gPlayerSyncTable[aI]
local v = gPlayerSyncTable[vI]
-- check if tagger tagged runner
if v.state == RUNNER and a.state == TAGGER
and v.invincTimer <= 0 and gGlobalSyncTable.roundState == ROUND_ACTIVE then
-- flip states
v.state = TAGGER
a.state = RUNNER
-- create popup
tagged_popup(aI, vI)
-- increase amount of tags and set invincibility timer to 1 second
a.amountOfTags = a.amountOfTags + 1
a.invincTimer = 1 * 30
end
end
---@param m MarioState
---@param o Object
---@param intee InteractionType
local function allow_interact(m, o, intee)
if gGlobalSyncTable.gamemode ~= TAG then return end
-- check if player interacts with another player
if intee == INTERACT_PLAYER then
for i = 0, MAX_PLAYERS - 1 do
if gNetworkPlayers[i].connected then
-- find the other player and check his state
if gMarioStates[i].marioObj == o and (gPlayerSyncTable[m.playerIndex].state == ELIMINATED or gPlayerSyncTable[i].state == ELIMINATED) then
-- don't allow the interaction
return false
end
end
end
end
end
hook_event(HOOK_MARIO_UPDATE, mario_update)
hook_event(HOOK_ON_HUD_RENDER, hud_render)
hook_event(HOOK_ON_PVP_ATTACK, on_pvp)
hook_event(HOOK_ALLOW_PVP_ATTACK, allow_pvp)
hook_event(HOOK_ALLOW_INTERACT, allow_interact)
hook_event(HOOK_ON_WARP, on_warp)