-- OCMaker V2 By Tythestickman -- Please Remember To Credit Me If You Edit This. -- and enjoy the funni messages i put in too COM_AddCommand("ocmaker", function(player, skin, color, act_speed, abi1, abi2, name, proj, jump, run_speed, minD, maxD, inf_toggle) -- Rest Values Option if skin == "defaultchar" then local s = skins[player.skin] -- Get the base stats for the current skin player.oc_name = s.realname player.actionspd = s.actionspd player.charability = s.ability player.charability2 = s.ability2 player.normalspeed = s.normalspeed player.jumpfactor = s.jumpfactor player.mindash = s.mindash player.maxdash = s.maxdash player.oc_inf = false player.is_oc = false -- Reset Character-Specific Projectiles -- for some reason it crashes when doin player.revitem = s.revitem local skin_name = skins[player.skin].name if skin_name == "fang" then player.revitem = MT_CORK elseif skin_name == "amy" then player.revitem = MT_LHRT else player.revitem = MT_NULL end player.skincolor = s.prefcolor if player.mo and player.mo.valid then player.mo.color = s.prefcolor end CONS_Printf(player, "\x82".."Character reset to "..(player.oc_name).."'s default values.") return end -- showexample1 setup if skin == "showexample1" then -- Trooper (Tails) skin, color, act_speed, abi1, abi2, name, proj, jump, run_speed, minD, maxD = "tails", "forest", "15", "CA_JUMPTHOK", "CA2_MELEE", "Trooper", "MT_CORK", "1.2", "32", "5", "25" -- showexample2 setup elseif skin == "showexample2" then -- Airbomber (Metal Sonic) -- This character showcases the Thin Font HUD (9 letters) and Boss projectiles! skin, color, act_speed, abi1, abi2, name, proj, jump, run_speed, minD, maxD = "metalsonic", "bone", "95", "CA_FLY", "CA2_GUNSLINGER", "Airbomber", "MT_CYBRAKDEMON_NAPALM_BOMB_LARGE", "1.5", "45", "25", "90" -- showexample3/Random OC Generator setup elseif skin == "showexample3" then -- 1. Random Name Pool local names = {"Cooper", "Turbo", "Robin", "Spark", "Pound", "Cooper", "Turbo", "Robin", "Spark", "Pound", "sanic"} name = names[P_RandomRange(1, #names)] -- 2. Random Base Skin & Color local random_skins = {"sonic", "tails", "knuckles", "amy", "fang", "metalsonic"} skin = random_skins[P_RandomRange(1, #random_skins)] local random_colors = {"red", "crimson", "pepper", "blue", "cobalt", "cornflower", "green", "forest", "master", "yellow", "gold", "topaz", "pink", "neon", "taffy", "white", "bone", "silver", "black", "jet", "carbon", "purple", "lavender", "vapor", "orange", "rust", "apricot", "cyan", "icy", "sky"} color = random_colors[P_RandomRange(1, #random_colors)] -- 3. Random Balanced Stats (The "Fair" Points) act_speed = tostring(P_RandomRange(15, 35)) run_speed = tostring(P_RandomRange(28, 42)) -- 4. Random Ability Combos (basically metal everyone lmao) local abis = {"CA_THOK", "CA_FLY", "CA_GLIDEANDCLIMB", "CA_HOMINGTHOK", "CA_SWIM", "CA_DOUBLEJUMP", "CA_FLOAT", "CA_SLOWFALL", "CA_TELEKINESIS", "CA_FALLSWITCH", "CA_JUMPBOOST", "CA_AIRDRILL", "CA_JUMPTHOK", "CA_BOUNCE", "CA_TWINSPIN"} local abis2 = {"CA2_SPINDASH", "CA2_MELEE"} abi1 = abis[P_RandomRange(1, #abis)] abi2 = abis2[P_RandomRange(1, #abis2)] proj = "MT_NULL" -- 5. 20% Chance for Infinite Lives if P_RandomRange(1, 5) == 1 then inf_toggle = "yes" else inf_toggle = "no" end elseif not (skin and color and act_speed and abi1 and abi2 and name and proj) then CONS_Printf(player, "Usage: ocmaker Everything after the projectile part are optional values. [jump] [run_speed] [minD] [maxD] [inf_toggle] Extra Toggles: showexample1-3; Lets you play as an Example OC to show whats possible within this command. defaultchar; sets the OC values back to the original character.") return end -- Set Skin R_SetPlayerSkin(player, skin) -- Color Logic (Mobile-safe loop) local color_id = 0 for i = 1, #skincolors do if skincolors[i] and (skincolors[i].name:lower() == color:lower() or skincolors[i].name:lower() == ("skincolor_"..color:lower())) then color_id = i break end end player.skincolor = color_id if player.mo and player.mo.valid then player.mo.color = color_id end -- Stats player.actionspd = (tonumber(act_speed) or 30) * FRACUNIT player.charability = _G[abi1:upper()] or 0 player.charability2 = _G[abi2:upper()] or 0 if run_speed then player.normalspeed = (tonumber(run_speed) or 30) * FRACUNIT end if jump then player.jumpfactor = FixedMul((tonumber(jump) or 1) * FRACUNIT, FRACUNIT) end if minD then player.mindash = (tonumber(minD) or 15) * FRACUNIT end if maxD then player.maxdash = (tonumber(maxD) or 60) * FRACUNIT end -- Projectile safety if proj and _G[proj:upper()] ~= nil then player.revitem = _G[proj:upper()] else player.revitem = MT_NULL end -- Manual INF Toggle if inf_toggle == "yes" or inf_toggle == "1" then player.oc_inf = true else player.oc_inf = false end -- Name check local skin_realname = "Unknown" if skins[player.skin] then skin_realname = skins[player.skin].realname end player.oc_name = name or skin_realname player.is_oc = true CONS_Printf(player, "\x82".."Created "..(player.oc_name).."!") end) -- 99% Accurate HUD (Yes! YES! YE- *house explodes*) hud.disable("lives") hud.add(function(v, stplyr) if not (stplyr and stplyr.valid and stplyr.mo and stplyr.mo.valid) then return end local display_name = stplyr.oc_name or skins[stplyr.mo.skin].realname -- 1. Icon local face = v.getSprite2Patch(stplyr.mo.skin, SPR2_XTRA, (stplyr.powers[pw_super] != 0), 0, 0) v.drawScaled(16*FRACUNIT, 176*FRACUNIT, FRACUNIT/2, face, V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_PERPLAYER|V_HUDTRANS, v.getColormap(stplyr.mo.skin, stplyr.mo.color)) -- 2. Custom Name Logic with Official Patches local display_name = stplyr.oc_name or skins[stplyr.mo.skin].realname local s_name = skins[stplyr.mo.skin].name -- i had to do it this way cuz i didnt bother with doing any other methods (lazy ass) if not stplyr.is_oc then if s_name == "knuckles" then display_name = "K.T.E" elseif s_name == "amy" then display_name = "AMY.R" elseif s_name == "metalsonic" then display_name = "METAL" end end -- more accuracy hip hip hooray if display_name:len() > 7 then v.drawString(34, 176, display_name, V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_PERPLAYER|V_HUDTRANS|V_YELLOWMAP, "thin") else v.drawString(34, 176, display_name, V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_PERPLAYER|V_HUDTRANS|V_YELLOWMAP) end -- 3. The "X" Sprite local livestext = v.cachePatch("STLIVEX") v.draw(38, 186, livestext, V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_PERPLAYER|V_HUDTRANS) -- 4. The INF Logic (but more official so its cooler fr fr) local show_inf = false -- Check A: Pandora's Box Constant (127) or Negative Lives if stplyr.lives >= 127 or stplyr.lives < 0 then show_inf = true -- Check B: Manual Toggle from OCMaker command elseif stplyr.oc_inf then show_inf = true -- Check C: If it's a Netgame/Multiplayer, we default to the number, -- but we allow the INF toggle to override it for mobile players! end local inftext = v.cachePatch("STCFN022") if show_inf then v.draw(66, 184, inftext, V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_PERPLAYER|V_HUDTRANS) else v.drawString(66, 184, stplyr.lives, V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_PERPLAYER|V_HUDTRANS) end end, "game")