sm64coopdx/mods/mquake/_mquake_e_hook_functions.lua

665 lines
26 KiB
Lua
Raw Normal View History

2024-03-22 18:45:48 +00:00
local is_player_active,vec3f_copy,set_mario_action,perform_air_step,save_file_get_flags,save_file_set_flags,save_file_do_save,get_current_save_file_num,vec3f_dot,get_id_from_behavior,djui_hud_set_color,djui_hud_render_rect,djui_hud_print_text,djui_hud_set_resolution,djui_hud_get_screen_width,djui_hud_get_screen_height,djui_hud_set_font,vec3f_length,math_floor,djui_hud_measure_text,get_cutscene_from_mario_status,obj_get_first,obj_get_next,obj_get_nearest_object_with_behavior_id,obj_check_hitbox_overlap = is_player_active,vec3f_copy,set_mario_action,perform_air_step,save_file_get_flags,save_file_set_flags,save_file_do_save,get_current_save_file_num,vec3f_dot,get_id_from_behavior,djui_hud_set_color,djui_hud_render_rect,djui_hud_print_text,djui_hud_set_resolution,djui_hud_get_screen_width,djui_hud_get_screen_height,djui_hud_set_font,vec3f_length,math.floor,djui_hud_measure_text,get_cutscene_from_mario_status,obj_get_first,obj_get_next,obj_get_nearest_object_with_behavior_id,obj_check_hitbox_overlap
function no_dialog_open()
return not (get_dialog_id() >= 0 and get_dialog_box_state() < 3)
end
-- function remove_cutscenes(m)
-- todo: this shit breaks
-- if m.area ~= nil and m.area.camera ~= nil then
-- local lvl = gNetworkPlayers[m.playerIndex].currLevelNum
-- if (cutsceneActns[m.action] ~= 1 or not no_dialog_open()) and (lvl ~= LEVEL_BOWSER_1 and lvl ~= LEVEL_BOWSER_2 and lvl ~= LEVEL_BOWSER_3) then
-- disable_time_stop()
-- m.area.camera.cutscene = 0
-- m.statusForCamera.cameraEvent = 0
-- m.freeze = 0
-- end
-- end
-- end
local intFix = 0
--- @param m MarioState
function active_player(m)
local np = gNetworkPlayers[m.playerIndex]
if m.playerIndex == 0 then
return 1
end
if not np.connected then
return 0
end
if np.currCourseNum ~= gNetworkPlayers[0].currCourseNum then
return 0
end
if np.currActNum ~= gNetworkPlayers[0].currActNum then
return 0
end
if np.currLevelNum ~= gNetworkPlayers[0].currLevelNum then
return 0
end
if np.currAreaIndex ~= gNetworkPlayers[0].currAreaIndex then
return 0
end
return is_player_active(m)
end
function on_set_mario_action(m)
if (m.playerIndex == 0) then
if (DM_ACTION_TRANSFERS[m.action] == 1) then
local yVel = m.vel.y * sv_scalerate_inverse
local fVel = m.forwardVel * sv_scalerate_inverse
local s = gPlayerSyncTable[m.playerIndex]
local direction = GetAngleVectors(m).forward
vec3f_copy(m.vel,vec3_scale(direction,m.forwardVel*sv_scalerate_inverse))
m.vel.y = yVel
local is_underwater = m.pos.y <= m.waterLevel-sv_playersubmergelevel
local metal_underwater = (m.flags & MARIO_METAL_CAP) ~= 0
if ((m.action & ACT_FLAG_AIR) ~= 0) then
set_mario_action(m, ACT_DM_AIR_MOVEMENT, 0)
return 1
elseif ((m.action & ACT_GROUP_SUBMERGED) ~= 0) then
if (not metal_underwater) and (is_underwater) then
set_mario_action(m, ACT_DM_WATER_MOVEMENT, 0)
return 1
end
if (metal_underwater) and (is_underwater) then
set_mario_action(m, ACT_DM_AIR_MOVEMENT_METAL, 0)
return 1
end
end
set_mario_action(m, ACT_DM_GROUNDED_MOVEMENT, 0)
return 1
end
if (DM_ACTION_FUNCTIONS[m.action] ~= nil) then
local val = DM_ACTION_FUNCTIONS[m.action](m)
if (val == 1) then return 1 end
end
end
end
function allow_voice(m,s)
if (s == CHAR_SOUND_ON_FIRE or s == CHAR_SOUND_ATTACKED or s == CHAR_SOUND_EEUH) then
return 0
end
end
function override_defacto(m)
-- if m.action == ACT_DM_AIR_MOVEMENT or m.action == ACT_DM_GROUNDED_MOVEMENT or
-- m.action == ACT_DM_AIR_MOVEMENT_METAL or m.action == ACT_DM_GROUNDED_MOVEMENT_METAL or m.action == ACT_DM_GROUNDED_IDLE then
return 1
-- end
end
function on_player_connected(m)
gPlayerSyncTable[m.playerIndex].playerCrouching = false
gPlayerSyncTable[m.playerIndex].playerPitch = 1
gPlayerSyncTable[m.playerIndex].playerYaw = 1
end
function before_set_mario_action(m,incoming)
if (DM_ACTION_PREFUNCS_ALL[incoming] ~= nil) then
local val = DM_ACTION_PREFUNCS_ALL[incoming](m)
if (val == 1) then return 1 end
end
if (m.playerIndex == 0) then
if (DM_ACTION_PREFUNCS[incoming] ~= nil) then
return DM_ACTION_PREFUNCS[incoming](m)
elseif (DM_ACTIONS[incoming] ~= 1) then
m.controller.buttonPressed = 0
local is_underwater = m.pos.y <= m.waterLevel-sv_playersubmergelevel
local metal_underwater = (m.flags & MARIO_METAL_CAP) ~= 0
if ((incoming & ACT_FLAG_AIR) ~= 0) then
set_mario_action(m, ACT_DM_AIR_MOVEMENT, 0)
return 1
elseif ((incoming & ACT_FLAG_SWIMMING) ~= 0) or ((incoming & ACT_GROUP_SUBMERGED) ~= 0) then
if (not metal_underwater) and (is_underwater) then
set_mario_action(m, ACT_DM_WATER_MOVEMENT, 0)
return 1
end
if (metal_underwater) and (is_underwater) then
set_mario_action(m, ACT_DM_AIR_MOVEMENT_METAL, 0)
return 1
end
end
set_mario_action(m, ACT_DM_GROUNDED_MOVEMENT, 0)
return 1
end
end
end
function before_phys_step(m)
local act = m.action
if (DM_ACTIONS[act] ~= 1) then return 0 end
if ((act == ACT_DM_AIR_MOVEMENT or act == ACT_DM_AIR_MOVEMENT_METAL or act == ACT_DM_WATER_MOVEMENT or act == ACT_GROUND_POUND) and m.playerIndex == 0 and m.ceil ~= nil) then
local h = m.marioObj.hitboxHeight
if (m.ceilHeight <= m.pos.y + h) then
m.pos.y = m.ceilHeight - h - 4
return 0
end
if (m.pos.y + h + 4 + sv_camerayoffset > m.ceilHeight) then
SV_PlayerMovement_Scale(m,true)
vec3f_copy(m.vel, PHYS_CollideWithNormal(m.vel,m.ceil.normal,0.25))
SV_PlayerMovement_Scale(m,false)
m.pos.y = m.pos.y - 4
return perform_air_step(m,0)
end
end
end
function on_interact(m,o,i,b)
if (intFix > 0) then return end
if DM_ACTION_QPHYS[m.action] == 1 then
if (i == INTERACT_BOUNCE_TOP or i == INTERACT_BOUNCE_TOP2) and not (m.action == ACT_GROUND_POUND or m.action == ACT_DM_GROUND_POUND_METAL) then
if (o.oInteractStatus & INT_STATUS_WAS_ATTACKED) ~= 0 then
m.vel.y = 160
return
end
end
if (o.oInteractStatus & INT_STATUS_ATTACKED_MARIO) ~= 0 and m.health > 0xFF then
m.invincTimer = 30
gLakituState.roll = 2730*(m.hurtCounter*0.25)
gLakituState.oldRoll = gLakituState.roll
cl_red = 128
return
end
if i == INTERACT_STAR_OR_KEY then
local lvl = gNetworkPlayers[m.playerIndex].currLevelNum
if (lvl == LEVEL_BOWSER_1) then
if ((save_file_get_flags() & (SAVE_FLAG_UNLOCKED_BASEMENT_DOOR)) == 0) then
save_file_set_flags(SAVE_FLAG_UNLOCKED_BASEMENT_DOOR)
save_file_do_save(get_current_save_file_num()-1,true)
end
end
if (lvl == LEVEL_BOWSER_2) then
if ((save_file_get_flags() & (SAVE_FLAG_UNLOCKED_UPSTAIRS_DOOR)) == 0) then
save_file_set_flags(SAVE_FLAG_UNLOCKED_UPSTAIRS_DOOR)
save_file_do_save(get_current_save_file_num()-1,true)
end
end
return
end
end
end
function allow_interact(m,o,i)
if (intFix > 0) then return end
if DM_ACTION_QPHYS[m.action] == 1 then
if (i == INTERACT_POLE and no_dialog_open()) then
if (vec3f_dot({x=o.oPosX-m.pos.x,y=0,z=o.oPosZ-m.pos.z},{x=m.vel.x,y=0,z=m.vel.z}) > 0) and (m.controller.buttonDown & B_BUTTON) ~= 0 then
m.usedObj = o
cl_poleY = o.oPosY
set_mario_action(m,ACT_DM_POLE_MOVEMENT,0)
end
return false
end
if (i == INTERACT_IGLOO_BARRIER) then
if (m.controller.buttonDown & Z_TRIG ~= 0) then
return false
end
end
if (m.action == ACT_DM_GROUND_POUND_METAL) then
o.oInteractStatus = (o.oInteractStatus | INT_GROUND_POUND)
end
end
if (get_id_from_behavior(o.behavior) == id_bhvToadMessage) then
return false
end
end
function on_pvp(m,v)
if (intFix > 0) then return end
if DM_ACTION_QPHYS[v.action] == 1 then
v.invincTimer = 30
if (v.playerIndex == 0) then
gLakituState.roll = 2730*(v.hurtCounter*0.25)
gLakituState.oldRoll = gLakituState.roll
cl_red = 128
end
end
end
local function render_speed(w2,h2,textWidth,h_offset,hspeed_text,scale,height)
local scale1 = scale*0.5
djui_hud_set_color(0,0,0,100)
djui_hud_render_rect((w2*0.5) - (textWidth*scale1) - 1,(h2*h_offset),textWidth*scale + 2,height)
djui_hud_set_color(255,255,255,255)
djui_hud_print_text(hspeed_text, (w2*0.5) - (textWidth*scale1),(h2*h_offset),scale)
end
function render_hud_effects()
local m = gMarioStates[0]
if (m ~= nil) then
djui_hud_set_resolution(RESOLUTION_DJUI)
local w = djui_hud_get_screen_width()
local h = djui_hud_get_screen_height()
if (cl_red > 0) then
djui_hud_set_color(255,0,0,cl_red*0.5)
djui_hud_render_rect(0,0,w,h)
end
local c = m.area.camera
if (c ~= nil) then
if (c.pos.y < m.waterLevel) then
djui_hud_set_color(38,139,255,100)
djui_hud_render_rect(0,0,w,h)
end
end
if (m.health <= 0xFF or m.action == ACT_UNINITIALIZED or m.action == ACT_DISAPPEARED) then return end
djui_hud_set_resolution(RESOLUTION_N64)
djui_hud_set_font(FONT_NORMAL)
local w2 = djui_hud_get_screen_width()
local h2 = djui_hud_get_screen_height()
local hspeed = m.forwardVel*sv_scalerate_inverse ; if (DM_ACTION_QPHYS[m.action] == 1) then hspeed = vec3f_length({x=m.vel.x,y=0,z=m.vel.z}) end
local hspeed_text = tostring(math.floor(hspeed))
local textWidth = djui_hud_measure_text(hspeed_text)
render_speed(w2,h2,textWidth,0.8,hspeed_text,0.5,15)
local vspeed = m.vel.y ; if (DM_ACTION_QPHYS[m.action] ~= 1) then vspeed = vspeed * sv_scalerate_inverse end
local vspeed_text = tostring(math.floor(vspeed))
local vtextWidth = djui_hud_measure_text(vspeed_text)
render_speed(w2,h2,vtextWidth,0.75,vspeed_text,0.25,7.5)
-- local vspeed_text = tostring(m.area.camera.cutscene)
-- local vTextWidth = djui_hud_measure_text(vspeed_text)
-- render_speed(w2,h2,vTextWidth,0.75,vspeed_text,0.25,7.5)
-- local usedObjT = tostring(m.usedObj ~= nil)
-- local usedObj = djui_hud_measure_text(usedObjT)
-- render_speed(w2,h2,usedObj,0.6,usedObjT,0.25,7.5)
-- local usedObjT2 = tostring(get_cutscene_from_mario_status(m.area.camera))
-- local usedObj2 = djui_hud_measure_text(usedObjT2)
-- render_speed(w2,h2,usedObj2,0.55,usedObjT2,0.25,7.5)
if (m.capTimer > 0) then
local capTimer_Seconds = math.floor(m.capTimer * 0.03333333333333333)
local capText = "Cap Timer: " .. tostring(capTimer_Seconds)
local capWidth = djui_hud_measure_text(capText)
render_speed(w2,h2,capWidth,0.875,capText,0.5,15)
end
-- m.area.camera.cutscene = 0
-- m.statusForCamera.cameraEvent = 0
-- if (m.area.camera.cutscene > 0) then
-- local at = "Area Cutscene: " .. tostring(m.area.camera.cutscene)
-- local aw = djui_hud_measure_text(at)
-- render_speed(w2,h2,aw,0.1,at,0.5,15)
-- end
-- if (m.statusForCamera.cameraEvent > 0) then
-- local at2 = "Mario Cutscene: " .. tostring(m.statusForCamera.cameraEvent)
-- local aw2 = djui_hud_measure_text(at2)
-- render_speed(w2,h2,aw2,0.2,at2,0.5,15)
-- end
if (not sv_gunmod_loaded) then -- crosshair
-- djui_hud_set_color(0,0,0,255)
-- djui_hud_render_rect((w2*0.5) - 6,(h2*0.5) - 1,11,3)
-- djui_hud_render_rect((w2*0.5) - 2,(h2*0.5) - 5,3,11)
djui_hud_set_color(255,255,255,255)
djui_hud_render_rect((w2*0.5) - 5,(h2*0.5),9,1)
djui_hud_render_rect((w2*0.5) - 1,(h2*0.5) - 4,1,9)
end
end
end
function allow_pvp(m,v)
if (intFix > 0) then return end
if (m.action == ACT_DM_AIR_MOVEMENT or m.action == ACT_DM_AIR_MOVEMENT_METAL or m.action == ACT_DM_WATER_MOVEMENT) then
return false
end
end
function on_object_render(o)
if (get_id_from_behavior(o.behavior) == id_bhvMario) then
local m = gMarioStates[0]
if (o == m.marioObj) then
o.header.gfx.shadowInvisible = true
o.header.gfx.disableAutomaticShadowPos = true
local flag = cutsceneActns[m.action] ~= 1
if (m.heldObj ~= nil and flag) then
local cYaw = m.area.camera.yaw + 0x8000
local fA = m.faceAngle.y + 0x4000
local offsetX_FaceAngle = 40 * sins(fA)
local offsetZ_FaceAngle = 40 * coss(fA)
local factorY_CameraAngle = sins(gLakituState.oldPitch)
local offsetX_CameraAngle_Fixup = (sins(cYaw)) * factorY_CameraAngle
local offsetZ_CameraAngle_Fixup = (coss(cYaw)) * factorY_CameraAngle
local finalOffsetX = offsetX_FaceAngle + offsetX_CameraAngle_Fixup
local finalOffsetY = -60
local finalOffsetZ = offsetZ_FaceAngle + offsetZ_CameraAngle_Fixup
m.marioObj.header.gfx.pos.x = m.marioBodyState.heldObjLastPosition.x + finalOffsetX
m.marioObj.header.gfx.pos.y = m.marioBodyState.heldObjLastPosition.y + finalOffsetY
m.marioObj.header.gfx.pos.z = m.marioBodyState.heldObjLastPosition.z + finalOffsetZ
elseif (m.heldObj == nil and m.heldByObj ~= nil and flag) then
vec3f_copy(m.pos,m.marioObj.header.gfx.pos)
end
end
end
end
local modLoad = false
function on_level_init()
gFirstPersonCamera.offset.y = sv_camerayoffset
gLakituState.roll = 0
cl_red = 0
intFix = 10
local lastList = 0
local obj = obj_get_first(ObjectLists[lastList])
while obj ~= nil do
obj.header.gfx.skipInViewCheck = true
local nextObj = obj_get_next(obj)
if (nextObj == nil) then
while nextObj == nil and lastList < 9 do
lastList = lastList + 1
nextObj = obj_get_first(ObjectLists[lastList])
end
end
obj = nextObj
end
if (not modLoad) then
djui_chat_message_create("\\#FFE0A0\\Welcome to \\#FFAA00\\mQuake\\#FFE0A0\\!\nPlease check the list of commands with '/mq list'.")
end
if (not modLoad and network_is_server()) then
djui_chat_message_create("\\#A0FFE0\\Please check the server settings with '/mq_server list'.")
end
modLoad = true
end
function local_update(m)
if (m == nil) then return true end
if (m.health <= 0xFF) then
gFirstPersonCamera.offset.y = -110
gLakituState.roll = 0
m.invincTimer = 0
cl_red = 192
return false
end
if (cl_airstrafelimiter > 0) then
cl_airstrafelimiter = cl_airstrafelimiter * 0.95
if (cl_airstrafelimiter <= 0.1) then cl_airstrafelimiter = 0 end
end
local btnDown = m.controller.buttonDown
local btnPressed = m.controller.buttonPressed
-- if (cl_interacttimer > 0) then cl_interacttimer = cl_interacttimer - 1 end
if (cl_red > 0) then cl_red = cl_red - 32 end
m.marioObj.hookRender = 1
if (m.heldObj ~= nil) then
held_obj_update(m)
end
if (m.usedObj ~= nil and cl_toadTalkedTo and no_dialog_open()) then
m.usedObj.oToadMessageState = 4
m.usedObj = nil
cl_toadTalkedTo = false
end
if (DM_ACTION_QPHYS[m.action] == 1) then
if (m.controller.buttonDown & B_BUTTON) ~= 0 and (m.flags & MARIO_UNKNOWN_31) == 0 then
m.flags = m.flags | MARIO_UNKNOWN_31
elseif (m.flags & MARIO_UNKNOWN_31) ~= 0 then
m.flags = m.flags & ~MARIO_UNKNOWN_31
end
end
if (cl_bowserthrow) then
cl_bowserthrow_previousYaw = m.faceAngle.y
cl_bowserthrow = m.heldObj ~= nil
m.faceAngle.y = m.area.camera.yaw + 0x8000
end
SV_HandleSpecialFloors(m,false)
local shouldCrouch = ((((m.controller.buttonDown & Z_TRIG) ~= 0 and m.health > 0xFF) or m.action == ACT_GROUND_POUND or m.action == ACT_DM_GROUND_POUND_METAL) and m.action ~= ACT_DM_WATER_MOVEMENT) or (gPlayerSyncTable[m.playerIndex].playerCrouching and m.ceilHeight < m.pos.y + m.marioObj.hitboxHeight)
if (DM_ACTION_FORCEANGLE[m.action] ~= nil and not cl_bowserthrow) then
m.faceAngle.y = m.area.camera.yaw + (0x8000*DM_ACTION_FORCEANGLE[m.action])
end
if (DM_ACTIONS_CROUCHAIR[m.action] == 1) then
if (shouldCrouch ~= gPlayerSyncTable[m.playerIndex].playerCrouching) then
if (shouldCrouch) then
m.pos.y = m.pos.y + sv_crouchoffset
else
if (m.pos.y - sv_crouchoffset < m.floorHeight) then
m.pos.y = m.floorHeight
else
m.pos.y = m.pos.y - sv_crouchoffset
end
end
end
end
gPlayerSyncTable[m.playerIndex].playerCrouching = shouldCrouch
if (m.action ~= ACT_SQUISHED) then gFirstPersonCamera.offset.y = ifelse(shouldCrouch, sv_camerayoffset-sv_crouchoffset, sv_camerayoffset) end
-- if (m.health <= 0xFF) then
gLakituState.roll = gLakituState.roll * 0.75
if (DM_ACTIONS_ALLOWGRAB[m.action] == 1 and no_dialog_open() and sv_interact) then
mario_handle_grab_and_punch_custom(m)
end
-- end
m.marioObj.hitboxHeight = ifelse(shouldCrouch, sv_playerheight-sv_crouchoffset, sv_playerheight)
local warp = obj_get_nearest_object_with_behavior_id(m.marioObj, id_bhvFadingWarp)
if warp ~= nil and m.heldObj == nil and m.action ~= ACT_TELEPORT_FADE_OUT and m.action ~= ACT_TELEPORT_FADE_IN and obj_check_hitbox_overlap(m.marioObj, warp) and vec3f_length(m.vel) < sv_stopspeed and gPlayerSyncTable[m.playerIndex].playerCrouching then
m.interactObj = warp
m.usedObj = warp
m.forwardVel = 0
set_mario_action(m, ACT_TELEPORT_FADE_OUT, 0)
m.controller.buttonDown = btnDown
m.controller.buttonPressed = btnPressed
frameCalculatedAngles = false
return false
end
m.controller.buttonDown = btnDown
m.controller.buttonPressed = btnPressed
frameCalculatedAngles = false
return true
end
function on_game_update(m)
local m = gMarioStates[0]
if (m == nil) then return end
m.peakHeight = m.pos.y
local a = m.action
if (DM_ACTION_DONT_OVERRIDE_FP[a] ~= 1) then set_first_person_enabled(true) end
-- remove_cutscenes(m)
gFirstPersonCamera.forceRoll = false
gFirstPersonCamera.fov = cl_fov
if (a == ACT_SQUISHED and m.ceil ~= nil) then
gFirstPersonCamera.offset.y = m.ceilHeight - m.pos.y - 120
end
if (intFix > 0) then intFix = intFix -1 end
end
--- commands
function mquake(msg)
if msg == 'list' then
djui_chat_message_create("\\#FFE0A0\\'/mq alt_walljump [on/off]'\\#FFFFFF\\ - Set alternate walljump key (Holding B)")
djui_chat_message_create("\\#FFE0A0\\'/mq predict [on/off]'\\#FFFFFF\\ - Set prediction for acceleration")
djui_chat_message_create("\\#FFE0A0\\'/mq moveset'\\#FFFFFF\\ - A short tutorial on the moveset")
djui_chat_message_create("\\#FFE0A0\\'/mq fov [45-120]'\\#FFFFFF\\ - Set the FOV")
return true
elseif msg == 'alt_walljump off' then
djui_chat_message_create("\\#FFE0A0\\Alternative Walljump Key:\\#FF1414\\ Off")
mod_storage_save_bool("mq_altwallj",false)
cl_altWalljumpKey = false
return true
elseif msg == 'predict off' then
djui_chat_message_create("\\#FFE0A0\\Acceleration Prediction:\\#FF1414\\ Off")
mod_storage_save_bool("mq_accelpred",true)
cl_disableAccelPred = true
return true
elseif msg == 'alt_walljump on' then
djui_chat_message_create("\\#FFE0A0\\Alternative Walljump Key:\\#14FF14\\ On")
mod_storage_save_bool("mq_altwallj",true)
cl_altWalljumpKey = true
return true
elseif msg == 'predict on' then
djui_chat_message_create("\\#FFE0A0\\Acceleration Prediction:\\#14FF14\\ On")
mod_storage_save_bool("mq_accelpred",true)
cl_disableAccelPred = true
return true
elseif msg == 'moveset' then
djui_chat_message_create("\\#FFE0A0\\Ground Pound - \\#FFFFFF\\Let go of (A) and press [Z] to start a ground pound.\nPressing [Z] again will cancell all horizontal velocity, sending you straight down!")
djui_chat_message_create("\\#FFE0A0\\Ground Pound Jump - \\#FFFFFF\\Hold (A) after starting a ground pound to ground pound jump when you land. \nThis converts some velocity to upwards momentum while carrying the rest!")
djui_chat_message_create("\\#FFE0A0\\Crouch Jump - \\#FFFFFF\\Continue to hold (A) after jumping then press and hold [Z] to stay in the air longer and land on higher up platforms!")
djui_chat_message_create("\\#FFE0A0\\Interacting - \\#FFFFFF\\Pressing (B) will interact with objects.\nLook at the object you wish to either punch, grab or talk to and press (B).\nHolding (B) will let you push metal boxes around and grab trees or poles!")
djui_chat_message_create("\\#FFE0A0\\Throwing Bowser - \\#FFFFFF\\To throw bowser, flick your view to the left or right and press (B)!")
return true
end
local space = string.find(msg,' ')
if (space == nil or space < 1) then return end
local args = {[1]=string.sub(msg,1,space-1),[2]=string.sub(msg,-(string.len(msg)-space))}
if (args[2] == nil or args[2] == "") then return false end
if (args[1] == nil or args[1] == "") then return false end
if args[1] == "fov" and args[2] ~= nil then
cl_fov = clampf(tonumber(args[2]),45,120)
mod_storage_save_number("mq_fov",cl_fov)
return true
end
return false
end
if (network_is_server()) then
function mquake_server(msg)
if msg == 'list' then
djui_chat_message_create("\\#A0FFE0\\'/mq_server StickySlope [on/off]'\\#FFFFFF\\ - Default is off")
djui_chat_message_create("\\#A0FFE0\\'/mq_server Accelerate [value]'\\#FFFFFF\\ - Default is 10")
djui_chat_message_create("\\#A0FFE0\\'/mq_server AirAccelerate [value]'\\#FFFFFF\\ - Default is 10")
djui_chat_message_create("\\#A0FFE0\\'/mq_server AirClamp [value]'\\#FFFFFF\\ - Default is 30")
djui_chat_message_create("\\#A0FFE0\\'/mq_server Gravity [value]'\\#FFFFFF\\ - Default is 800")
djui_chat_message_create("\\#A0FFE0\\'/mq_server PlayerSpeed [value]'\\#FFFFFF\\ - Default is 1.0")
djui_chat_message_create("\\#A0FFE0\\'/mq_server PlayerFriction [value]'\\#FFFFFF\\ - Default is 1.0")
djui_chat_message_create("\\#A0FFE0\\'/mq_server PlayerJumpHeight [value]'\\#FFFFFF\\ - Default is 1.0")
djui_chat_message_create("\\#A0FFE0\\'/mq_server GroundPound [on/off]'\\#FFFFFF\\ - Default is on")
djui_chat_message_create("\\#A0FFE0\\'/mq_server WallJump [on/off]'\\#FFFFFF\\ - Default is on")
djui_chat_message_create("\\#A0FFE0\\'/mq_server Interact [on/off]'\\#FFFFFF\\ - Default is on")
djui_chat_message_create("\\#A0FFE0\\'/mq_server SaveConfig [name]'\\#FFFFFF\\ - Save the current server settings to mod storage ")
djui_chat_message_create("\\#A0FFE0\\'/mq_server LoadConfig [name]'\\#FFFFFF\\ - Load settings from mod storage")
return true
end
local space = string.find(msg,' ')
if (space == nil or space < 1) then return end
local args = {[1]=string.sub(msg,1,space-1),[2]=string.sub(msg,-(string.len(msg)-space))}
if (args[2] == nil or args[2] == "") then return false end
if (args[1] == nil or args[1] == "") then return false end
if args[1] == "StickySlope" and args[2] ~= nil then
gGlobalSyncTable.Convar_StickySlope = args[2]=="on"
return true
end
if args[1] == "Accelerate" and args[2] ~= nil then
gGlobalSyncTable.Convar_Accelerate = tonumber(args[2])
return true
end
if args[1] == "AirAccelerate" and args[2] ~= nil then
gGlobalSyncTable.Convar_AirAccelerate = tonumber(args[2])
return true
end
if args[1] == "AirClamp" and args[2] ~= nil then
gGlobalSyncTable.Convar_AirClamp = tonumber(args[2])
return true
end
if args[1] == "Gravity" and args[2] ~= nil then
gGlobalSyncTable.Convar_Gravity = tonumber(args[2])
return true
end
if args[1] == "PlayerSpeed" and args[2] ~= nil then
gGlobalSyncTable.Convar_PlayerSpeed = tonumber(args[2])
return true
end
if args[1] == "PlayerFriction" and args[2] ~= nil then
gGlobalSyncTable.Convar_PlayerFriction = tonumber(args[2])
return true
end
if args[1] == "PlayerJumpHeight" and args[2] ~= nil then
gGlobalSyncTable.Convar_PlayerJumpHeight = tonumber(args[2])
return true
end
if args[1] == "GroundPound" and args[2] ~= nil then
gGlobalSyncTable.Convar_PlayerAllow_GroundPound = args[2]=="on"
return true
end
if args[1] == "WallJump" and args[2] ~= nil then
gGlobalSyncTable.Convar_PlayerAllow_WallJump = args[2]=="on"
return true
end
if args[1] == "Interact" and args[2] ~= nil then
gGlobalSyncTable.Convar_PlayerAllow_Interact = args[2]=="on"
return true
end
if args[1] == "SaveConfig" and args[2] ~= nil then
mod_storage_save_bool(args[2] .. ".ss",gGlobalSyncTable.Convar_StickySlope)
mod_storage_save_bool(args[2] .. ".gp",gGlobalSyncTable.Convar_PlayerAllow_GroundPound)
mod_storage_save_bool(args[2] .. ".wj",gGlobalSyncTable.Convar_PlayerAllow_WallJump)
mod_storage_save_bool(args[2] .. ".i",gGlobalSyncTable.Convar_PlayerAllow_Interact)
mod_storage_save_number(args[2] .. ".j",gGlobalSyncTable.Convar_PlayerJumpHeight)
mod_storage_save_number(args[2] .. ".f",gGlobalSyncTable.Convar_PlayerFriction)
mod_storage_save_number(args[2] .. ".s",gGlobalSyncTable.Convar_PlayerSpeed)
mod_storage_save_number(args[2] .. ".aa",gGlobalSyncTable.Convar_AirAccelerate)
mod_storage_save_number(args[2] .. ".a",gGlobalSyncTable.Convar_Accelerate)
mod_storage_save_number(args[2] .. ".ac",gGlobalSyncTable.Convar_AirClamp)
mod_storage_save_number(args[2] .. ".g",gGlobalSyncTable.Convar_Gravity)
djui_chat_message_create("\\#A0FFE0\\Saved settings to '" .. args[2] .. "'")
return true
end
if args[1] == "LoadConfig" and args[2] ~= nil then
if (mod_storage_load_number(args[2] .. ".s") ~= nil) then
gGlobalSyncTable.Convar_Gravity = mod_storage_load_number(args[2] .. ".g")
gGlobalSyncTable.Convar_Accelerate = mod_storage_load_number(args[2] .. ".a")
gGlobalSyncTable.Convar_AirAccelerate = mod_storage_load_number(args[2] .. ".aa")
gGlobalSyncTable.Convar_AirClamp = mod_storage_load_number(args[2] .. ".ac")
gGlobalSyncTable.Convar_PlayerSpeed = mod_storage_load_number(args[2] .. ".s")
gGlobalSyncTable.Convar_PlayerFriction = mod_storage_load_number(args[2] .. ".f")
gGlobalSyncTable.Convar_PlayerJumpHeight = mod_storage_load_number(args[2] .. ".j")
gGlobalSyncTable.Convar_PlayerAllow_GroundPound = mod_storage_load_bool(args[2] .. ".gp")
gGlobalSyncTable.Convar_PlayerAllow_WallJump = mod_storage_load_bool(args[2] .. ".wj")
gGlobalSyncTable.Convar_PlayerAllow_Interact = mod_storage_load_bool(args[2] .. ".i")
gGlobalSyncTable.Convar_StickySlope = mod_storage_load_bool(args[2] .. ".ss")
djui_chat_message_create("\\#A0FFE0\\Loaded settings from '" .. args[2] .. "'")
return true
end
end
end
else
function mquake_server(msg)
return false
end
end