sm64ex-coop/mods/counter-op.lua

88 lines
2.6 KiB
Lua

-- name: Counter-Op
-- description: All players except the host will try to kill the host
gServerSettings.playerInteractions = PLAYER_INTERACTIONS_PVP
function get_main_character()
local np = network_player_from_global_index(0)
if np == nil then
np = gNetworkPlayers[0]
end
return gMarioStates[np.localIndex]
end
function is_main_character(m)
local main = get_main_character()
return m.playerIndex == main.playerIndex
end
function does_level_match(m1, m2)
local np1 = gNetworkPlayers[m1.playerIndex]
local np2 = gNetworkPlayers[m2.playerIndex]
if np1.currActNum ~= np2.currActNum then
return false
end
if np1.currAreaIndex ~= np2.currAreaIndex then
return false
end
if np1.currCourseNum ~= np2.currCourseNum then
return false
end
if np1.currLevelNum ~= np2.currLevelNum then
return false
end
return true
end
function mario_update_local(m)
if not is_main_character(m) then
local main = get_main_character()
local mainNp = gNetworkPlayers[main.playerIndex]
--print('>>>', mainNp.globalIndex, mainNp.currAreaSyncValid, mainNp.currLevelSyncValid)
--if mainNp.currAreaSyncValid and mainNp.currLevelSyncValid then
if not does_level_match(m, main) then
warp_to_level(mainNp.currLevelNum, mainNp.currAreaIndex, mainNp.currActNum)
end
--end
end
end
function mario_update(m)
if m.playerIndex == 0 then
mario_update_local(m)
end
local np = gNetworkPlayers[m.playerIndex]
if is_main_character(m) then
m.visibleToEnemies = 1
if np.modelIndex == CT_TOAD then
np.overrideModelIndex = CT_MARIO
end
else
m.visibleToEnemies = 0
if np.modelIndex ~= CT_TOAD then
np.overrideModelIndex = CT_TOAD
end
end
end
function allow_pvp_attack(m1, m2)
return m1.visibleToEnemies ~= m2.visibleToEnemies
end
function allow_interact(m, obj, interactType)
if not is_main_character(m) then
if (interactType & INTERACT_WARP) ~= 0 then return true end
if (interactType & INTERACT_WARP_DOOR) ~= 0 then return true end
if (interactType & INTERACT_STRONG_WIND) ~= 0 then return true end
if (interactType & INTERACT_BBH_ENTRANCE) ~= 0 then return true end
if (interactType & INTERACT_PLAYER) ~= 0 then return true end
return false
end
return true
end
hook_event(HOOK_ALLOW_INTERACT, allow_interact)
hook_event(HOOK_ALLOW_PVP_ATTACK, allow_pvp_attack)
hook_event(HOOK_MARIO_UPDATE, mario_update)