mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-12-22 16:30:23 +00:00
Uncompile mQuake
This commit is contained in:
parent
fab85ec9cc
commit
57af112f37
22 changed files with 2690 additions and 3 deletions
585
mods/mquake/_mquake_a_constants.lua
Normal file
585
mods/mquake/_mquake_a_constants.lua
Normal file
|
@ -0,0 +1,585 @@
|
|||
if SM64COOPDX_VERSION == nil then
|
||||
local first = false
|
||||
hook_event(HOOK_ON_LEVEL_INIT, function()
|
||||
if not first then
|
||||
first = true
|
||||
play_sound(SOUND_MENU_CAMERA_BUZZ, { x = 0, y = 0, z = 0 })
|
||||
djui_chat_message_create("\\#ff7f7f\\mQuake is not supported with sm64ex-coop as it uses sm64coopdx exclusive Lua functionality.\n\\#dcdcdc\\To play this mod, try out sm64coopdx, at\n\\#7f7fff\\https://sm64coopdx.com")
|
||||
end
|
||||
end)
|
||||
return
|
||||
end
|
||||
local play_sound,clampf,allocate_mario_action,set_mario_action,vec3f_add,math_floor,get_id_from_behavior,obj_get_first,vec3f_dist,obj_get_next,obj_is_valid_for_interaction = play_sound,clampf,allocate_mario_action,set_mario_action,vec3f_add,math.floor,get_id_from_behavior,obj_get_first,vec3f_dist,obj_get_next,obj_is_valid_for_interaction
|
||||
|
||||
gLevelValues.fixCollisionBugs = 1
|
||||
gLevelValues.fixCollisionBugsFalseLedgeGrab = 1
|
||||
gLevelValues.fixCollisionBugsGroundPoundBonks = 1
|
||||
gLevelValues.fixCollisionBugsPickBestWall = 1
|
||||
gLevelValues.fixCollisionBugsRoundedCorners = 1
|
||||
gLevelValues.fixVanishFloors = 1
|
||||
gServerSettings.stayInLevelAfterStar = 2
|
||||
gServerSettings.bubbleDeath = 0
|
||||
|
||||
if (network_is_server()) then
|
||||
gGlobalSyncTable.Convar_StickySlope = false
|
||||
gGlobalSyncTable.Convar_Gravity = 800
|
||||
gGlobalSyncTable.Convar_AirAccelerate = 10
|
||||
gGlobalSyncTable.Convar_AirClamp = 30
|
||||
gGlobalSyncTable.Convar_Accelerate = 10
|
||||
gGlobalSyncTable.Convar_PlayerSpeed = 1.0
|
||||
gGlobalSyncTable.Convar_PlayerFriction = 1.0
|
||||
gGlobalSyncTable.Convar_PlayerJumpHeight = 1.0
|
||||
gGlobalSyncTable.Convar_PlayerAllow_GroundPound = true
|
||||
gGlobalSyncTable.Convar_PlayerAllow_WallJump = true
|
||||
gGlobalSyncTable.Convar_PlayerAllow_Interact = true
|
||||
|
||||
sv_sticky = false
|
||||
sv_maxspeed = 180
|
||||
sv_maxspeed_crouch = 80
|
||||
sv_maxspeed_water = 180
|
||||
sv_playerspeed = 90
|
||||
sv_playerspeed_water = 90
|
||||
sv_playerspeed_water_shell = 300
|
||||
sv_upspeed_water = 180
|
||||
sv_playerspeed_crouch = 40
|
||||
sv_airaccelerate_value = 10
|
||||
sv_accelerate = 10
|
||||
sv_playerclamp_air = 30
|
||||
sv_gravity = 800
|
||||
|
||||
sv_waterfriction = 2.5
|
||||
sv_friction = 4
|
||||
sv_crouchfriction_scale = 0
|
||||
|
||||
sv_groundpound = true
|
||||
sv_walljump = true
|
||||
sv_interact = true
|
||||
sv_jumpheight = 1.0
|
||||
else
|
||||
sv_sticky = nil
|
||||
sv_maxspeed = 0
|
||||
sv_maxspeed_crouch = 0
|
||||
sv_maxspeed_water = 0
|
||||
sv_maxvelocity = 0
|
||||
sv_playerspeed = 0
|
||||
sv_playerspeed_water = 0
|
||||
sv_playerspeed_water_shell = 0
|
||||
sv_upspeed_water = 0
|
||||
sv_playerspeed_crouch = 0
|
||||
sv_airaccelerate_value = 0
|
||||
sv_accelerate = 0
|
||||
sv_playerclamp_air = 0
|
||||
sv_gravity = 0
|
||||
|
||||
sv_waterfriction = 0
|
||||
sv_friction = 0
|
||||
sv_crouchfriction_scale = 0
|
||||
|
||||
sv_groundpound = nil
|
||||
sv_walljump = nil
|
||||
sv_interact = nil
|
||||
sv_jumpheight = nil
|
||||
end
|
||||
|
||||
interactOverrides = {
|
||||
[1]=function(m,o)end
|
||||
}
|
||||
throwOverrides = {
|
||||
[1]=function(m,o)end
|
||||
}
|
||||
dropOverrides = {
|
||||
[1]=function(m,o)end
|
||||
}
|
||||
|
||||
sv_maxvelocity = 1200
|
||||
sv_stopmovement = false
|
||||
sv_playerheight = 160
|
||||
sv_crouchoffset = 60
|
||||
sv_playersubmergelevel = 100
|
||||
sv_camerayoffset = 8
|
||||
sv_stopspeed = 20
|
||||
sv_tickrate = 1/30
|
||||
sv_gravity_scale = 0.5
|
||||
sv_gaccel_scale = 0.75
|
||||
sv_physics_scale = 2
|
||||
sv_scalerate_inverse = 4
|
||||
sv_scalerate = 1 / sv_scalerate_inverse
|
||||
|
||||
phys_friction_scale = sv_gaccel_scale * sv_physics_scale
|
||||
phys_airaccel_scale = 4
|
||||
|
||||
cl_grounddefacto = 1
|
||||
cl_localangles = {forward={x=0,y=0,z=0},right={x=0,y=0,z=0},rawForward={x=0,y=0,z=0}}
|
||||
cl_speedbuffer = {x=0,y=0,z=0}
|
||||
cl_upwarpfix_vel = {x=0,y=0,z=0}
|
||||
cl_upwarpfix_pos = {x=0,y=0,z=0}
|
||||
cl_bowserthrow = false
|
||||
cl_bowserthrow_previousYaw = 0
|
||||
cl_interacttimer = 0
|
||||
cl_red = 0
|
||||
cl_footstepTimer = 0
|
||||
cl_airstrafelimiter = 0
|
||||
cl_poleY = -1
|
||||
|
||||
cl_disableAccelPred = mod_storage_load_bool("mq_accelpred")
|
||||
cl_altWalljumpKey = mod_storage_load_bool("mq_altwallj")
|
||||
cl_fov = mod_storage_load_number("mq_fov")
|
||||
if (cl_fov < 40 or cl_fov == nil) then cl_fov = 90 end
|
||||
|
||||
-- Physics helpers
|
||||
SurfaceStandableMinimum = {
|
||||
[SURFACE_CLASS_NOT_SLIPPERY] = 0.01,
|
||||
[SURFACE_HARD_NOT_SLIPPERY] = 0.01,
|
||||
[SURFACE_CLASS_SLIPPERY] = 0.7,
|
||||
[SURFACE_HARD_SLIPPERY] = 0.7,
|
||||
[SURFACE_NO_CAM_COL_SLIPPERY] = 0.7,
|
||||
[SURFACE_NOISE_SLIPPERY] = 0.7,
|
||||
[SURFACE_SLIPPERY] = 0.7,
|
||||
[SURFACE_CLASS_VERY_SLIPPERY] = 0.8,
|
||||
[SURFACE_HARD_VERY_SLIPPERY] = 0.8,
|
||||
[SURFACE_NO_CAM_COL_VERY_SLIPPERY] = 0.8,
|
||||
[SURFACE_VERY_SLIPPERY] = 0.8,
|
||||
[SURFACE_NOISE_VERY_SLIPPERY] = 0.8,
|
||||
[SURFACE_NOISE_VERY_SLIPPERY_73] = 0.8,
|
||||
[SURFACE_NOISE_VERY_SLIPPERY_74] = 0.8
|
||||
}
|
||||
|
||||
|
||||
SurfaceFriction = {
|
||||
[SURFACE_CLASS_NOT_SLIPPERY] = 1.0,
|
||||
[SURFACE_HARD_NOT_SLIPPERY] = 1.0,
|
||||
[SURFACE_CLASS_SLIPPERY] = 0.8,
|
||||
[SURFACE_HARD_SLIPPERY] = 0.8,
|
||||
[SURFACE_NO_CAM_COL_SLIPPERY] = 0.8,
|
||||
[SURFACE_NOISE_SLIPPERY] = 0.8,
|
||||
[SURFACE_SLIPPERY] = 0.8,
|
||||
[SURFACE_CLASS_VERY_SLIPPERY] = 0.4,
|
||||
[SURFACE_HARD_VERY_SLIPPERY] = 0.4,
|
||||
[SURFACE_NO_CAM_COL_VERY_SLIPPERY] = 0.4,
|
||||
[SURFACE_VERY_SLIPPERY] = 0.4,
|
||||
[SURFACE_NOISE_VERY_SLIPPERY] = 0.4,
|
||||
[SURFACE_NOISE_VERY_SLIPPERY_73] = 0.4,
|
||||
[SURFACE_NOISE_VERY_SLIPPERY_74] = 0.4
|
||||
}
|
||||
|
||||
AreaTypeFriction = {
|
||||
[TERRAIN_SLIDE] = 0.225, -- incase i wanna give other types different friction values
|
||||
[TERRAIN_SNOW] = 0.90 -- incase i wanna give other types different friction values
|
||||
}
|
||||
AreaTypeStandable = {
|
||||
[TERRAIN_SLIDE] = 2.75,
|
||||
[TERRAIN_SNOW] = 1.10
|
||||
}
|
||||
|
||||
local function SV_GetAreaFriction(type)
|
||||
if AreaTypeFriction[type] ~= nil then return AreaTypeFriction[type] end
|
||||
return 1.0
|
||||
end
|
||||
local function SV_GetAreaStandable(type)
|
||||
if AreaTypeStandable[type] ~= nil then return AreaTypeStandable[type] end
|
||||
return 1.0
|
||||
end
|
||||
|
||||
function SV_GetSurfaceStandableMinimum(type,areaType)
|
||||
areaFactor = SV_GetAreaStandable(areaType)
|
||||
standableMinimum = 0.675
|
||||
if SurfaceStandableMinimum[type] ~= nil then standableMinimum = SurfaceStandableMinimum[type] end
|
||||
return clampf(standableMinimum * areaFactor,0.01,0.999)
|
||||
end
|
||||
|
||||
function SV_GetSurfaceStandableFrictionMultiplier(type,areaType)
|
||||
areaFactor = SV_GetAreaFriction(areaType)
|
||||
standableMinimum = 1.0
|
||||
if SurfaceFriction[type] ~= nil then standableMinimum = SurfaceFriction[type] end
|
||||
return clampf(standableMinimum * areaFactor,0.01,1.0)
|
||||
end
|
||||
|
||||
sv_gunmod_loaded = (_G.gunModApi ~= nil)
|
||||
|
||||
-- Actions
|
||||
ACT_DM_GROUNDED_MOVEMENT = allocate_mario_action(ACT_FLAG_MOVING | ACT_FLAG_CUSTOM_ACTION)
|
||||
ACT_DM_GROUNDED_IDLE = allocate_mario_action(ACT_FLAG_MOVING | ACT_FLAG_IDLE | ACT_FLAG_CUSTOM_ACTION) -- fix for reading signs while moving on accident
|
||||
ACT_DM_AIR_MOVEMENT = allocate_mario_action(ACT_GROUP_AIRBORNE | ACT_FLAG_MOVING | ACT_FLAG_AIR | ACT_FLAG_CUSTOM_ACTION)
|
||||
ACT_DM_GROUND_POUND_METAL = allocate_mario_action(ACT_GROUP_SUBMERGED | ACT_FLAG_ATTACKING | ACT_FLAG_MOVING | ACT_FLAG_CUSTOM_ACTION)
|
||||
ACT_DM_GROUNDED_MOVEMENT_METAL = allocate_mario_action(ACT_GROUP_SUBMERGED | ACT_FLAG_MOVING | ACT_FLAG_WATER_OR_TEXT | ACT_FLAG_CUSTOM_ACTION)
|
||||
ACT_DM_AIR_MOVEMENT_METAL = allocate_mario_action(ACT_GROUP_SUBMERGED | ACT_FLAG_MOVING | ACT_FLAG_WATER_OR_TEXT | ACT_FLAG_CUSTOM_ACTION)
|
||||
ACT_DM_WATER_MOVEMENT = allocate_mario_action(ACT_GROUP_SUBMERGED | ACT_FLAG_MOVING | ACT_FLAG_WATER_OR_TEXT | ACT_FLAG_CUSTOM_ACTION)
|
||||
ACT_DM_POLE_MOVEMENT = allocate_mario_action(ACT_GROUP_CUTSCENE | ACT_FLAG_MOVING | ACT_FLAG_CUSTOM_ACTION)
|
||||
|
||||
-- Action helpers
|
||||
DM_ACTIONS = {
|
||||
[ACT_DM_GROUNDED_MOVEMENT] = 1,
|
||||
[ACT_DM_GROUNDED_IDLE] = 1,
|
||||
[ACT_DM_AIR_MOVEMENT] = 1,
|
||||
[ACT_DM_GROUNDED_MOVEMENT_METAL] = 1,
|
||||
[ACT_DM_AIR_MOVEMENT_METAL] = 1,
|
||||
[ACT_DM_WATER_MOVEMENT] = 1,
|
||||
[ACT_DM_POLE_MOVEMENT] = 1,
|
||||
[ACT_TORNADO_TWIRLING] = 1,
|
||||
[ACT_DM_GROUND_POUND_METAL] = 1,
|
||||
[ACT_ELECTROCUTION] = 1,
|
||||
[ACT_QUICKSAND_DEATH] = 1,
|
||||
[ACT_SHOCKED] = 1,
|
||||
[ACT_GRABBED] = 1,
|
||||
[ACT_UNINITIALIZED] = 1,
|
||||
[ACT_PULLING_DOOR] = 1,
|
||||
[ACT_PUSHING_DOOR] = 1,
|
||||
[ACT_EMERGE_FROM_PIPE] = 1,
|
||||
[ACT_ENTERING_STAR_DOOR] = 1,
|
||||
[ACT_SUFFOCATION] = 1,
|
||||
[ACT_PUTTING_ON_CAP] = 1,
|
||||
[ACT_DEATH_EXIT] = 1,
|
||||
[ACT_DEATH_EXIT_LAND] = 1,
|
||||
[ACT_SQUISHED] = 1,
|
||||
[ACT_IDLE] = 1,
|
||||
[ACT_DISAPPEARED] = 1,
|
||||
[ACT_EXIT_AIRBORNE] = 1,
|
||||
[ACT_EXIT_LAND_SAVE_DIALOG] = 1,
|
||||
[ACT_HARD_BACKWARD_GROUND_KB] = 1,
|
||||
[ACT_FALLING_DEATH_EXIT] = 1,
|
||||
[ACT_FALLING_EXIT_AIRBORNE] = 1,
|
||||
[ACT_DEATH_ON_BACK] = 1,
|
||||
[ACT_DEATH_ON_STOMACH] = 1,
|
||||
[ACT_DROWNING] = 1,
|
||||
[ACT_BURNING_JUMP] = 1,
|
||||
[ACT_SPECIAL_DEATH_EXIT] = 1,
|
||||
[ACT_SPECIAL_EXIT_AIRBORNE] = 1,
|
||||
[ACT_IN_CANNON] = 1,
|
||||
[ACT_SHOT_FROM_CANNON] = 1,
|
||||
[ACT_WAITING_FOR_DIALOG] = 1,
|
||||
[ACT_READING_AUTOMATIC_DIALOG] = 1,
|
||||
[ACT_READING_NPC_DIALOG] = 1,
|
||||
[ACT_READING_SIGN] = 1,
|
||||
[ACT_GRAB_POLE_FAST] = 1,
|
||||
[ACT_GRAB_POLE_SLOW] = 1,
|
||||
[ACT_CLIMBING_POLE] = 1,
|
||||
[ACT_READING_SIGN] = 1,
|
||||
[ACT_HOLDING_POLE] = 1,
|
||||
[ACT_TOP_OF_POLE] = 1,
|
||||
[ACT_TOP_OF_POLE_JUMP] = 1,
|
||||
[ACT_WALL_KICK_AIR] = 1,
|
||||
[ACT_TOP_OF_POLE_TRANSITION] = 1,
|
||||
[ACT_GROUND_POUND] = 1, -- if marios y vel is low enough and you press crouch in the air while not holding jump, ground pound
|
||||
[ACT_GROUND_POUND_LAND] = 1, -- manually added, if this is detected we can do a ground pound jump :3
|
||||
[ACT_STANDING_DEATH] = 1,
|
||||
[ACT_INTRO_CUTSCENE] = 1,
|
||||
[ACT_CREDITS_CUTSCENE] = 1,
|
||||
[ACT_END_WAVING_CUTSCENE] = 1,
|
||||
[ACT_END_PEACH_CUTSCENE] = 1,
|
||||
[ACT_JUMBO_STAR_CUTSCENE] = 1,
|
||||
-- [ACT_SPAWN_NO_SPIN_AIRBORNE] = 1,
|
||||
[ACT_HOLDING_BOWSER] = 1,
|
||||
-- [ACT_SPAWN_SPIN_AIRBORNE] = 1,
|
||||
[ACT_CRAZY_BOX_BOUNCE] = 1,
|
||||
[ACT_BBH_ENTER_JUMP] = 1,
|
||||
[ACT_BBH_ENTER_SPIN] = 1,
|
||||
[ACT_THROWN_FORWARD] = 1,
|
||||
[ACT_THROWN_BACKWARD] = 1,
|
||||
[ACT_GETTING_BLOWN] = 1,
|
||||
[ACT_TELEPORT_FADE_IN] = 1,
|
||||
[ACT_TELEPORT_FADE_OUT] = 1
|
||||
}
|
||||
|
||||
DM_ACTIONS_CROUCHAIR = {
|
||||
[ACT_DM_AIR_MOVEMENT] = 1,
|
||||
[ACT_DM_AIR_MOVEMENT_METAL] = 1,
|
||||
[ACT_GROUND_POUND] = 1,
|
||||
[ACT_DM_GROUND_POUND_METAL] = 1
|
||||
}
|
||||
|
||||
DM_ACTIONS_ALLOWGRAB = {
|
||||
[ACT_DM_GROUNDED_MOVEMENT] = 1,
|
||||
[ACT_DM_GROUNDED_IDLE] = 1,
|
||||
[ACT_DM_AIR_MOVEMENT] = 1,
|
||||
[ACT_DM_GROUNDED_MOVEMENT_METAL] = 1,
|
||||
[ACT_DM_AIR_MOVEMENT_METAL] = 1,
|
||||
[ACT_DM_WATER_MOVEMENT] = 1,
|
||||
[ACT_GROUND_POUND] = 1,
|
||||
[ACT_DM_GROUND_POUND_METAL] = 1,
|
||||
[ACT_GROUND_POUND_LAND] = 1
|
||||
}
|
||||
|
||||
DM_ACTION_QPHYS = {
|
||||
[ACT_DM_GROUNDED_MOVEMENT] = 1,
|
||||
[ACT_DM_GROUNDED_IDLE] = 1,
|
||||
[ACT_DM_AIR_MOVEMENT] = 1,
|
||||
[ACT_DM_GROUNDED_MOVEMENT_METAL] = 1,
|
||||
[ACT_DM_AIR_MOVEMENT_METAL] = 1,
|
||||
[ACT_DM_WATER_MOVEMENT] = 1,
|
||||
[ACT_GROUND_POUND] = 1,
|
||||
[ACT_DM_GROUND_POUND_METAL] = 1,
|
||||
[ACT_DM_POLE_MOVEMENT] = 1
|
||||
}
|
||||
|
||||
DM_ACTION_DONT_OVERRIDE_FP = {}
|
||||
|
||||
DM_ACTION_FORCEANGLE = {
|
||||
[ACT_GRAB_POLE_FAST] = 1,
|
||||
[ACT_GRAB_POLE_SLOW] = 1,
|
||||
[ACT_CLIMBING_POLE] = 1,
|
||||
[ACT_HOLDING_POLE] = 1,
|
||||
[ACT_TOP_OF_POLE] = 1
|
||||
}
|
||||
|
||||
DM_ACTION_TRANSFERS = {
|
||||
[ACT_TOP_OF_POLE_JUMP] = 1,
|
||||
[ACT_WALL_KICK_AIR] = 1
|
||||
}
|
||||
|
||||
DM_ACTION_PREFUNCS = {
|
||||
[ACT_BURNING_JUMP] = function(m)
|
||||
m.hurtCounter = 8
|
||||
m.invincTimer = 10
|
||||
-- if (m == gMarioStates[0]) then
|
||||
gLakituState.roll = 1000
|
||||
gLakituState.oldRoll = gLakituState.roll
|
||||
cl_red = 128
|
||||
-- end
|
||||
return 1
|
||||
end,
|
||||
[ACT_IDLE] = function(m)
|
||||
if (m.prevAction ~= ACT_SHOCKED) then SV_PlayerMovement_Store(m,true) end
|
||||
end,
|
||||
[ACT_WATER_PLUNGE] = function(m)
|
||||
if (m.prevAction ~= ACT_IDLE) then SV_PlayerMovement_Store(m,true) end
|
||||
end,
|
||||
[ACT_TORNADO_TWIRLING] = function(m)
|
||||
m.vel.y = m.vel.y + 14 ; if (m.vel.y > 400) then m.vel.y = 400 end
|
||||
return 1
|
||||
end,
|
||||
[ACT_SHOCKED] = function(m)
|
||||
SV_PlayerMovement_Store(m,true)
|
||||
m.vel.y = m.vel.y * sv_scalerate
|
||||
end,
|
||||
[ACT_DEATH_ON_BACK] = function(m)
|
||||
gFirstPersonCamera.offset.y = -110
|
||||
gLakituState.roll = 0
|
||||
m.invincTimer = 0
|
||||
cl_red = 192
|
||||
end,
|
||||
[ACT_DEATH_ON_STOMACH] = function(m)
|
||||
gFirstPersonCamera.offset.y = -110
|
||||
gLakituState.roll = 0
|
||||
m.invincTimer = 0
|
||||
cl_red = 192
|
||||
end,
|
||||
[ACT_STANDING_DEATH] = function(m)
|
||||
gFirstPersonCamera.offset.y = -110
|
||||
gLakituState.roll = 0
|
||||
m.invincTimer = 0
|
||||
cl_red = 192
|
||||
end,
|
||||
[ACT_SUFFOCATION] = function(m)
|
||||
gFirstPersonCamera.offset.y = -110
|
||||
gLakituState.roll = 0
|
||||
m.invincTimer = 0
|
||||
cl_red = 192
|
||||
end,
|
||||
[ACT_DROWNING] = function(m)
|
||||
gFirstPersonCamera.offset.y = -110
|
||||
gLakituState.roll = 0
|
||||
m.invincTimer = 0
|
||||
cl_red = 192
|
||||
end,
|
||||
[ACT_ELECTROCUTION] = function(m)
|
||||
gFirstPersonCamera.offset.y = -110
|
||||
gLakituState.roll = 0
|
||||
m.invincTimer = 0
|
||||
cl_red = 192
|
||||
end,
|
||||
[ACT_TELEPORT_FADE_OUT] = function(m)
|
||||
m.vel.x = 0
|
||||
m.vel.y = 0
|
||||
m.vel.z = 0
|
||||
m.forwardVel = 0
|
||||
end,
|
||||
[ACT_ELECTROCUTION] = function(m)
|
||||
gFirstPersonCamera.offset.y = -110
|
||||
gLakituState.roll = 0
|
||||
m.invincTimer = 0
|
||||
cl_red = 192
|
||||
end,
|
||||
[ACT_QUICKSAND_DEATH] = function(m)
|
||||
gFirstPersonCamera.offset.y = -110
|
||||
gLakituState.roll = 0
|
||||
m.invincTimer = 0
|
||||
cl_red = 192
|
||||
end
|
||||
}
|
||||
|
||||
DM_ACTION_PREFUNCS_ALL = {
|
||||
[ACT_STAR_DANCE_EXIT] = function(m)
|
||||
return 1
|
||||
end
|
||||
}
|
||||
|
||||
DM_ACTION_FUNCTIONS = {
|
||||
[ACT_HARD_BACKWARD_GROUND_KB] = function(m)
|
||||
if (m.prevAction == ACT_SPECIAL_DEATH_EXIT) then m.healCounter = 32 end
|
||||
set_mario_action(m, ACT_DM_GROUNDED_MOVEMENT, 0)
|
||||
end,
|
||||
[ACT_DEATH_EXIT_LAND] = function(m)
|
||||
m.healCounter = 32
|
||||
set_mario_action(m, ACT_DM_GROUNDED_MOVEMENT, 0)
|
||||
end,
|
||||
[ACT_IDLE] = function(m)
|
||||
set_mario_action(m, ifelse(m.pos.y <= m.waterLevel-sv_playersubmergelevel,ifelse((m.flags & MARIO_METAL_CAP) ~= 0,ACT_DM_AIR_MOVEMENT_METAL,ACT_DM_WATER_MOVEMENT),ACT_DM_AIR_MOVEMENT), 0)
|
||||
end,
|
||||
[ACT_WATER_PLUNGE] = function(m)
|
||||
set_mario_action(m, ifelse((m.flags & MARIO_METAL_CAP) ~= 0,ACT_DM_AIR_MOVEMENT_METAL,ACT_DM_WATER_MOVEMENT), 0)
|
||||
end,
|
||||
[ACT_GETTING_BLOWN] = function(m)
|
||||
cl_airstrafelimiter = clampf(cl_airstrafelimiter + 0.256,0,2.5)
|
||||
vec3f_add(m.vel,{x=-coss(m.faceAngle.y)*75,y=50,z=-sins(m.faceAngle.y)*75})
|
||||
set_mario_action(m, ACT_DM_AIR_MOVEMENT, 0)
|
||||
end,
|
||||
[ACT_DM_WATER_MOVEMENT] = function(m)
|
||||
if (m.prevAction == ACT_WATER_PLUNGE or m.prevAction == ACT_IDLE or m.prevAction == ACT_IDLE) then SV_PlayerMovement_Store(m,false) end
|
||||
end
|
||||
}
|
||||
|
||||
--- General helper functions
|
||||
function ifelse(a,b,c)
|
||||
if (a) then return b else return c end
|
||||
end
|
||||
|
||||
function vec3_invert(a)
|
||||
_x = a.x * -1.0
|
||||
_y = a.y * -1.0
|
||||
_z = a.z * -1.0
|
||||
return {x=_x,y=_y,z=_z}
|
||||
end
|
||||
|
||||
function vec3_qscale(a,b,c,d)
|
||||
_x = a.x * b
|
||||
_y = a.y * c
|
||||
_z = a.z * d
|
||||
return {x=_x,y=_y,z=_z}
|
||||
end
|
||||
|
||||
function vec3_scale(a,b)
|
||||
_x = a.x * b
|
||||
_y = a.y * b
|
||||
_z = a.z * b
|
||||
return {x=_x,y=_y,z=_z}
|
||||
end
|
||||
|
||||
function s16(num)
|
||||
num = math.floor(num) & 0xFFFF
|
||||
if num >= 32768 then return num - 65536 end
|
||||
return num
|
||||
end
|
||||
|
||||
function mario_holding_underwater_shell(m) -- direction is true then we're checking a small range behind, otherwise we're checking the inverse of that range
|
||||
if (m.heldObj == nil) then return false end
|
||||
return get_id_from_behavior(m.heldObj.behavior) == id_bhvKoopaShellUnderwater
|
||||
end
|
||||
|
||||
function mario_is_within_object_angles(m, o, range, direction) -- direction is true then we're checking a small range behind, otherwise we're checking the inverse of that range
|
||||
local dx = o.oPosX - m.pos.x
|
||||
local dz = o.oPosZ - m.pos.z
|
||||
|
||||
local dYaw = s16(o.oMoveAngleYaw - atan2s(dz, dx))
|
||||
|
||||
if (dYaw >= -range and dYaw <= range) then
|
||||
return direction
|
||||
else
|
||||
return not direction
|
||||
end
|
||||
end
|
||||
|
||||
function should_push_or_pull_door(m, o)
|
||||
local dx = o.oPosX - m.pos.x
|
||||
local dz = o.oPosZ - m.pos.z
|
||||
|
||||
local dYaw = s16(o.oMoveAngleYaw - atan2s(dz, dx))
|
||||
|
||||
if (dYaw >= -0x4000 and dYaw <= 0x4000) then
|
||||
return 0x00000001
|
||||
else
|
||||
return 0x00000002
|
||||
end
|
||||
end
|
||||
|
||||
function get_object_closest_to_point(type,point)
|
||||
local closestObj = nil
|
||||
local obj = obj_get_first(type)
|
||||
local minDist = 0x20000
|
||||
while obj ~= nil do
|
||||
local objDist = vec3f_dist({x=obj.oPosX,y=obj.oPosY,z=obj.oPosZ}, point)
|
||||
if objDist < minDist then
|
||||
local rad = obj.hitboxRadius+16
|
||||
local hei = obj.hitboxHeight+16
|
||||
if (vec3f_dist({x=obj.oPosX,y=0,z=obj.oPosZ}, {x=point.x,y=0,z=point.z}) <= rad and point.y >= obj.oPosY and point.y <= obj.oPosY+hei) then
|
||||
closestObj = obj
|
||||
minDist = objDist
|
||||
end
|
||||
end
|
||||
obj = obj_get_next(obj)
|
||||
end
|
||||
return closestObj
|
||||
end
|
||||
|
||||
ObjectLists = {
|
||||
[0] = OBJ_LIST_PLAYER,
|
||||
[1] = OBJ_LIST_DESTRUCTIVE,
|
||||
[2] = OBJ_LIST_GENACTOR,
|
||||
[3] = OBJ_LIST_PUSHABLE,
|
||||
[4] = OBJ_LIST_LEVEL,
|
||||
[5] = OBJ_LIST_DEFAULT,
|
||||
[6] = OBJ_LIST_SURFACE,
|
||||
[7] = OBJ_LIST_POLELIKE,
|
||||
[8] = OBJ_LIST_SPAWNER,
|
||||
[9] = OBJ_LIST_UNIMPORTANT
|
||||
}
|
||||
ObjectHeightAddon = {
|
||||
[id_bhvPokey] = 30,
|
||||
[id_bhvPokeyBodyPart] = 50,
|
||||
[id_bhvGoomba] = 30,
|
||||
[id_bhvSmallBully] = 30,
|
||||
[id_bhvBobomb] = 30,
|
||||
[id_bhvBigBully] = 50,
|
||||
[id_bhvBigChillBully] = 50,
|
||||
[id_bhvBobombBuddy] = 50,
|
||||
[id_bhvMips] = 30,
|
||||
[id_bhvBoo] = 30,
|
||||
[id_bhvDoor] = 50,
|
||||
[id_bhvDoorWarp] = 50,
|
||||
[id_bhvStarDoor] = 50,
|
||||
[id_bhvBowser] = 80,
|
||||
[id_bhvKingBobomb] = 120,
|
||||
[id_bhvChuckya] = 120,
|
||||
}
|
||||
|
||||
function get_any_object_closest_to_point(point)
|
||||
local lastList = 0
|
||||
local closestObj = nil
|
||||
local obj = obj_get_first(ObjectLists[lastList])
|
||||
local minDist = 0x20000
|
||||
while obj ~= nil do
|
||||
if (obj_is_valid_for_interaction(obj)) then
|
||||
local objDist = vec3f_dist({x=obj.oPosX,y=obj.oPosY,z=obj.oPosZ}, point)
|
||||
if objDist < minDist then
|
||||
local offset = ObjectHeightAddon[get_id_from_behavior(obj.behavior)] ; if offset == nil then offset = 0 end
|
||||
local rad = obj.hitboxRadius+16
|
||||
local hei = obj.hitboxHeight+16+offset
|
||||
if (vec3f_dist({x=obj.oPosX,y=0,z=obj.oPosZ}, {x=point.x,y=0,z=point.z}) <= rad and point.y >= obj.oPosY and point.y <= obj.oPosY+hei) then
|
||||
closestObj = obj
|
||||
minDist = objDist
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
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
|
||||
return closestObj
|
||||
end
|
Binary file not shown.
Binary file not shown.
370
mods/mquake/_mquake_b_physics.lua
Normal file
370
mods/mquake/_mquake_b_physics.lua
Normal file
|
@ -0,0 +1,370 @@
|
|||
if SM64COOPDX_VERSION == nil then return end
|
||||
local collision_find_surface_on_ray,vec3f_dist,vec3f_sub,vec3f_dot,vec3f_project,vec3f_add,vec3f_copy,level_trigger_warp,vec3f_length,clampf,is_game_paused,vec3f_normalize,vec3f_mul = collision_find_surface_on_ray,vec3f_dist,vec3f_sub,vec3f_dot,vec3f_project,vec3f_add,vec3f_copy,level_trigger_warp,vec3f_length,clampf,is_game_paused,vec3f_normalize,vec3f_mul
|
||||
|
||||
|
||||
|
||||
-- Helper functions
|
||||
|
||||
-- Replaced with simplified quake code
|
||||
function PHYS_CollideWithNormal(vel,norm,bounceFactor)
|
||||
local backoff = vec3f_dot(vel,norm) * (1.0+bounceFactor)
|
||||
return {x=vel.x-(norm.x*backoff),y=vel.y-(norm.y*backoff),z=vel.z-(norm.z*backoff)}
|
||||
end
|
||||
|
||||
SV_PlayerMovement_Scale = function(m,prescaled)
|
||||
-- if (m.playerIndex ~= 0) then return end
|
||||
if (sv_stopmovement) then return end
|
||||
|
||||
if (prescaled) then
|
||||
m.vel.x = cl_speedbuffer.x
|
||||
m.vel.y = cl_speedbuffer.y
|
||||
m.vel.z = cl_speedbuffer.z
|
||||
else
|
||||
cl_speedbuffer.x = m.vel.x
|
||||
cl_speedbuffer.y = m.vel.y
|
||||
cl_speedbuffer.z = m.vel.z
|
||||
m.vel.x = m.vel.x * sv_scalerate
|
||||
m.vel.y = m.vel.y * sv_scalerate
|
||||
m.vel.z = m.vel.z * sv_scalerate
|
||||
end
|
||||
end
|
||||
|
||||
function SV_PlayerMovement_Store(m,store)
|
||||
if (m.playerIndex == 0) then
|
||||
if (store) then
|
||||
vec3f_copy(cl_upwarpfix_vel,m.vel)
|
||||
vec3f_copy(cl_upwarpfix_pos,m.pos)
|
||||
else
|
||||
vec3f_copy(m.vel,cl_upwarpfix_vel)
|
||||
vec3f_copy(m.pos,cl_upwarpfix_pos)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function SV_PlayerMovement_Relative(m)
|
||||
-- if (m.playerIndex ~= 0) then return end
|
||||
local obj = m.marioObj.platform
|
||||
if (obj ~= nil) then
|
||||
m.vel.y = m.vel.y + (obj.oVelY*4)
|
||||
end
|
||||
end
|
||||
|
||||
function SV_HandleSpecialFloors(m,bypassFloorCheck)
|
||||
if (m.floor ~= nil) then
|
||||
local type = m.floor.type
|
||||
if (type == SURFACE_VERTICAL_WIND) then
|
||||
m.vel.y = m.vel.y + 18
|
||||
if (m.vel.y < -24) then
|
||||
m.vel.y = -24
|
||||
end
|
||||
if (m.vel.y > 200) then
|
||||
m.vel.y = 200
|
||||
end
|
||||
return true
|
||||
end
|
||||
if (type == SURFACE_HORIZONTAL_WIND and DM_ACTION_QPHYS[m.action] == 1) then
|
||||
local pushAngle = m.floor.force << 8;
|
||||
|
||||
local amt = ifelse((m.action & ACT_FLAG_AIR) == 0,48,8)
|
||||
|
||||
m.vel.x = m.vel.x + (amt * sins(pushAngle))
|
||||
m.vel.z = m.vel.z + (amt * coss(pushAngle))
|
||||
return true
|
||||
end
|
||||
if (type == SURFACE_DEATH_PLANE or type == SURFACE_VERTICAL_WIND) and (m.pos.y < m.floorHeight + 2048) then
|
||||
if (level_trigger_warp(m, WARP_OP_WARP_FLOOR) == 20 and (m.flags & MARIO_UNKNOWN_18) ~= 0) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
if (type == SURFACE_BURNING) and (m.invincTimer == 0) and ((m.flags & MARIO_METAL_CAP == 0) and (((m.action & ACT_FLAG_AIR) == 0 and (m.input & INPUT_OFF_FLOOR) == 0) or bypassFloorCheck)) then
|
||||
m.hurtCounter = 8
|
||||
m.invincTimer = 15
|
||||
cl_red = 128
|
||||
end
|
||||
if (type == SURFACE_INSTANT_QUICKSAND or type == SURFACE_INSTANT_MOVING_QUICKSAND) and (m.invincTimer == 0) and ((m.flags & MARIO_METAL_CAP == 0) and (((m.action & ACT_FLAG_AIR) == 0 and (m.input & INPUT_OFF_FLOOR) == 0) or bypassFloorCheck)) then
|
||||
m.hurtCounter = 4
|
||||
m.invincTimer = 10
|
||||
cl_red = 128
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- Player angle system
|
||||
|
||||
frameCalculatedAngles = false
|
||||
local frameAngles = {}
|
||||
|
||||
function GetAngleVectors(m)
|
||||
local s = gPlayerSyncTable[m.playerIndex]
|
||||
|
||||
local yaw = gFirstPersonCamera.yaw+0x8000
|
||||
local pitch = -gFirstPersonCamera.pitch
|
||||
|
||||
if (m.playerIndex == 0) then
|
||||
s.playerYaw = yaw
|
||||
s.playerPitch = pitch
|
||||
if (frameCalculatedAngles) then return frameAngles end
|
||||
frameCalculatedAngles = true
|
||||
else
|
||||
yaw = s.playerYaw
|
||||
pitch = s.playerPitch
|
||||
end
|
||||
|
||||
local sinYaw = sins(yaw)
|
||||
local cosYaw = coss(yaw)
|
||||
|
||||
local yawRight = yaw-0x4000
|
||||
local cosYawRight = coss(yawRight)
|
||||
local sinYawRight = sins(yawRight)
|
||||
|
||||
local cosPitch = coss(pitch)
|
||||
local sinPitch = sins(pitch)
|
||||
|
||||
local _rawForward = {x=sinYaw*cosPitch,y=sinPitch,z=cosYaw*cosPitch} -- variable used this name, prevent old code from breaking; todo, rewrite?
|
||||
local _forward = {x=sinYaw,y=0,z=cosYaw}
|
||||
local _right = {x=sinYawRight,y=0,z=cosYawRight}
|
||||
|
||||
local returnValue = {
|
||||
rawForward=_rawForward,
|
||||
forward=_forward,
|
||||
right=_right
|
||||
}
|
||||
|
||||
if (m.playerIndex == 0) then
|
||||
frameAngles = returnValue
|
||||
end
|
||||
|
||||
return returnValue
|
||||
end
|
||||
|
||||
-- Important Functions
|
||||
|
||||
-- Acceleration / Friction
|
||||
function SV_UserFriction(m)
|
||||
-- if (m.playerIndex ~= 0) then return end
|
||||
local speed = vec3f_length(m.vel)
|
||||
if (speed <= 0.00001) then return end
|
||||
local friction = ((sv_friction*phys_friction_scale)+ifelse(gPlayerSyncTable[m.playerIndex].playerCrouching,sv_crouchfriction_scale,0))*SV_GetSurfaceStandableFrictionMultiplier(m.floor.type,m.area.terrainType)
|
||||
local control = nil
|
||||
|
||||
if (speed <= sv_stopspeed) then
|
||||
control = sv_stopspeed
|
||||
else
|
||||
control = speed
|
||||
end
|
||||
|
||||
local newspeed = speed - sv_tickrate*control*friction
|
||||
|
||||
if (newspeed < 0) then newspeed = 0 end
|
||||
if (newspeed > 0) then
|
||||
newspeed = newspeed / speed
|
||||
end
|
||||
m.vel.x = m.vel.x * newspeed
|
||||
m.vel.y = m.vel.y * newspeed
|
||||
m.vel.z = m.vel.z * newspeed
|
||||
end
|
||||
|
||||
-- Acceleration / Friction
|
||||
function SV_UserGravity(m,scale)
|
||||
m.vel.y = m.vel.y - (sv_gravity * sv_tickrate * scale * sv_gravity_scale)
|
||||
if (m.vel.y < -sv_gravity) then m.vel.y = -sv_gravity end
|
||||
end
|
||||
function SV_UserGravityEx(m,scale,minovr)
|
||||
m.vel.y = m.vel.y - (sv_gravity * sv_tickrate * scale * sv_gravity_scale)
|
||||
if (m.vel.y < -sv_gravity*minovr) then m.vel.y = -sv_gravity*minovr end
|
||||
end
|
||||
|
||||
function SV_Accelerate(m,wishDir,wishspeed)
|
||||
-- if (m.playerIndex ~= 0) then return end
|
||||
local addspeed,accelspeed,currentspeed = 0,0,0
|
||||
currentspeed = vec3f_dot(m.vel,wishDir)
|
||||
addspeed = wishspeed - currentspeed
|
||||
if (addspeed <= 0) then return end
|
||||
accelspeed = sv_accelerate * wishspeed * sv_tickrate
|
||||
if (accelspeed > addspeed) then accelspeed = addspeed end
|
||||
m.vel.x = m.vel.x + (accelspeed * wishDir.x)
|
||||
m.vel.y = m.vel.y + (accelspeed * wishDir.y)
|
||||
m.vel.z = m.vel.z + (accelspeed * wishDir.z)
|
||||
end
|
||||
|
||||
function SV_AirAccelerate(m,wishDir,wishspeed)
|
||||
-- Limiter code for wallkicks
|
||||
local airLimiter_Frac = (1.0-clampf(cl_airstrafelimiter,0.0,1.0))
|
||||
local addspeed,wishspd,accelspeed,currentspeed = 0,0,0,0
|
||||
|
||||
wishspd = wishspeed*airLimiter_Frac
|
||||
|
||||
-- Checks for a lack of acceleration
|
||||
if (wishspeed == 0) then return end
|
||||
if (wishspd > sv_playerclamp_air) then wishspd = sv_playerclamp_air end -- This is 30 in source, quake and other games
|
||||
|
||||
currentspeed = vec3f_dot(m.vel,wishDir)
|
||||
addspeed = wishspd - currentspeed
|
||||
|
||||
if (addspeed <= 0) then return end
|
||||
accelspeed = (sv_airaccelerate_value * phys_airaccel_scale) * (wishspd * airLimiter_Frac) * sv_tickrate
|
||||
|
||||
if (accelspeed > addspeed) then accelspeed = addspeed end
|
||||
m.vel.x = m.vel.x + ((accelspeed * wishDir.x)*airLimiter_Frac)
|
||||
m.vel.y = m.vel.y + ((accelspeed * wishDir.y)*airLimiter_Frac)
|
||||
m.vel.z = m.vel.z + ((accelspeed * wishDir.z)*airLimiter_Frac)
|
||||
end
|
||||
|
||||
-- Main movement functions
|
||||
|
||||
function SV_PlayerMovement(m)
|
||||
-- if (m.playerIndex ~= 0) then return end
|
||||
if (sv_stopmovement) then return end
|
||||
|
||||
local isPrediction = m.playerIndex ~= 0
|
||||
|
||||
-- if (isPrediction) then return end
|
||||
|
||||
local crouch = gPlayerSyncTable[m.playerIndex].playerCrouching
|
||||
local playerSpeed = ifelse(crouch,sv_playerspeed_crouch,sv_playerspeed)
|
||||
local maxSpeed = ifelse(crouch,sv_maxspeed_crouch,sv_maxspeed)
|
||||
|
||||
local vecInput = {x=0,y=0,z=0}
|
||||
if ((not is_game_paused()) and m.health > 0xFF and not cl_bowserthrow and not cl_bowserthrow and not (not no_dialog_open() and not isPrediction)) then
|
||||
vecInput.x = m.controller.rawStickX
|
||||
vecInput.y = m.controller.rawStickY
|
||||
end
|
||||
|
||||
if (not isPrediction) then
|
||||
vec3f_normalize(vecInput)
|
||||
vec3f_mul(vecInput,m.controller.stickMag)
|
||||
end
|
||||
|
||||
local fmove = (vecInput.y/32)*playerSpeed -- what are the maximums of these again?
|
||||
local smove = (vecInput.x/32)*playerSpeed
|
||||
-- local fmove = (vecInput.y/64)*playerSpeed -- what are the maximums of these again?
|
||||
-- local smove = (vecInput.x/64)*playerSpeed
|
||||
|
||||
local wishVel = {x=0,y=0,z=0}
|
||||
local wishDir = {x=0,y=0,z=0}
|
||||
|
||||
local AngledVectors = GetAngleVectors(m)
|
||||
|
||||
wishVel.x = (AngledVectors.forward.x * fmove) + (AngledVectors.right.x * smove)
|
||||
wishVel.y = (AngledVectors.forward.y * fmove) + (AngledVectors.right.y * smove)
|
||||
wishVel.z = (AngledVectors.forward.z * fmove) + (AngledVectors.right.z * smove)
|
||||
|
||||
|
||||
if (not isPrediction) then
|
||||
if (m.action == ACT_DM_GROUNDED_MOVEMENT or m.action == ACT_DM_GROUNDED_MOVEMENT_METAL or m.action == ACT_DM_GROUNDED_IDLE) then
|
||||
wishVel.y = 0
|
||||
if (m.floor ~= nil) then
|
||||
local tempNormal = vec3_invert(m.floor.normal)
|
||||
tempNormal.y = 0 ; vec3f_normalize(tempNormal)
|
||||
local amount = (cl_grounddefacto * clampf(vec3f_dot(wishVel,tempNormal),0,1)) * m.floor.normal.y
|
||||
vec3f_sub(wishVel,vec3_scale(vec3f_project(wishVel, m.floor.normal), amount))
|
||||
vec3f_add(wishVel,vec3_scale(m.floor.normal, amount*0.125))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local wishspeed = vec3f_length(wishVel)
|
||||
vec3f_copy(wishDir, wishVel)
|
||||
vec3f_normalize(wishDir)
|
||||
if wishspeed > maxSpeed then
|
||||
wishVel.x = wishVel.x * (maxSpeed / wishspeed)
|
||||
wishVel.y = wishVel.y * (maxSpeed / wishspeed)
|
||||
wishVel.z = wishVel.z * (maxSpeed / wishspeed)
|
||||
wishspeed = maxSpeed
|
||||
end
|
||||
if (m.action == ACT_DM_GROUNDED_MOVEMENT or m.action == ACT_DM_GROUNDED_MOVEMENT_METAL or m.action == ACT_DM_GROUNDED_IDLE) then
|
||||
SV_UserFriction(m,wishDir,wishspeed)
|
||||
SV_Accelerate(m,wishDir,wishspeed)
|
||||
elseif (m.action == ACT_DM_AIR_MOVEMENT or m.action == ACT_DM_AIR_MOVEMENT_METAL) then
|
||||
SV_AirAccelerate(m,wishDir,wishspeed)
|
||||
end
|
||||
|
||||
local finalVelLen = vec3f_length(m.vel)
|
||||
if finalVelLen > sv_maxvelocity then
|
||||
m.vel.x = m.vel.x * (sv_maxvelocity / finalVelLen)
|
||||
m.vel.y = m.vel.y * (sv_maxvelocity / finalVelLen)
|
||||
m.vel.z = m.vel.z * (sv_maxvelocity / finalVelLen)
|
||||
end
|
||||
end
|
||||
|
||||
function SV_WaterMovement(m)
|
||||
-- if (m.playerIndex ~= 0) then return end
|
||||
if (sv_stopmovement) then return end
|
||||
|
||||
local isPrediction = m.playerIndex ~= 0
|
||||
|
||||
local shellSpeed = mario_holding_underwater_shell(m)
|
||||
|
||||
local playerSpeed = ifelse(shellSpeed,sv_playerspeed_water_shell,sv_playerspeed_water)
|
||||
|
||||
local vecInput = {x=0,y=0,z=0}
|
||||
if ((not is_game_paused()) and m.health > 0xFF) then
|
||||
vecInput.x = m.controller.rawStickX
|
||||
vecInput.y = m.controller.rawStickY
|
||||
end
|
||||
|
||||
if (not isPrediction) then
|
||||
vec3f_normalize(vecInput)
|
||||
vec3f_mul(vecInput,m.controller.stickMag)
|
||||
end
|
||||
|
||||
local fmove = (vecInput.y/32)*playerSpeed
|
||||
local smove = (vecInput.x/32)*playerSpeed
|
||||
local umove = 0
|
||||
if (m.controller.buttonDown & A_BUTTON ~= 0) then umove = umove+1 end
|
||||
if (m.controller.buttonDown & Z_TRIG ~= 0) then umove = umove-1 end
|
||||
|
||||
local wishVel = {x=0,y=0,z=0}
|
||||
|
||||
local AngledVectors = GetAngleVectors(m)
|
||||
|
||||
wishVel.x = (AngledVectors.rawForward.x * fmove) + (AngledVectors.right.x * smove)
|
||||
wishVel.y = (AngledVectors.rawForward.y * fmove) + (AngledVectors.right.y * smove)
|
||||
wishVel.z = (AngledVectors.rawForward.z * fmove) + (AngledVectors.right.z * smove)
|
||||
|
||||
if (fmove < 0.1 and smove < 0.1 and umove == 0) then
|
||||
wishVel.y = wishVel.y - 30
|
||||
else
|
||||
wishVel.y = wishVel.y + sv_upspeed_water * umove
|
||||
end
|
||||
|
||||
local wishspeed = vec3f_length(wishVel)
|
||||
|
||||
local maxspeed = ifelse(shellSpeed,sv_playerspeed_water_shell,sv_maxspeed_water)
|
||||
|
||||
if (wishspeed > maxspeed) then
|
||||
vec3f_mul(wishVel,maxspeed/wishspeed)
|
||||
wishspeed = maxspeed
|
||||
end
|
||||
wishspeed = wishspeed * 0.85
|
||||
--
|
||||
-- water friction
|
||||
--
|
||||
local speed = vec3f_length(m.vel)
|
||||
local newspeed = 0
|
||||
|
||||
if (speed > 0.00001) then
|
||||
newspeed = speed - sv_tickrate * speed * sv_waterfriction
|
||||
if (newspeed < 0) then newspeed = 0 end
|
||||
vec3f_mul(m.vel,newspeed/speed)
|
||||
end
|
||||
|
||||
--
|
||||
-- water acceleration
|
||||
--
|
||||
if (wishspeed < 0.00001) then return end
|
||||
|
||||
local addspeed = wishspeed - newspeed
|
||||
|
||||
if (addspeed <= 0) then return end
|
||||
|
||||
vec3f_normalize(wishVel)
|
||||
local accelspeed = (sv_accelerate * wishspeed) * sv_tickrate
|
||||
if (accelspeed > addspeed) then accelspeed = addspeed end
|
||||
|
||||
m.vel.x = m.vel.x + (accelspeed * wishVel.x)
|
||||
m.vel.y = m.vel.y + (accelspeed * wishVel.y)
|
||||
m.vel.z = m.vel.z + (accelspeed * wishVel.z)
|
||||
|
||||
end
|
Binary file not shown.
Binary file not shown.
313
mods/mquake/_mquake_c_moveset_functions.lua
Normal file
313
mods/mquake/_mquake_c_moveset_functions.lua
Normal file
|
@ -0,0 +1,313 @@
|
|||
if SM64COOPDX_VERSION == nil then return end
|
||||
local get_dialog_box_state,get_dialog_id,disable_time_stop,save_file_get_flags,get_id_from_behavior,save_file_get_total_star_count,get_current_save_file_num,max,level_trigger_warp,obj_is_attackable,obj_is_breakable_object,obj_is_bully,obj_is_exclamation_box,bhv_spawn_star_no_level_exit,mario_drop_held_object,absf_2,clampf,set_mario_action,vec3f_add,mario_grab_used_object,mario_throw_held_object,play_character_sound,obj_is_grabbable,play_sound = get_dialog_box_state,get_dialog_id,disable_time_stop,save_file_get_flags,get_id_from_behavior,save_file_get_total_star_count,get_current_save_file_num,max,level_trigger_warp,obj_is_attackable,obj_is_breakable_object,obj_is_bully,obj_is_exclamation_box,bhv_spawn_star_no_level_exit,mario_drop_held_object,absf_2,clampf,set_mario_action,vec3f_add,mario_grab_used_object,mario_throw_held_object,play_character_sound,obj_is_grabbable,play_sound
|
||||
|
||||
cutsceneActns = {
|
||||
[ACT_WAITING_FOR_DIALOG] = 1,
|
||||
[ACT_READING_AUTOMATIC_DIALOG] = 1,
|
||||
[ACT_READING_NPC_DIALOG] = 1,
|
||||
[ACT_READING_SIGN] = 1,
|
||||
[ACT_INTRO_CUTSCENE] = 1,
|
||||
[ACT_JUMBO_STAR_CUTSCENE] = 1,
|
||||
[ACT_CREDITS_CUTSCENE] = 1,
|
||||
[ACT_END_WAVING_CUTSCENE] = 1,
|
||||
[ACT_IN_CANNON] = 1,
|
||||
[ACT_SPAWN_NO_SPIN_AIRBORNE] = 1,
|
||||
[ACT_SPAWN_SPIN_AIRBORNE] = 1,
|
||||
[ACT_SHOT_FROM_CANNON] = 1,
|
||||
[ACT_END_PEACH_CUTSCENE] = 1
|
||||
}
|
||||
|
||||
function obj_activate_door(m,door,bhv)
|
||||
if (m.action == ACT_DM_WATER_MOVEMENT) then return false end
|
||||
|
||||
if door ~= nil then
|
||||
local flags = save_file_get_flags()
|
||||
-- local bhv = get_id_from_behavior(door)
|
||||
if bhv == id_bhvDoor then
|
||||
local doorStars = door.oBehParams >> 24
|
||||
if (doorStars <= save_file_get_total_star_count(get_current_save_file_num()-1,0,255)) then
|
||||
door.oAction = 1
|
||||
door.header.gfx.animInfo.animFrame = max(door.header.gfx.animInfo.animFrame, 25)
|
||||
end
|
||||
return true
|
||||
elseif bhv == id_bhvDoorWarp then
|
||||
local wDoorID = door.oBehParams >> 24
|
||||
if (wDoorID == 1 and (flags & SAVE_FLAG_UNLOCKED_UPSTAIRS_DOOR) == 0) then
|
||||
return true
|
||||
end
|
||||
if (wDoorID == 2 and (flags & SAVE_FLAG_UNLOCKED_BASEMENT_DOOR) == 0) then
|
||||
return true
|
||||
end
|
||||
door.oAction = 2
|
||||
door.header.gfx.animInfo.animFrame = max(door.header.gfx.animInfo.animFrame, 10)
|
||||
m.interactObj = door
|
||||
m.usedObj = door
|
||||
m.actionArg = should_push_or_pull_door(m, door)
|
||||
level_trigger_warp(m, WARP_OP_WARP_DOOR)
|
||||
return true
|
||||
elseif (not obj_is_attackable(door)) and (not obj_is_breakable_object(door)) and (not obj_is_bully(door)) and (not obj_is_exclamation_box(door)) and (not obj_is_attackable(door)) and door.oAction == 0 then
|
||||
local doorStars = door.oBehParams >> 24
|
||||
if (doorStars <= save_file_get_total_star_count(get_current_save_file_num()-1,0,255)) then
|
||||
door.oInteractStatus = 0x00010000
|
||||
end
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function obj_is_toad(m,toad,bhv)
|
||||
if (m.action == ACT_DM_WATER_MOVEMENT) then return false end
|
||||
|
||||
if toad ~= nil and bhv == id_bhvToadMessage then
|
||||
local stars = save_file_get_total_star_count(get_current_save_file_num()-1,0,255)
|
||||
|
||||
if (toad.oToadMessageDialogId == gBehaviorValues.dialogs.ToadStar1Dialog and stars >= gBehaviorValues.ToadStar1Requirement) then
|
||||
toad.oToadMessageDialogId = gBehaviorValues.dialogs.ToadStar1AfterDialog;
|
||||
bhv_spawn_star_no_level_exit(m.marioObj, 0, true);
|
||||
return true
|
||||
end
|
||||
|
||||
if (toad.oToadMessageDialogId == gBehaviorValues.dialogs.ToadStar2Dialog and stars >= gBehaviorValues.ToadStar2Requirement) then
|
||||
toad.oToadMessageDialogId = gBehaviorValues.dialogs.ToadStar2AfterDialog;
|
||||
bhv_spawn_star_no_level_exit(m.marioObj, 1, true);
|
||||
return true
|
||||
end
|
||||
|
||||
if (toad.oToadMessageDialogId == gBehaviorValues.dialogs.ToadStar3Dialog and stars >= gBehaviorValues.ToadStar3Requirement) then
|
||||
toad.oToadMessageDialogId = gBehaviorValues.dialogs.ToadStar3AfterDialog;
|
||||
bhv_spawn_star_no_level_exit(m.marioObj, 2, true);
|
||||
return true
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function held_obj_update(m)
|
||||
local obj = m.heldObj
|
||||
local bhv = get_id_from_behavior(obj.behavior)
|
||||
|
||||
if (bhv == id_bhvBobomb) then
|
||||
if (obj.oBobombFuseTimer >= 151) then
|
||||
mario_drop_held_object(m)
|
||||
end
|
||||
end
|
||||
|
||||
if (bhv == id_bhvKoopaShellUnderwater) then
|
||||
if (obj.oTimer >= 601 or m.action ~= ACT_DM_WATER_MOVEMENT) then
|
||||
mario_drop_held_object(m)
|
||||
end
|
||||
obj.oTimer = obj.oTimer + 1
|
||||
end
|
||||
end
|
||||
|
||||
function mario_throw_object_ext(m,ang)
|
||||
local obj = m.heldObj
|
||||
local bhv = get_id_from_behavior(obj.behavior)
|
||||
|
||||
if (bhv == id_bhvBowser and cl_bowserthrow) then
|
||||
local curFaceAngle = m.faceAngle.y
|
||||
m.faceAngle.y = m.area.camera.yaw + 0x8000
|
||||
mario_drop_held_object(m)
|
||||
obj.oPosX = m.marioBodyState.heldObjLastPosition.x
|
||||
obj.oPosY = m.marioBodyState.heldObjLastPosition.y
|
||||
obj.oPosZ = m.marioBodyState.heldObjLastPosition.z
|
||||
|
||||
-- Todo ; How do we fix this shit maintaining the velocity?
|
||||
|
||||
m.marioObj.oAngleVelYaw = 0
|
||||
m.marioObj.oMoveAnglePitch = 0
|
||||
obj.oForwardVel = 0
|
||||
obj.oVelY = 0
|
||||
obj.oBowserHeldAngleVelYaw = clampf(absf_2(s16(cl_bowserthrow_previousYaw-curFaceAngle)),0x10,0x1000)
|
||||
obj.oBowserHeldAnglePitch = clampf(-absf_2(s16(cl_bowserthrow_previousYaw-curFaceAngle)),-0x1000,-0x400)
|
||||
|
||||
network_send_object(obj,true)
|
||||
return true
|
||||
end
|
||||
|
||||
if (bhv == id_bhvJumpingBox) then
|
||||
mario_drop_held_object(m)
|
||||
|
||||
set_mario_action(m, ACT_DM_AIR_MOVEMENT, 0)
|
||||
|
||||
vec3f_add(m.vel,vec3_scale(ang.forward,300))
|
||||
vec3f_add(m.vel,{x=0,y=500,z=0})
|
||||
|
||||
obj.oPosX = m.pos.x
|
||||
obj.oPosY = m.pos.y
|
||||
obj.oPosZ = m.pos.z
|
||||
return true
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function mario_drop_object_ext(m,ang)
|
||||
local obj = m.heldObj
|
||||
local bhv = get_id_from_behavior(obj.behavior)
|
||||
|
||||
if (bhv == id_bhvJumpingBox) then
|
||||
return mario_throw_object_ext(m,ang)
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function mario_grab_used_object_ext(m,ang)
|
||||
local o = m.usedObj
|
||||
local bhv = get_id_from_behavior(o.behavior)
|
||||
|
||||
if (bhv == id_bhvBowser) then
|
||||
if (not mario_is_within_object_angles(m, o, 0x2000, true)) then return false end
|
||||
cl_bowserthrow = true
|
||||
o.oForwardVel = 0
|
||||
o.oVelY = 0
|
||||
|
||||
o.oBowserHeldAngleVelYaw = 0
|
||||
o.oBowserHeldAnglePitch = 0
|
||||
o.oMoveAnglePitch = 0
|
||||
o.oMoveAngleYaw = 0
|
||||
o.oForwardVelS32 = 0
|
||||
o.oForwardVel = 0
|
||||
|
||||
m.marioObj.oAngleVelYaw = 0
|
||||
m.marioObj.oMoveAnglePitch = 0
|
||||
m.marioObj.oMoveAngleYaw = 0
|
||||
m.marioObj.oForwardVelS32 = 0
|
||||
m.marioObj.oForwardVel = 0
|
||||
end
|
||||
|
||||
if (bhv == id_bhvKingBobomb) then
|
||||
if (not mario_is_within_object_angles(m, o, 0x2000, true)) then return false end
|
||||
|
||||
mario_grab_used_object(m)
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
if (bhv == id_bhvChuckya) then
|
||||
if (not mario_is_within_object_angles(m, o, 0x2000, true)) then return false end
|
||||
|
||||
mario_grab_used_object(m)
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
if (bhv == id_bhvKoopaShellUnderwater) then
|
||||
if (m.action ~= ACT_DM_WATER_MOVEMENT) then return false end
|
||||
o.oTimer = 0 -- ten seconds
|
||||
end
|
||||
|
||||
mario_grab_used_object(m)
|
||||
return o == m.heldObj
|
||||
end
|
||||
|
||||
function mario_handle_grab_and_punch_custom(m)
|
||||
if m.heldByObj ~= nil then return end
|
||||
if m == nil then return end
|
||||
|
||||
local pressedB = (m.controller.buttonPressed & B_BUTTON) ~= 0
|
||||
local pressedZ = (m.controller.buttonPressed & Z_TRIG) ~= 0
|
||||
|
||||
local ang = nil
|
||||
|
||||
if m.heldObj ~= nil and cutsceneActns[m.action] ~= 1 then
|
||||
if (ang == nil) then ang = GetAngleVectors(m) end
|
||||
local obj = m.heldObj
|
||||
if (cl_bowserthrow) then
|
||||
m.marioBodyState.heldObjLastPosition.x = m.area.camera.pos.x + (ang.forward.x * (160+(obj.hitboxRadius*0.5)))
|
||||
m.marioBodyState.heldObjLastPosition.y = m.area.camera.pos.y + (ang.forward.y * (160+(obj.hitboxRadius*0.5))) - (obj.hitboxHeight*0.5) + 64
|
||||
m.marioBodyState.heldObjLastPosition.z = m.area.camera.pos.z + (ang.forward.z * (160+(obj.hitboxRadius*0.5)))
|
||||
else
|
||||
m.marioBodyState.heldObjLastPosition.x = m.area.camera.pos.x + (ang.rawForward.x * (160+(obj.hitboxRadius*0.5))) + (m.vel.x*0.25)
|
||||
m.marioBodyState.heldObjLastPosition.y = m.area.camera.pos.y + ((ang.rawForward.y * (160+(obj.hitboxRadius*0.5))) + (m.vel.y*0.25)) - (obj.hitboxHeight*0.5)
|
||||
m.marioBodyState.heldObjLastPosition.z = m.area.camera.pos.z + (ang.rawForward.z * (160+(obj.hitboxRadius*0.5))) + (m.vel.z*0.25)
|
||||
end
|
||||
end
|
||||
|
||||
m.controller.buttonPressed = m.controller.buttonPressed & ~(B_BUTTON|Z_TRIG)
|
||||
if (pressedB) then
|
||||
if (ang == nil) then ang = GetAngleVectors(m) end
|
||||
if m.heldObj ~= nil then
|
||||
local bhv = get_id_from_behavior(m.heldObj.behavior)
|
||||
if (throwOverrides[bhv] ~= nil) then
|
||||
if (throwOverrides[bhv](m,m.heldObj)) then return end
|
||||
end
|
||||
if not mario_throw_object_ext(m,ang) then
|
||||
local curFaceAngle = m.faceAngle.y
|
||||
local obj = m.heldObj
|
||||
m.faceAngle.y = m.area.camera.yaw + 0x8000
|
||||
mario_throw_held_object(m)
|
||||
obj.oPosX = m.marioBodyState.heldObjLastPosition.x
|
||||
obj.oPosY = m.marioBodyState.heldObjLastPosition.y
|
||||
obj.oPosZ = m.marioBodyState.heldObjLastPosition.z
|
||||
obj.oVelX = (ang.rawForward.x * 160) + (m.vel.x*sv_scalerate)
|
||||
obj.oVelY = (ang.rawForward.y * 160) + (m.vel.x*sv_scalerate)
|
||||
obj.oVelZ = (ang.rawForward.z * 160) + (m.vel.x*sv_scalerate)
|
||||
obj.oMoveAnglePitch = gLakituState.oldPitch
|
||||
obj.oMoveAngleYaw = m.faceAngle.y
|
||||
obj.oMoveAngleRoll = 0
|
||||
obj.oFaceAnglePitch = 0
|
||||
obj.oFaceAngleYaw = m.faceAngle.y
|
||||
obj.oFaceAngleRoll = 0
|
||||
m.faceAngle.y = curFaceAngle
|
||||
end
|
||||
elseif (cl_interacttimer == 0) then
|
||||
-- play_character_sound(m,CHAR_SOUND_PUNCH_HOO)
|
||||
-- cl_interacttimer = 5
|
||||
m.marioBodyState.heldObjLastPosition.x = m.area.camera.pos.x + (ang.rawForward.x * 160)
|
||||
m.marioBodyState.heldObjLastPosition.y = m.area.camera.pos.y + (ang.rawForward.y * 160)
|
||||
m.marioBodyState.heldObjLastPosition.z = m.area.camera.pos.z + (ang.rawForward.z * 160)
|
||||
local target = get_any_object_closest_to_point(m.marioBodyState.heldObjLastPosition)
|
||||
if (target ~= nil) then
|
||||
local bhv = get_id_from_behavior(target.behavior)
|
||||
if (interactOverrides[bhv] ~= nil) then
|
||||
if (interactOverrides[bhv](m,target)) then return end
|
||||
end
|
||||
if (not obj_activate_door(m,target,bhv) and not obj_is_toad(m,target,bhv)) then
|
||||
if (obj_is_grabbable(target)) then
|
||||
m.interactObj = target
|
||||
m.usedObj = target
|
||||
if (not mario_grab_used_object_ext(m,ang)) then
|
||||
m.interactObj = nil
|
||||
m.usedObj = nil
|
||||
end
|
||||
elseif (obj_is_attackable(target) or obj_is_exclamation_box(target) or obj_is_bully(target) or obj_is_breakable_object(target)) then
|
||||
m.interactObj = target
|
||||
m.usedObj = target
|
||||
target.oInteractStatus = INT_STATUS_INTERACTED | INT_STATUS_WAS_ATTACKED | ATTACK_PUNCH
|
||||
play_character_sound(m,CHAR_SOUND_PUNCH_HOO)
|
||||
end
|
||||
end
|
||||
else
|
||||
play_sound(CAM_SOUND_UNUSED_SELECT_FIXED, m.pos)
|
||||
end
|
||||
end
|
||||
end
|
||||
if (pressedZ) then
|
||||
if m.heldObj ~= nil then
|
||||
local bhv = get_id_from_behavior(m.heldObj.behavior)
|
||||
if (dropOverrides[bhv] ~= nil) then
|
||||
if (dropOverrides[bhv](m,m.heldObj)) then return end
|
||||
end
|
||||
if (not mario_drop_object_ext(m,ang)) then
|
||||
local curFaceAngle = m.faceAngle.y
|
||||
local obj = m.heldObj
|
||||
m.faceAngle.y = m.area.camera.yaw + 0x8000
|
||||
mario_drop_held_object(m)
|
||||
obj.oPosX = m.marioBodyState.heldObjLastPosition.x
|
||||
obj.oPosY = m.marioBodyState.heldObjLastPosition.y
|
||||
obj.oPosZ = m.marioBodyState.heldObjLastPosition.z
|
||||
obj.oMoveAnglePitch = gLakituState.oldPitch
|
||||
obj.oMoveAngleYaw = m.faceAngle.y
|
||||
obj.oMoveAngleRoll = 0
|
||||
obj.oFaceAnglePitch = 0
|
||||
obj.oFaceAngleYaw = m.faceAngle.y
|
||||
obj.oFaceAngleRoll = 0
|
||||
m.faceAngle.y = curFaceAngle
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Binary file not shown.
Binary file not shown.
517
mods/mquake/_mquake_d_actions.lua
Normal file
517
mods/mquake/_mquake_d_actions.lua
Normal file
|
@ -0,0 +1,517 @@
|
|||
if SM64COOPDX_VERSION == nil then return end
|
||||
local play_step_sound,set_mario_action,play_character_sound,vec3f_length,perform_ground_step,vec3f_copy,perform_air_step,clampf,vec3f_add,set_mario_particle_flags,play_mario_heavy_landing_sound = play_step_sound,set_mario_action,play_character_sound,vec3f_length,perform_ground_step,vec3f_copy,perform_air_step,clampf,vec3f_add,set_mario_particle_flags,play_mario_heavy_landing_sound
|
||||
|
||||
|
||||
|
||||
local function play_local_footstep_sounds(m,rate,max)
|
||||
cl_footstepTimer = cl_footstepTimer + rate
|
||||
if (cl_footstepTimer >= max) then
|
||||
m.marioObj.header.gfx.animInfo.animFrame = 0
|
||||
play_step_sound(m, 0, 1)
|
||||
cl_footstepTimer = 0
|
||||
end
|
||||
end
|
||||
|
||||
-------------------------------
|
||||
-- Code for our local player --
|
||||
-------------------------------
|
||||
|
||||
--- @param m MarioState
|
||||
local function local_act_dm_grounded_movement(m)
|
||||
local valid_update = local_update(m)
|
||||
|
||||
local metal_underwater = (m.flags & MARIO_METAL_CAP) ~= 0 and m.pos.y <= m.waterLevel-sv_playersubmergelevel
|
||||
local crouch = gPlayerSyncTable[m.playerIndex].playerCrouching
|
||||
|
||||
if (metal_underwater and m.action ~= ACT_DM_GROUNDED_MOVEMENT_METAL) then
|
||||
SV_PlayerMovement_Store(m,true)
|
||||
set_mario_action(m, ACT_DM_GROUNDED_MOVEMENT_METAL, 0)
|
||||
m.action = ACT_DM_GROUNDED_MOVEMENT_METAL
|
||||
SV_PlayerMovement_Store(m,false)
|
||||
-- return
|
||||
elseif (m.action == ACT_DM_GROUNDED_MOVEMENT_METAL and not metal_underwater) then
|
||||
set_mario_action(m, ACT_DM_GROUNDED_MOVEMENT, 0)
|
||||
m.action = ACT_DM_GROUNDED_MOVEMENT
|
||||
-- return
|
||||
end
|
||||
|
||||
if (m.floor ~= nil) then
|
||||
if (m.floor.normal.y <= SV_GetSurfaceStandableMinimum(m.floor.type,m.area.terrainType)) then
|
||||
SV_PlayerMovement_Relative(m)
|
||||
set_mario_action(m, ACT_DM_AIR_MOVEMENT, 0)
|
||||
act_dm_air_movement(m)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
if (m.controller.buttonDown & A_BUTTON) ~= 0 and no_dialog_open() and m.floor ~= nil then
|
||||
set_character_animation(m, CHAR_ANIM_IDLE_HEAD_CENTER)
|
||||
|
||||
-- m.controller.buttonPressed = m.controller.buttonPressed & ~A_BUTTON
|
||||
|
||||
if (m.vel.y < 0) then m.vel.y = m.vel.y * 0.33 end
|
||||
|
||||
m.vel.y = m.vel.y + ifelse(metal_underwater,135*sv_jumpheight,140*sv_jumpheight)
|
||||
|
||||
if (m.vel.y > 320*sv_jumpheight) then m.vel.y = 320*sv_jumpheight end
|
||||
|
||||
play_mario_jump_sound(m)
|
||||
|
||||
SV_PlayerMovement_Relative(m)
|
||||
|
||||
-- SV_PlayerMovement_Store(m,true)
|
||||
|
||||
set_mario_action(m, ACT_DM_AIR_MOVEMENT, 0)
|
||||
act_dm_air_movement(m)
|
||||
return
|
||||
end
|
||||
|
||||
SV_PlayerMovement(m)
|
||||
|
||||
set_character_animation(m, CHAR_ANIM_A_POSE)
|
||||
if (not cl_bowserthrow) then
|
||||
local len = vec3f_length(vec3_qscale(m.vel,1,0,1))
|
||||
if (len < 1) then
|
||||
m.faceAngle.y = m.area.camera.yaw + 0x8000
|
||||
if (m.action == ACT_DM_GROUNDED_MOVEMENT) then m.action = ACT_DM_GROUNDED_IDLE end
|
||||
else
|
||||
play_local_footstep_sounds(m,len * 0.08,60)
|
||||
m.faceAngle.y = atan2s(m.vel.z, m.vel.x)
|
||||
if (m.action == ACT_DM_GROUNDED_IDLE) then m.action = ACT_DM_GROUNDED_MOVEMENT end
|
||||
end
|
||||
end
|
||||
|
||||
if (valid_update) then
|
||||
m.forwardVel = vec3f_length(vec3_qscale(m.vel,sv_scalerate,0,sv_scalerate))
|
||||
else m.forwardVel = 0 end
|
||||
|
||||
SV_PlayerMovement_Scale(m,false)
|
||||
local stepResult = perform_ground_step(m)
|
||||
SV_PlayerMovement_Scale(m,true)
|
||||
|
||||
if (stepResult == GROUND_STEP_LEFT_GROUND) then
|
||||
SV_PlayerMovement_Relative(m)
|
||||
if (m.action == ACT_DM_GROUNDED_MOVEMENT_METAL) then
|
||||
set_mario_action(m, ACT_DM_AIR_MOVEMENT_METAL, 0)
|
||||
else
|
||||
set_mario_action(m, ACT_DM_AIR_MOVEMENT, 0)
|
||||
end
|
||||
end
|
||||
|
||||
if m.wall ~= nil and (stepResult == GROUND_STEP_HIT_WALL) then --or (stepResult == GROUND_STEP_HIT_WALL_CONTINUE_QSTEPS) or (stepResult == GROUND_STEP_HIT_WALL_STOP_QSTEPS)) then
|
||||
vec3f_copy(m.vel, PHYS_CollideWithNormal(m.vel,m.wall.normal,0.0))
|
||||
end
|
||||
|
||||
if (m.pos.y <= m.waterLevel-sv_playersubmergelevel and m.waterLevel > m.floorHeight + sv_playersubmergelevel) and (m.flags & MARIO_METAL_CAP) == 0 then
|
||||
if (m.action == ACT_DM_GROUNDED_MOVEMENT_METAL) then
|
||||
set_mario_action(m, ACT_DM_AIR_MOVEMENT_METAL, 0)
|
||||
else
|
||||
set_mario_action(m, ACT_DM_WATER_MOVEMENT, 0)
|
||||
end
|
||||
end
|
||||
end
|
||||
--- @param m MarioState
|
||||
local function local_act_dm_air_movement(m)
|
||||
local valid_update = local_update(m)
|
||||
-- AngleVectors(m)
|
||||
local metal_underwater = (m.flags & MARIO_METAL_CAP) ~= 0 and m.pos.y <= m.waterLevel-sv_playersubmergelevel
|
||||
local act = m.action
|
||||
local crouch = gPlayerSyncTable[m.playerIndex].playerCrouching
|
||||
|
||||
if (metal_underwater and act ~= ACT_DM_AIR_MOVEMENT_METAL) then
|
||||
SV_PlayerMovement_Store(m,true)
|
||||
set_mario_action(m, ACT_DM_AIR_MOVEMENT_METAL, 0)
|
||||
m.action = ACT_DM_AIR_MOVEMENT_METAL
|
||||
SV_PlayerMovement_Store(m,false)
|
||||
-- return
|
||||
elseif (act == ACT_DM_AIR_MOVEMENT_METAL and not metal_underwater) then
|
||||
set_mario_action(m, ACT_DM_AIR_MOVEMENT, 0)
|
||||
m.action = ACT_DM_AIR_MOVEMENT
|
||||
-- return
|
||||
end
|
||||
|
||||
if (m.controller.buttonPressed & Z_TRIG) ~= 0 and (m.controller.buttonDown & A_BUTTON) == 0 and sv_groundpound and m.heldObj == nil and no_dialog_open() then --and m.prevAction ~= ACT_DM_WATER_MOVEMENT then
|
||||
m.vel.y = 0
|
||||
m.controller.buttonPressed = m.controller.buttonPressed & ~Z_TRIG
|
||||
set_mario_action(m, ifelse(metal_underwater,ACT_DM_GROUND_POUND_METAL,ACT_GROUND_POUND), 1)
|
||||
play_sound(SOUND_ACTION_TWIRL,m.marioObj.header.gfx.cameraToObject)
|
||||
return
|
||||
end
|
||||
|
||||
SV_PlayerMovement(m)
|
||||
|
||||
local len_spd = vec3f_length(vec3_qscale(m.vel,1,0,1))
|
||||
|
||||
if (len_spd < 1) then
|
||||
m.faceAngle.y = m.area.camera.yaw + 0x8000
|
||||
else
|
||||
m.faceAngle.y = atan2s(m.vel.z, m.vel.x)
|
||||
end
|
||||
set_character_animation(m, CHAR_ANIM_A_POSE)
|
||||
|
||||
if (metal_underwater) then
|
||||
SV_UserGravity(m,0.66)
|
||||
else
|
||||
SV_UserGravity(m,1.0)
|
||||
end
|
||||
|
||||
if ((m.flags & MARIO_WING_CAP) ~= 0 and (m.controller.buttonPressed & A_BUTTON) ~= 0) and no_dialog_open() then
|
||||
if (m.vel.y < 0) then m.vel.y = 0 end
|
||||
m.vel.y = m.vel.y + ifelse(metal_underwater,100,200)
|
||||
if (m.vel.y > 320) then m.vel.y = 320 end
|
||||
set_mario_particle_flags(m, (PARTICLE_DUST | PARTICLE_MIST_CIRCLE), false)
|
||||
end
|
||||
|
||||
local preStepYVel = m.vel.y
|
||||
|
||||
if (valid_update) then
|
||||
m.forwardVel = len_spd*sv_scalerate
|
||||
else m.forwardVel = 0 end
|
||||
|
||||
SV_PlayerMovement_Scale(m,false)
|
||||
local stepResult = perform_air_step(m,0)
|
||||
SV_PlayerMovement_Scale(m,true)
|
||||
|
||||
if (stepResult == AIR_STEP_LANDED) then
|
||||
if (m.floor ~= nil) then
|
||||
if (m.floor.normal.y > SV_GetSurfaceStandableMinimum(m.floor.type,m.area.terrainType) and ifelse(sv_sticky,m.vel.y < (sv_gravity*sv_tickrate)*2,true)) then
|
||||
vec3f_copy(m.vel, PHYS_CollideWithNormal(m.vel,m.floor.normal,0.0))
|
||||
-- SV_PlayerMovement_Store(m,true)
|
||||
|
||||
cl_airstrafelimiter = 0
|
||||
m.marioObj.header.gfx.animInfo.animFrame = 0
|
||||
play_step_sound(m, 0, 1)
|
||||
gLakituState.roll = gLakituState.roll + clampf(-1.75*(preStepYVel+200),0,1000)
|
||||
|
||||
if (m.action == ACT_DM_AIR_MOVEMENT_METAL) then
|
||||
set_mario_action(m, ACT_DM_GROUNDED_MOVEMENT_METAL, 0)
|
||||
else
|
||||
set_mario_action(m, ACT_DM_GROUNDED_MOVEMENT, 0)
|
||||
end
|
||||
return
|
||||
else
|
||||
vec3f_copy(m.vel, PHYS_CollideWithNormal(m.vel,m.floor.normal,0))
|
||||
vec3f_add(m.pos,vec3_scale(m.floor.normal,6))
|
||||
-- vec3f_add(m.vel,vec3_scale(m.floor.normal,clampf(preStepYVel*0.75,-1,1)))
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
if (stepResult == AIR_STEP_HIT_WALL) and m.wall ~= nil then
|
||||
if (m.controller.buttonDown & ifelse(cl_altWalljumpKey,B_BUTTON,A_BUTTON)) ~= 0 and sv_walljump and no_dialog_open() and m.heldObj == nil and len_spd > 100 then
|
||||
cl_airstrafelimiter = 0.66
|
||||
vec3f_copy(m.vel, PHYS_CollideWithNormal(m.vel,m.wall.normal,0.965))
|
||||
set_mario_particle_flags(m, (PARTICLE_VERTICAL_STAR | PARTICLE_DUST), false)
|
||||
m.vel.y = 250*sv_jumpheight
|
||||
play_sound(SOUND_ACTION_BONK,m.marioObj.header.gfx.cameraToObject)
|
||||
play_character_sound(m,CHAR_SOUND_YAH_WAH_HOO)
|
||||
else
|
||||
vec3f_copy(m.vel, PHYS_CollideWithNormal(m.vel,m.wall.normal,0.05))
|
||||
end
|
||||
end
|
||||
|
||||
if (m.pos.y <= m.waterLevel-sv_playersubmergelevel and m.waterLevel > m.floorHeight + sv_playersubmergelevel) and (m.flags & MARIO_METAL_CAP) == 0 then
|
||||
if (m.action ~= ACT_DM_AIR_MOVEMENT_METAL) then
|
||||
set_mario_action(m, ACT_DM_WATER_MOVEMENT, 0)
|
||||
end
|
||||
end
|
||||
end
|
||||
--- @param m MarioState
|
||||
local function local_act_dm_water_movement(m)
|
||||
local valid_update = local_update(m)
|
||||
-- AngleVectors(m)
|
||||
SV_WaterMovement(m)
|
||||
|
||||
SV_PlayerMovement_Store(m,true)
|
||||
|
||||
if (m.playerIndex == 0) then
|
||||
if (vec3f_length(vec3_qscale(m.vel,1,0,1)) < 1) then
|
||||
m.faceAngle.y = m.area.camera.yaw + 0x8000
|
||||
else
|
||||
m.faceAngle.y = atan2s(m.vel.z, m.vel.x)
|
||||
end
|
||||
set_character_animation(m, CHAR_ANIM_A_POSE)
|
||||
else
|
||||
local scale = m.forwardVel
|
||||
if (scale < 10) then
|
||||
set_character_animation(m, CHAR_ANIM_WATER_IDLE)
|
||||
else
|
||||
set_character_anim_with_accel(m, CHAR_ANIM_FLUTTERKICK, scale*0x800)
|
||||
end
|
||||
end
|
||||
|
||||
if (valid_update) then
|
||||
m.forwardVel = vec3f_length(vec3_qscale(m.vel,sv_scalerate,0,sv_scalerate))
|
||||
else m.forwardVel = 0 end
|
||||
|
||||
if (m.pos.y+(m.vel.y*sv_scalerate) < m.floorHeight + 2) then
|
||||
m.pos.y = m.floorHeight + 2
|
||||
m.vel.y = 0
|
||||
end
|
||||
|
||||
SV_PlayerMovement_Scale(m,false)
|
||||
local stepResult = perform_air_step(m,0)
|
||||
SV_PlayerMovement_Scale(m,true)
|
||||
|
||||
if (stepResult == AIR_STEP_HIT_WALL) and m.wall ~= nil then
|
||||
vec3f_copy(m.vel, PHYS_CollideWithNormal(m.vel,m.wall.normal,0.05))
|
||||
end
|
||||
|
||||
local isSnowy = ((m.area.terrainType & TERRAIN_MASK) == TERRAIN_SNOW)
|
||||
|
||||
if (m.area.camera.pos.y >= m.waterLevel - 15 and not isSnowy) or mario_holding_underwater_shell(m) then
|
||||
m.healCounter = 1
|
||||
if (m.controller.buttonDown & A_BUTTON) ~= 0 and m.vel.y > 0 then
|
||||
m.vel.y = 180
|
||||
end
|
||||
elseif (not mario_holding_underwater_shell(m)) then
|
||||
m.health = m.health - ifelse(isSnowy,3,1)
|
||||
end
|
||||
|
||||
if (m.pos.y > m.waterLevel-sv_playersubmergelevel) then
|
||||
set_mario_action(m, ACT_DM_AIR_MOVEMENT, 0)
|
||||
return
|
||||
end
|
||||
end
|
||||
--- @param m MarioState
|
||||
local function local_act_dm_ground_pound(m)
|
||||
local valid_update = local_update(m)
|
||||
|
||||
local metal_underwater = (m.flags & MARIO_METAL_CAP) ~= 0 and m.pos.y <= m.waterLevel-sv_playersubmergelevel
|
||||
|
||||
if (metal_underwater and act ~= ACT_DM_GROUND_POUND_METAL) then
|
||||
SV_PlayerMovement_Store(m,true)
|
||||
set_mario_action(m, ACT_DM_GROUND_POUND_METAL, 0)
|
||||
SV_PlayerMovement_Store(m,false)
|
||||
elseif (act == ACT_DM_AIR_MOVEMENT_METAL and not metal_underwater) then
|
||||
set_mario_action(m, ACT_DM_GROUND_POUND, 0)
|
||||
end
|
||||
|
||||
if (m.controller.buttonPressed & Z_TRIG) ~= 0 then
|
||||
m.vel.x = 0
|
||||
m.vel.z = 0
|
||||
end
|
||||
|
||||
m.faceAngle.y = m.area.camera.yaw + 0x8000
|
||||
set_character_animation(m, CHAR_ANIM_A_POSE)
|
||||
|
||||
SV_UserGravityEx(m,1.0,0.75)
|
||||
|
||||
SV_PlayerMovement_Scale(m,false)
|
||||
local stepResult = perform_air_step(m,0)
|
||||
SV_PlayerMovement_Scale(m,true)
|
||||
|
||||
if (stepResult == AIR_STEP_LANDED) then
|
||||
if (m.floor ~= nil) then
|
||||
play_mario_heavy_landing_sound(m, SOUND_ACTION_TERRAIN_HEAVY_LANDING)
|
||||
set_mario_particle_flags(m, (PARTICLE_MIST_CIRCLE | PARTICLE_HORIZONTAL_STAR), false)
|
||||
gLakituState.roll = gLakituState.roll + 500
|
||||
if (m.controller.buttonDown & A_BUTTON) ~= 0 and m.health > 0xFF then
|
||||
SV_HandleSpecialFloors(m,true)
|
||||
|
||||
local direction = GetAngleVectors(m).forward
|
||||
local yV = m.vel.y * 0.32 * sv_scalerate
|
||||
local len = vec3f_length(vec3_qscale(m.vel,1,0,1))
|
||||
|
||||
vec3f_copy(m.vel,vec3_scale(direction,len*0.895))
|
||||
|
||||
vec3f_add(m.vel,vec3_qscale(m.floor.normal,-0.3,85 * clampf((len+math.abs(yV)) / 320, 0.5, 1.0),-0.3))
|
||||
|
||||
m.vel.y = (m.vel.y + (250 * clampf((len+math.abs(yV)) / 320, 0.65, 1.0)))*sv_jumpheight
|
||||
-- PHYS_CollideWithNormal(m.vel,m.floor.normal,0.0,1.0)
|
||||
|
||||
set_mario_action(m, ifelse(metal_underwater,ACT_DM_AIR_MOVEMENT_METAL,ACT_DM_AIR_MOVEMENT), 0)
|
||||
play_character_sound(m,CHAR_SOUND_YAHOO)
|
||||
else
|
||||
m.forwardVel = 0
|
||||
m.vel.x = 0
|
||||
m.vel.y = 0
|
||||
m.vel.z = 0
|
||||
set_mario_action(m, ifelse(metal_underwater,ACT_DM_GROUNDED_MOVEMENT_METAL,ACT_GROUND_POUND_LAND), 0)
|
||||
end
|
||||
return;
|
||||
end
|
||||
end
|
||||
end
|
||||
--- @param m MarioState
|
||||
local function local_act_dm_pole_movement(m)
|
||||
local_update(m)
|
||||
|
||||
m.vel.x = 0
|
||||
m.vel.z = 0
|
||||
|
||||
if (m.health <= 0xFF or m.usedObj == nil or (m.controller.buttonPressed & Z_TRIG) ~= 0) then
|
||||
m.vel.y = 0
|
||||
m.forwardVel = 3
|
||||
m.controller.buttonPressed = m.controller.buttonPressed & ~(Z_TRIG|A_BUTTON)
|
||||
return set_mario_action(m, ACT_DM_AIR_MOVEMENT, 0)
|
||||
end
|
||||
|
||||
m.faceAngle.y = m.area.camera.yaw + 0x8000
|
||||
|
||||
if (m.controller.buttonPressed & A_BUTTON) ~= 0 then
|
||||
m.vel.y = 12
|
||||
m.forwardVel = 36
|
||||
return set_mario_action(m, ACT_WALL_KICK_AIR, 0)
|
||||
end
|
||||
|
||||
set_character_animation(m, CHAR_ANIM_A_POSE)
|
||||
|
||||
local o = m.usedObj
|
||||
local i = ifelse(gFirstPersonCamera.pitch < 0,1.0,-1.0)
|
||||
m.pos.y = m.pos.y + (m.usedObj.oPosY-cl_poleY)
|
||||
cl_poleY = m.usedObj.oPosY
|
||||
|
||||
m.pos.x = o.oPosX + sins(m.faceAngle.y)
|
||||
m.pos.z = o.oPosZ + coss(m.faceAngle.y)
|
||||
|
||||
m.vel.y = m.controller.rawStickY*0.66*i
|
||||
local intendedPos = m.pos.y + (m.vel.y*sv_scalerate)
|
||||
|
||||
if (intendedPos < o.oPosY) then
|
||||
m.vel.y = 0
|
||||
m.pos.y = o.oPosY
|
||||
end
|
||||
|
||||
if (intendedPos > o.oPosY+o.hitboxHeight) then
|
||||
m.vel.y = 0
|
||||
m.pos.y = o.oPosY+o.hitboxHeight
|
||||
end
|
||||
|
||||
SV_PlayerMovement_Scale(m,false)
|
||||
local stepResult = perform_air_step(m,0)
|
||||
SV_PlayerMovement_Scale(m,true)
|
||||
end
|
||||
|
||||
|
||||
----------------------------------
|
||||
-- Prediction for other players --
|
||||
----------------------------------
|
||||
|
||||
--- @param m MarioState
|
||||
local function prediction_act_dm_grounded_movement(m)
|
||||
local crouch = gPlayerSyncTable[m.playerIndex].playerCrouching
|
||||
|
||||
if ((m.controller.buttonDown & A_BUTTON) ~= 0 or (m.controller.buttonPressed & A_BUTTON) ~= 0) and m.floor ~= nil then
|
||||
play_character_sound(m,CHAR_SOUND_YAH_WAH_HOO)
|
||||
-- return
|
||||
end
|
||||
|
||||
if (not cl_disableAccelPred) then SV_PlayerMovement(m) end
|
||||
|
||||
local scale = m.forwardVel
|
||||
if (scale < 5) then
|
||||
set_character_animation(m, ifelse(crouch,CHAR_ANIM_CROUCHING,CHAR_ANIM_FIRST_PERSON))
|
||||
else
|
||||
play_step_sound(m, ifelse(crouch,26,9), ifelse(crouch,79,45))
|
||||
set_character_anim_with_accel(m, ifelse(crouch,CHAR_ANIM_CRAWLING,CHAR_ANIM_RUNNING), scale*ifelse(crouch,0x4000,0x2600))
|
||||
end
|
||||
|
||||
m.forwardVel = vec3f_length(vec3_qscale(m.vel,sv_scalerate,0,sv_scalerate))
|
||||
|
||||
SV_PlayerMovement_Scale(m,false)
|
||||
|
||||
local stepResult = perform_ground_step(m)
|
||||
|
||||
SV_PlayerMovement_Scale(m,true)
|
||||
end
|
||||
--- @param m MarioState
|
||||
local function prediction_act_dm_air_movement(m)
|
||||
local crouch = gPlayerSyncTable[m.playerIndex].playerCrouching
|
||||
|
||||
if (not cl_disableAccelPred) then SV_PlayerMovement(m) end
|
||||
|
||||
set_character_animation(m, ifelse(crouch,CHAR_ANIM_FAST_LONGJUMP,ifelse(m.vel.y < 0,CHAR_ANIM_DOUBLE_JUMP_FALL,CHAR_ANIM_DOUBLE_JUMP_RISE)))
|
||||
|
||||
if (metal_underwater) then
|
||||
SV_UserGravity(m,0.66)
|
||||
else
|
||||
SV_UserGravity(m,1.0)
|
||||
end
|
||||
|
||||
if ((m.flags & MARIO_WING_CAP) ~= 0 and (m.controller.buttonDown & A_BUTTON) ~= 0 and m.vel.y < 0) then m.vel.y = 0 end
|
||||
|
||||
m.forwardVel = vec3f_length(vec3_qscale(m.vel,sv_scalerate,0,sv_scalerate))
|
||||
|
||||
SV_PlayerMovement_Scale(m,false)
|
||||
|
||||
local stepResult = perform_air_step(m,0)
|
||||
|
||||
SV_PlayerMovement_Scale(m,true)
|
||||
end
|
||||
--- @param m MarioState
|
||||
local function prediction_act_dm_water_movement(m)
|
||||
|
||||
if (not cl_disableAccelPred) then SV_WaterMovement(m) end
|
||||
|
||||
local scale = m.forwardVel
|
||||
if (scale < 10) then
|
||||
set_character_animation(m, CHAR_ANIM_WATER_IDLE)
|
||||
else
|
||||
set_character_anim_with_accel(m, CHAR_ANIM_FLUTTERKICK, scale*0x800)
|
||||
end
|
||||
|
||||
if (vec3f_length(m.vel) <= 10) then
|
||||
m.forwardVel = 0
|
||||
return
|
||||
end
|
||||
|
||||
m.forwardVel = vec3f_length(vec3_qscale(m.vel,sv_scalerate,0,sv_scalerate))
|
||||
|
||||
SV_PlayerMovement_Scale(m,false)
|
||||
local stepResult = perform_air_step(m,0)
|
||||
SV_PlayerMovement_Scale(m,true)
|
||||
end
|
||||
--- @param m MarioState
|
||||
local function prediction_act_dm_ground_pound(m)
|
||||
set_character_animation(m, CHAR_ANIM_TRIPLE_JUMP_GROUND_POUND)
|
||||
|
||||
SV_UserGravityEx(m,1.0,0.75)
|
||||
|
||||
SV_PlayerMovement_Scale(m,false)
|
||||
local stepResult = perform_air_step(m,0)
|
||||
SV_PlayerMovement_Scale(m,true)
|
||||
|
||||
if (stepResult == AIR_STEP_LANDED) then
|
||||
if (m.floor ~= nil) then
|
||||
play_mario_heavy_landing_sound(m, SOUND_ACTION_TERRAIN_HEAVY_LANDING)
|
||||
set_mario_particle_flags(m, (PARTICLE_MIST_CIRCLE | PARTICLE_HORIZONTAL_STAR), false)
|
||||
if (m.controller.buttonDown & A_BUTTON) ~= 0 then
|
||||
play_character_sound(m,CHAR_SOUND_YAHOO)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
--- @param m MarioState
|
||||
local function prediction_act_dm_pole_movement(m)
|
||||
set_character_animation(m, CHAR_ANIM_IDLE_ON_POLE)
|
||||
|
||||
SV_PlayerMovement_Scale(m,false)
|
||||
local stepResult = perform_air_step(m,0)
|
||||
SV_PlayerMovement_Scale(m,true)
|
||||
end
|
||||
|
||||
|
||||
--- @param m MarioState
|
||||
function act_dm_grounded_movement(m)
|
||||
if (m.playerIndex == 0) then return local_act_dm_grounded_movement(m) else return prediction_act_dm_grounded_movement(m) end
|
||||
end
|
||||
--- @param m MarioState
|
||||
function act_dm_air_movement(m)
|
||||
if (m.playerIndex == 0) then return local_act_dm_air_movement(m) else return prediction_act_dm_air_movement(m) end
|
||||
end
|
||||
--- @param m MarioState
|
||||
function act_dm_water_movement(m)
|
||||
if (m.playerIndex == 0) then return local_act_dm_water_movement(m) else return prediction_act_dm_water_movement(m) end
|
||||
end
|
||||
--- @param m MarioState
|
||||
function act_dm_ground_pound(m)
|
||||
if (m.playerIndex == 0) then return local_act_dm_ground_pound(m) else return prediction_act_dm_ground_pound(m) end
|
||||
end
|
||||
--- @param m MarioState
|
||||
function act_dm_pole_movement(m)
|
||||
if (m.playerIndex == 0) then return local_act_dm_pole_movement(m) else return prediction_act_dm_pole_movement(m) end
|
||||
end
|
||||
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
666
mods/mquake/_mquake_e_hook_functions.lua
Normal file
666
mods/mquake/_mquake_e_hook_functions.lua
Normal file
|
@ -0,0 +1,666 @@
|
|||
if SM64COOPDX_VERSION == nil then return end
|
||||
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
|
Binary file not shown.
Binary file not shown.
95
mods/mquake/_mquake_f_hooks.lua
Normal file
95
mods/mquake/_mquake_f_hooks.lua
Normal file
|
@ -0,0 +1,95 @@
|
|||
if SM64COOPDX_VERSION == nil then return end
|
||||
|
||||
hook_mario_action(ACT_DM_GROUNDED_MOVEMENT, act_dm_grounded_movement)
|
||||
hook_mario_action(ACT_DM_GROUNDED_IDLE, act_dm_grounded_movement)
|
||||
hook_mario_action(ACT_DM_AIR_MOVEMENT, act_dm_air_movement)
|
||||
hook_mario_action(ACT_GROUND_POUND, act_dm_ground_pound)
|
||||
hook_mario_action(ACT_DM_GROUND_POUND_METAL, act_dm_ground_pound)
|
||||
hook_mario_action(ACT_DM_GROUNDED_MOVEMENT_METAL, act_dm_grounded_movement)
|
||||
hook_mario_action(ACT_DM_AIR_MOVEMENT_METAL, act_dm_air_movement)
|
||||
hook_mario_action(ACT_DM_POLE_MOVEMENT, act_dm_pole_movement)
|
||||
hook_mario_action(ACT_DM_WATER_MOVEMENT, act_dm_water_movement)
|
||||
hook_event(HOOK_ON_PLAYER_CONNECTED, on_player_connected)
|
||||
hook_event(HOOK_OVERRIDE_PHYS_STEP_DEFACTO_SPEED, override_defacto)
|
||||
hook_event(HOOK_CHARACTER_SOUND, allow_voice)
|
||||
hook_event(HOOK_BEFORE_SET_MARIO_ACTION, before_set_mario_action)
|
||||
hook_event(HOOK_ON_SET_MARIO_ACTION, on_set_mario_action)
|
||||
hook_event(HOOK_ON_LEVEL_INIT, on_level_init)
|
||||
hook_event(HOOK_BEFORE_PHYS_STEP, before_phys_step)
|
||||
hook_event(HOOK_ALLOW_HAZARD_SURFACE, function(m) return false end)
|
||||
hook_event(HOOK_ON_INTERACT, on_interact)
|
||||
hook_event(HOOK_ALLOW_INTERACT, allow_interact)
|
||||
hook_event(HOOK_ON_PVP_ATTACK, on_pvp)
|
||||
hook_event(HOOK_ALLOW_PVP_ATTACK, allow_pvp)
|
||||
hook_event(HOOK_ON_OBJECT_RENDER, on_object_render)
|
||||
hook_event(HOOK_ON_HUD_RENDER_BEHIND, render_hud_effects)
|
||||
hook_event(HOOK_UPDATE, on_game_update)
|
||||
|
||||
hook_chat_command('mq', "[list] - \\#FFE0A0\\List all commands", mquake)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
--- Server ---
|
||||
|
||||
|
||||
if (network_is_server()) then
|
||||
hook_chat_command('mq_server', "[list] - \\#A0FFE0\\List all convars/settings", mquake_server)
|
||||
end
|
||||
|
||||
|
||||
|
||||
hook_on_sync_table_change(gGlobalSyncTable, 'Convar_StickySlope', 'server', function(tag, oldVal, newVal)
|
||||
if (oldVal ~= newVal) and (oldVal ~= nil) then djui_chat_message_create("\\#A0FFE0\\Cvar \\#14FF14\\'StickySlope'\\#A0FFE0\\ changed from \\#14FF14\\'"..tostring(oldVal==true).."'\\#A0FFE0\\ to \\#14FF14\\'"..tostring(newVal==true).."'\\#A0FFE0\\.") end
|
||||
sv_sticky = newVal
|
||||
end)
|
||||
hook_on_sync_table_change(gGlobalSyncTable, 'Convar_AirAccelerate', 'server', function(tag, oldVal, newVal)
|
||||
if (oldVal ~= newVal) and (oldVal ~= nil) then djui_chat_message_create("\\#A0FFE0\\Cvar \\#14FF14\\'AirAccelerate'\\#A0FFE0\\ changed from \\#14FF14\\'"..tostring(oldVal).."'\\#A0FFE0\\ to \\#14FF14\\'"..tostring(newVal).."'\\#A0FFE0\\.") end
|
||||
sv_airaccelerate_value = newVal
|
||||
end)
|
||||
hook_on_sync_table_change(gGlobalSyncTable, 'Convar_Accelerate', 'server', function(tag, oldVal, newVal)
|
||||
if (oldVal ~= newVal) and (oldVal ~= nil) then djui_chat_message_create("\\#A0FFE0\\Cvar \\#14FF14\\'Accelerate'\\#A0FFE0\\ changed from \\#14FF14\\'"..tostring(oldVal).."'\\#A0FFE0\\ to \\#14FF14\\'"..tostring(newVal).."'\\#A0FFE0\\.") end
|
||||
sv_accelerate = newVal
|
||||
end)
|
||||
hook_on_sync_table_change(gGlobalSyncTable, 'Convar_AirClamp', 'server', function(tag, oldVal, newVal)
|
||||
if (oldVal ~= newVal) and (oldVal ~= nil) then djui_chat_message_create("\\#A0FFE0\\Cvar \\#14FF14\\'AirClamp'\\#A0FFE0\\ changed from \\#14FF14\\'"..tostring(oldVal).."'\\#A0FFE0\\ to \\#14FF14\\'"..tostring(newVal).."'\\#A0FFE0\\.") end
|
||||
sv_playerclamp_air = newVal
|
||||
end)
|
||||
hook_on_sync_table_change(gGlobalSyncTable, 'Convar_PlayerSpeed', 'server', function(tag, oldVal, newVal)
|
||||
if (oldVal ~= newVal) and (oldVal ~= nil) then djui_chat_message_create("\\#A0FFE0\\Cvar \\#14FF14\\'PlayerSpeed'\\#A0FFE0\\ changed from \\#14FF14\\'"..tostring(oldVal).."'\\#A0FFE0\\ to \\#14FF14\\'"..tostring(newVal).."'\\#A0FFE0\\.") end
|
||||
sv_maxspeed = 180*newVal
|
||||
sv_maxspeed_crouch = 80*newVal
|
||||
sv_maxspeed_water = 180*newVal
|
||||
sv_playerspeed = 90*newVal
|
||||
sv_playerspeed_water = 90*newVal
|
||||
sv_playerspeed_water_shell = 300*newVal
|
||||
sv_upspeed_water = 180*newVal
|
||||
sv_playerspeed_crouch = 40*newVal
|
||||
end)
|
||||
hook_on_sync_table_change(gGlobalSyncTable, 'Convar_Gravity', 'server', function(tag, oldVal, newVal)
|
||||
if (oldVal ~= newVal) and (oldVal ~= nil) then djui_chat_message_create("\\#A0FFE0\\Cvar \\#14FF14\\'Gravity'\\#A0FFE0\\ changed from \\#14FF14\\'"..tostring(oldVal).."'\\#A0FFE0\\ to \\#14FF14\\'"..tostring(newVal).."'\\#A0FFE0\\.") end
|
||||
sv_gravity = newVal
|
||||
end)
|
||||
hook_on_sync_table_change(gGlobalSyncTable, 'Convar_PlayerFriction', 'server', function(tag, oldVal, newVal)
|
||||
if (oldVal ~= newVal) and (oldVal ~= nil) then djui_chat_message_create("\\#A0FFE0\\Cvar \\#14FF14\\'PlayerFriction'\\#A0FFE0\\ changed from \\#14FF14\\'"..tostring(oldVal).."'\\#A0FFE0\\ to \\#14FF14\\'"..tostring(newVal).."'\\#A0FFE0\\.") end
|
||||
sv_friction = 4*newVal
|
||||
sv_waterfriction = 2.5*newVal
|
||||
end)
|
||||
hook_on_sync_table_change(gGlobalSyncTable, 'Convar_PlayerJumpHeight', 'server', function(tag, oldVal, newVal)
|
||||
if (oldVal ~= newVal) and (oldVal ~= nil) then djui_chat_message_create("\\#A0FFE0\\Cvar \\#14FF14\\'PlayerJumpHeight'\\#A0FFE0\\ changed from \\#14FF14\\'"..tostring(oldVal).."'\\#A0FFE0\\ to \\#14FF14\\'"..tostring(newVal).."'\\#A0FFE0\\.") end
|
||||
sv_jumpheight =newVal
|
||||
end)
|
||||
hook_on_sync_table_change(gGlobalSyncTable, 'Convar_PlayerAllow_GroundPound', 'server', function(tag, oldVal, newVal)
|
||||
if (oldVal ~= newVal) and (oldVal ~= nil) then djui_chat_message_create("\\#A0FFE0\\Cvar \\#14FF14\\'PlayerAllow_GroundPound'\\#A0FFE0\\ changed from \\#14FF14\\'"..tostring(oldVal==true).."'\\#A0FFE0\\ to \\#14FF14\\'"..tostring(newVal==true).."'\\#A0FFE0\\.") end
|
||||
sv_groundpound = newVal==true
|
||||
end)
|
||||
hook_on_sync_table_change(gGlobalSyncTable, 'Convar_PlayerAllow_WallJump', 'server', function(tag, oldVal, newVal)
|
||||
if (oldVal ~= newVal) and (oldVal ~= nil) then djui_chat_message_create("\\#A0FFE0\\Cvar \\#14FF14\\'PlayerAllow_WallJump'\\#A0FFE0\\ changed from \\#14FF14\\'"..tostring(oldVal==true).."'\\#A0FFE0\\ to \\#14FF14\\'"..tostring(newVal==true).."'\\#A0FFE0\\.") end
|
||||
sv_walljump = newVal==true
|
||||
end)
|
||||
hook_on_sync_table_change(gGlobalSyncTable, 'Convar_PlayerAllow_Interact', 'server', function(tag, oldVal, newVal)
|
||||
if (oldVal ~= newVal) and (oldVal ~= nil) then djui_chat_message_create("\\#A0FFE0\\Cvar \\#14FF14\\'PlayerAllow_Interact'\\#A0FFE0\\ changed from \\#14FF14\\'"..tostring(oldVal==true).."'\\#A0FFE0\\ to \\#14FF14\\'"..tostring(newVal==true).."'\\#A0FFE0\\.") end
|
||||
sv_interact = newVal==true
|
||||
end)
|
Binary file not shown.
Binary file not shown.
143
mods/mquake/_mquake_g_api.lua
Normal file
143
mods/mquake/_mquake_g_api.lua
Normal file
|
@ -0,0 +1,143 @@
|
|||
local function sv_get_gravity() return gGlobalSyncTable.Convar_Gravity end
|
||||
local function sv_get_air_accel() return gGlobalSyncTable.Convar_AirAccelerate end
|
||||
local function sv_get_air_clamp() return gGlobalSyncTable.Convar_AirClamp end
|
||||
local function sv_get_ground_accel() return gGlobalSyncTable.Convar_Accelerate end
|
||||
local function sv_get_speed() return gGlobalSyncTable.Convar_PlayerSpeed end
|
||||
local function sv_get_friction() return gGlobalSyncTable.Convar_PlayerFriction end
|
||||
local function sv_get_jump_height() return gGlobalSyncTable.Convar_PlayerJumpHeight end
|
||||
local function sv_get_allow_groundpound() return gGlobalSyncTable.Convar_PlayerAllow_GroundPound end
|
||||
local function sv_get_allow_walljump() return gGlobalSyncTable.Convar_PlayerAllow_WallJump end
|
||||
local function sv_get_allow_interact() return gGlobalSyncTable.Convar_PlayerAllow_Interact end
|
||||
|
||||
local function sv_set_gravity(v) gGlobalSyncTable.Convar_Gravity = v end
|
||||
local function sv_set_air_accel(v) gGlobalSyncTable.Convar_AirAccelerate = v end
|
||||
local function sv_set_air_clamp(v) gGlobalSyncTable.Convar_AirClamp = v end
|
||||
local function sv_set_ground_accel(v) gGlobalSyncTable.Convar_Accelerate = v end
|
||||
local function sv_set_speed(v) gGlobalSyncTable.Convar_PlayerSpeed = v end
|
||||
local function sv_set_friction(v) gGlobalSyncTable.Convar_PlayerFriction = v end
|
||||
local function sv_set_jump_height(v) gGlobalSyncTable.Convar_PlayerJumpHeight = v end
|
||||
local function sv_set_allow_groundpound(v) gGlobalSyncTable.Convar_PlayerAllow_GroundPound = v end
|
||||
local function sv_set_allow_walljump(v) gGlobalSyncTable.Convar_PlayerAllow_WallJump = v end
|
||||
local function sv_set_allow_interact(v) gGlobalSyncTable.Convar_PlayerAllow_Interact = v end
|
||||
|
||||
local function cl_set_allow_action(a,o)
|
||||
DM_ACTIONS[tonumber(a)] = o
|
||||
end
|
||||
|
||||
local function cl_set_action_crouchair(a,o)
|
||||
DM_ACTIONS_CROUCHAIR[tonumber(a)] = o
|
||||
end
|
||||
|
||||
local function cl_set_action_allowgrab(a,o)
|
||||
DM_ACTIONS_ALLOWGRAB[tonumber(a)] = o
|
||||
end
|
||||
|
||||
local function cl_set_action_uses_qphys(a,o)
|
||||
DM_ACTION_QPHYS[tonumber(a)] = o
|
||||
end
|
||||
|
||||
local function cl_set_action_forceangle(a,o)
|
||||
DM_ACTION_FORCEANGLE[tonumber(a)] = o
|
||||
end
|
||||
|
||||
local function cl_set_action_transfer_to_qphys(a,o)
|
||||
DM_ACTION_TRANSFERS[tonumber(a)] = o
|
||||
end
|
||||
|
||||
local function cl_set_action_prerun_func(a,o)
|
||||
DM_ACTION_PREFUNCS[tonumber(a)] = o
|
||||
end
|
||||
|
||||
local function cl_set_action_postrun_func(a,o)
|
||||
DM_ACTION_FUNCTIONS[tonumber(a)] = o
|
||||
end
|
||||
|
||||
local function cl_set_action_ignore_fp(a,o)
|
||||
DM_ACTION_DONT_OVERRIDE_FP[tonumber(a)] = o
|
||||
end
|
||||
|
||||
local function cl_set_interaction_func(a,o)
|
||||
interactOverrides[tonumber(a)] = o
|
||||
end
|
||||
|
||||
local function cl_set_throw_func(a,o)
|
||||
throwOverrides[tonumber(a)]=o
|
||||
end
|
||||
|
||||
local function cl_set_drop_func(a,o)
|
||||
dropOverrides[tonumber(a)]=o
|
||||
end
|
||||
|
||||
local api = {
|
||||
version = 1,
|
||||
hotfix = 0,
|
||||
server = {
|
||||
get = { -- Allows modders to get server convars
|
||||
stickyslope = sv_get_stickyslope,
|
||||
gravity = sv_get_gravity,
|
||||
airaccelerate = sv_get_air_accel,
|
||||
airclamp = sv_get_air_clamp,
|
||||
accelerate = sv_get_ground_accel,
|
||||
speed = sv_get_speed,
|
||||
friction = sv_get_friction,
|
||||
jumpheight = sv_get_jump_height,
|
||||
groundpound = sv_get_allow_groundpound,
|
||||
walljump = sv_get_allow_walljump,
|
||||
interact = sv_get_allow_interact
|
||||
},
|
||||
set = { -- Allows modders to override server convars
|
||||
stickyslope = sv_set_stickyslope,
|
||||
gravity = sv_set_gravity,
|
||||
airaccelerate = sv_set_air_accel,
|
||||
airclamp = sv_set_air_clamp,
|
||||
accelerate = sv_set_ground_accel,
|
||||
speed = sv_set_speed,
|
||||
friction = sv_set_friction,
|
||||
jumpheight = sv_set_jump_height,
|
||||
groundpound = sv_set_allow_groundpound,
|
||||
walljump = sv_set_allow_walljump,
|
||||
interact = sv_set_allow_interact
|
||||
}
|
||||
},
|
||||
physics = { -- Allows modders to access mQuakes physics functions
|
||||
update = local_update,
|
||||
airaccelerate = SV_AirAccelerate,
|
||||
accelerate = SV_Accelerate,
|
||||
playermovement = SV_PlayerMovement,
|
||||
watermovement = SV_WaterMovement,
|
||||
gravity = SV_UserGravityEx,
|
||||
friction = SV_UserFriction,
|
||||
getplayerangles = GetAngleVectors,
|
||||
handlefloors = SV_HandleSpecialFloors,
|
||||
addrelativevelocity = SV_PlayerMovement_Relative,
|
||||
storeplayerposvel = SV_PlayerMovement_Store,
|
||||
velcollide = PHYS_CollideWithNormal
|
||||
},
|
||||
actions = { -- Allows modders to access mQuakes action override tables
|
||||
set_allow_action = cl_set_allow_action,
|
||||
set_action_crouchair = cl_set_action_crouchair,
|
||||
set_action_allowgrab = cl_set_action_allowgrab,
|
||||
set_action_uses_qphys = cl_set_action_uses_qphys,
|
||||
set_action_forceangle = cl_set_action_forceangle,
|
||||
set_action_transfer_to_qphys = cl_set_action_transfer_to_qphys,
|
||||
set_action_prerun_func = cl_set_action_prerun_func,
|
||||
set_action_postrun_func = cl_set_action_postrun_func,
|
||||
set_action_ignore_fp = cl_set_action_ignore_fp,
|
||||
get_allowed_action_list = function() return DM_ACTIONS end,
|
||||
get_crouchair_action_list = function() return DM_ACTIONS_CROUCHAIR end,
|
||||
get_allowgrab_action_list = function() return DM_ACTIONS_ALLOWGRAB end,
|
||||
get_qphys_action_list = function() return DM_ACTION_QPHYS end,
|
||||
get_nofp_action_list = function() return DM_ACTION_DONT_OVERRIDE_FP end,
|
||||
get_forceangle_action_list = function() return DM_ACTION_FORCEANGLE end,
|
||||
get_transfer_action_list = function() return DM_ACTION_TRANSFERS end,
|
||||
get_prefunc_action_list = function() return DM_ACTION_PREFUNCS end,
|
||||
get_postfunc_action_list = function() return DM_ACTION_FUNCTIONS end
|
||||
},
|
||||
interactions = { -- Allows modders to override interactions
|
||||
set_interaction_override = cl_set_interaction_func,
|
||||
set_throw_override = cl_set_throw_func,
|
||||
set_drop_override = cl_set_drop_func
|
||||
}
|
||||
}
|
||||
|
||||
_G.mQuake_API = api
|
Binary file not shown.
Binary file not shown.
|
@ -1,6 +1,4 @@
|
|||
-- name: mQuake
|
||||
-- incompatible: moveset
|
||||
-- description: Quake style physics.\nCreated by 0x2480 with help from Agent X\n\n[Beta 2 Early Release]
|
||||
-- deluxe: true
|
||||
|
||||
-- mQuake uncompiled is no longer available publicly. If you wish to get the code, message me.
|
||||
-- deluxe: true
|
Loading…
Reference in a new issue