//Original Lua by Golden Shine. COM_AddCommand("fusionha", function(p) if (gamestate ~= GS_LEVEL) CONS_Printf(player, "be in a level please") return end if p.buddy if p.buddy.buddy CONS_Printf(p.buddy.buddy, "Your bond with \x82"+p.name+"\x80 was severed.") S_StartSound(p.mo, sfx_s3k9c) p.buddy.buddy = nil p.buddy.buddytime = nil p.buddy.buddyready = nil p.buddy.buddygone = nil if p.buddy.mo p.buddy.mo.flags = $ & ~MF_NOCLIPTHING p.buddy.mo.flags2 = $ & ~MF2_DONTDRAW end if not p.buddy.hypermysticsonic p.buddy.pflags =$ & ~PF_GODMODE & ~PF_FULLSTASIS else p.buddy.pflags = $ & ~PF_FULLSTASIS end end if p.buddy.name CONS_Printf(p, "Severed bond with \x82"+p.buddy.name) else CONS_Printf(p, "Severed bond with the other player.") end if p.mo p.mo.flags = $ & ~MF_NOCLIPTHING p.mo.flags2 = $ & ~MF2_DONTDRAW end if not p.hypermysticsonic p.pflags =$ & ~PF_GODMODE & ~PF_FULLSTASIS else p.pflags = $ & ~PF_FULLSTASIS end p.buddygone = nil p.buddy = nil p.buddyready = nil p.buddytime = nil return elseif p.buddy == nil for ns in players.iterate if not ns.buddy and ns.mo and p.mo and not (p == ns) and (P_AproxDistance(P_AproxDistance(p.mo.x-ns.mo.x, p.mo.y-ns.mo.y), p.mo.z-ns.mo.z) <= 100*FRACUNIT) and ns.mo.health and p.mo.health and ns.buddyready and not ns.bot p.buddy = ns ns.buddy = p ns.buddygone = true p.buddyready = false ns.buddyready = false S_StartSound(p.mo, sfx_ideya) S_StartSound(p.mo, sfx_s1c3) if ns CONS_Printf(ns, "You were merged with \x82"+p.name) end if p CONS_Printf(p, "Now merged with \x82"+ns.name) end p.startbuddytime = 72 return end end if not p.buddyready p.buddyready = true CONS_Printf(p, "\x85"+"Cannot find a willing nearby player.\x83 Standing ready to fuse anytime!") else p.buddyready = false CONS_Printf(p, "\x85"+"Standing down from fusion stance! Players can no longer fuse with you.") end return end end) addHook("MobjThinker", function(s, player) if not s.player return end local p = s.player if (p.powers[pw_carry] & CR_NIGHTSMODE) return end if splitscreen and players[tonumber(1)] and not players[tonumber(1)].buddyready and not players[tonumber(1)].buddy players[tonumber(1)].buddyready = true end if p and p.buddy and p.buddy.buddy and p.buddy.mo and p.buddy.mo.valid and s and s.valid if p.lives and (p.lives < 3) p.lives = 3 end if p.buddytime == nil p.startbuddytime = 72 p.buddytime = 72 end if p.buddytime and (p.buddytime > 36 ) and p.buddygone s.flags = s.flags & ~MF_NOCLIPTHING if not p.powers[pw_flashing] s.flags2 = s.flags2 & ~MF2_DONTDRAW end end if not p.buddytime and not p.buddygone S_StartSound(s, sfx_tink) p.buddytime = 72 p.buddy.buddytime = 72 s.state = p.buddy.mo.state s.flags = p.buddy.mo.flags & ~MF_NOCLIPTHING s.flags2 = p.buddy.mo.flags2 & ~MF2_DONTDRAW if not p.hypermysticsonic p.pflags = p.buddy.pflags|PF_JUMPDOWN|PF_USEDOWN & ~PF_GODMODE & ~PF_FULLSTASIS else p.pflags = p.buddy.pflags|PF_JUMPDOWN|PF_USEDOWN & ~PF_FULLSTASIS end p.weapondelay = 1 p.powers[pw_underwater] = p.buddy.powers[pw_underwater] p.powers[pw_spacetime] = p.buddy.powers[pw_spacetime] P_SpawnGhostMobj(s) elseif p.buddytime and p.buddytime == 36 and not p.buddygone p.buddytime = ((tonumber(p.startbuddytime))/2)-1 p.buddy.buddytime = ((tonumber(p.startbuddytime))/2)-1 S_StartSound(s, sfx_tink) p.buddy.mo.state = s.state p.buddy.aiming = p.aiming p.buddy.mo.angle = s.angle p.buddy.mo.flags = s.flags & ~MF_NOCLIPTHING p.buddy.mo.flags2 = s.flags2 & ~MF2_DONTDRAW if p.buddy.mo and s p.buddy.mo.flags = s.flags & ~MF_NOCLIPTHING p.buddy.mo.flags2 = s.flags2 & ~MF2_DONTDRAW P_SpawnGhostMobj(p.buddy.mo) if not p.buddy.hypermysticsonic p.buddy.pflags = p.pflags|PF_JUMPDOWN|PF_USEDOWN & ~PF_GODMODE & ~PF_FULLSTASIS else p.buddy.pflags = p.pflags|PF_JUMPDOWN|PF_USEDOWN & ~PF_FULLSTASIS end p.buddy.weapondelay = 1 p.buddy.powers[pw_underwater] = p.powers[pw_underwater] p.buddy.powers[pw_spacetime] = p.powers[pw_spacetime] end elseif p.buddytime and ( ((p.buddytime < 36) and not p.buddygone) or ((p.buddytime > 36) and p.buddygone) ) p.dashtime = p.buddy.dashtime p.dashspeed = p.buddy.dashspeed p.speed = p.buddy.speed p.secondjump = p.buddy.secondjump p.jumping = p.buddy.jumping p.homing = p.buddy.homing p.pity = 0 p.exiting = p.buddy.exiting p.flashpal = p.buddy.flashpal p.flashcount = p.buddy.flashcount p.ringweapons = p.buddy.ringweapons p.currentweapon = p.buddy.currentweapon p.pflags = p.buddy.pflags|PF_GODMODE|PF_FULLSTASIS p.powers[pw_invulnerability] = p.buddy.powers[pw_invulnerability] p.powers[pw_sneakers] = p.buddy.powers[pw_sneakers] p.powers[pw_flashing] = p.buddy.powers[pw_flashing] if p.powers[pw_shield] and not p.buddy.powers[pw_shield] and not P_PlayerInPain(p.buddy) p.buddy.powers[pw_shield] = p.powers[pw_shield] else p.powers[pw_shield] = p.buddy.powers[pw_shield] end p.powers[pw_tailsfly] = p.buddy.powers[pw_tailsfly] p.powers[pw_extralife] = p.buddy.powers[pw_extralife] p.powers[pw_gravityboots] = p.buddy.powers[pw_gravityboots] p.powers[pw_super] = p.buddy.powers[pw_super] p.powers[pw_infinityring] = p.buddy.powers[pw_infinityring] p.powers[pw_automaticring] = p.buddy.powers[pw_automaticring] p.powers[pw_bouncering] = p.buddy.powers[pw_bouncering] p.powers[pw_scatterring] = p.buddy.powers[pw_scatterring] p.powers[pw_grenadering] = p.buddy.powers[pw_grenadering] p.powers[pw_explosionring] = p.buddy.powers[pw_explosionring] p.powers[pw_railring] = p.buddy.powers[pw_railring] p.powers[pw_emeralds] = p.buddy.powers[pw_emeralds] p.powers[pw_nights_superloop] = p.buddy.powers[pw_nights_superloop] p.powers[pw_nights_helper] = p.buddy.powers[pw_nights_helper] p.powers[pw_nights_linkfreeze] = p.buddy.powers[pw_nights_linkfreeze] p.powers[pw_nocontrol] = p.buddy.powers[pw_nocontrol] p.starpostx = p.buddy.starpostx p.starposty = p.buddy.starposty p.starpostz = p.buddy.starpostz p.starpostnum = p.buddy.starpostnum p.starposttime = p.buddy.starposttime p.starpostangle = p.buddy.starpostangle p.angle_pos = p.buddy.angle_pos p.old_angle_pos = p.buddy.old_angle_pos p.bumpertime = p.buddy.bumpertime p.tossdelay = p.buddy.tossdelay p.realtime = p.buddy.realtime p.numboxes = p.buddy.numboxes p.totalring = p.buddy.totalring p.onconveyor = p.buddy.onconveyor p.spectator = p.buddy.spectator p.scoreadd = p.buddy.scoreadd p.score = p.buddy.score p.lastsidehit = p.buddy.lastsidehit p.lastlinehit = p.buddy.lastlinehit p.climbing = p.buddy.climbing p.glidetime = p.buddy.glidetime p.fly1 = p.buddy.fly1 p.gotflag = p.buddy.gotflag p.ctfteam = p.buddy.ctfteam p.laps = p.buddy.laps p.playerstate = p.buddy.playerstate p.deadtimer = p.buddy.deadtimer p.cmd.angleturn = p.buddy.cmd.angleturn p.cmd.forwardmove = p.buddy.cmd.forwardmove p.cmd.sidemove = p.buddy.cmd.sidemove p.cmd.buttons = p.buddy.cmd.buttons p.aiming = p.buddy.aiming p.weapondelay = 3 p.panim = p.buddy.panim p.mo.rollangle = p.buddy.mo.rollangle if p.rings == p.buddy.rings+10 p.buddy.rings = p.rings else p.rings = p.buddy.rings end P_RestoreMusic(p) if p.buddy.mo and s if s.health == p.buddy.mo.health+10 p.buddy.mo.health = s.health elseif p.buddy.mo.health s.health = p.buddy.mo.health end s.target = p.buddy.mo.target s.tracer = p.buddy.mo.tracer s.momx = p.buddy.mo.momx s.momy = p.buddy.mo.momy s.momz = p.buddy.mo.momz s.rmomx = p.buddy.mo.rmomx s.rmomy = p.buddy.mo.rmomy s.cmomx = p.buddy.mo.cmomx s.cmomy = p.buddy.mo.cmomy s.state = p.buddy.mo.state s.angle = p.buddy.mo.angle s.flags = p.buddy.mo.flags|MF_NOCLIPTHING s.eflags = p.buddy.mo.eflags s.flags2 = p.buddy.mo.flags2|MF2_DONTDRAW if (P_AproxDistance(P_AproxDistance(s.x-p.buddy.mo.x, s.y-p.buddy.mo.y), s.z-p.buddy.mo.z) <= 99*FRACUNIT) s.z = p.buddy.mo.z P_TryMove(s, p.buddy.mo.x, p.buddy.mo.y, true) else P_TeleportMove(s, p.buddy.mo.x, p.buddy.mo.y, p.buddy.mo.z) end end end if p.buddytime and not p.buddygone p.buddytime = $-1 end if (p.buddy.mo and not p.buddy.mo.health) and s and s.valid and s.health p.pflags = $ & ~PF_GODMODE P_KillMobj(s, nil, nil) end end if p.buddygone and p.buddy p.buddytime = p.buddy.buddytime end end, MT_PLAYER) addHook("ShouldDamage", function(s, i, so) if (s and s.player) and s.player.buddy if so and (so.player and s.player.buddy == so.player) return false end if s.player.buddytime and s.player.buddytime < 36 and not s.player.buddygone return false end if s.player.buddytime and s.player.buddytime > 36 and s.player.buddygone return false end end end, MT_PLAYER) local function BuddyCollide(s, m) if s and s.player and s.player.buddy if m and m.valid and (m.flags & MF_MISSILE) and m.target and (m.target.player and s.player.buddy == m.target.player) return false end if s.player.buddytime and s.player.buddytime < 36 and not s.player.buddygone return false end if s.player.buddytime and s.player.buddytime > 36 and s.player.buddygone return false end end end addHook("MobjCollide", BuddyCollide, MT_PLAYER) addHook("MobjMoveCollide", BuddyCollide, MT_PLAYER) hud.add(function(v, p) if p and p.buddy if p and p.mo and p.mo.valid if p.buddytime and p.buddytime > 36 and not p.buddygone v.drawScaled(57*FRACUNIT, 198*FRACUNIT, FRACUNIT/3, v.getSpritePatch(SPR_EMBM), V_30TRANS, v.getColormap(p.mo.skin, p.mo.color)) return false elseif p.buddytime and p.buddytime < 36 and p.buddygone and not splitscreen v.drawScaled(57*FRACUNIT, 198*FRACUNIT, FRACUNIT/3, v.getSpritePatch(SPR_EMBM), V_30TRANS, v.getColormap(p.mo.skin, p.mo.color)) return false end end end end)