if SM64COOPDX_VERSION == nil then return end define_custom_obj_fields({ oArenaSparkleOwner = 'u32', oArenaSparkleOffsetX = 'f32', oArenaSparkleOffsetY = 'f32', oArenaSparkleOffsetZ = 'f32', oArenaSparkleSize = 'f32', }) function bhv_arena_sparkle_init(obj) obj.oFlags = OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE obj.oAnimState = -1 obj_set_billboard(obj) obj.oArenaSparkleOffsetX = math.random() * 0x4000 - 0x2000 obj.oArenaSparkleOffsetY = math.random() * 0x4000 - 0x2000 obj.oArenaSparkleOffsetZ = math.random() * 200 obj_scale_random(obj, 1, 0) end function bhv_arena_sparkle_loop(obj) obj.oAnimState = obj.oAnimState + 1 if obj.oTimer > 9 then obj.activeFlags = ACTIVE_FLAG_DEACTIVATED; end local m = gMarioStates[obj.oArenaSparkleOwner] local held = gItemHeld[obj.oArenaSparkleOwner] if held ~= nil then local offset = { x = held.oPosX + sins(m.faceAngle.y) * 75, y = held.oPosY - 25, z = held.oPosZ + coss(m.faceAngle.y) * 75, } local scalar = (obj.oArenaSparkleOffsetZ * (1 - (obj.oTimer / 10) ^ 3)) scalar = scalar * ((1 - obj.oArenaSparkleSize) + 0.25) local offset2 = { x = offset.x + sins(m.faceAngle.y + obj.oArenaSparkleOffsetX) * scalar, y = offset.y + sins(obj.oArenaSparkleOffsetY) * scalar, z = offset.z + coss(m.faceAngle.y + obj.oArenaSparkleOffsetX) * scalar, } --obj.oPosX = offset.x + obj.oArenaSparkleOffsetX * (1 - (obj.oTimer / 10)) --obj.oPosY = offset.y + obj.oArenaSparkleOffsetY * (1 - (obj.oTimer / 10)) --obj.oPosZ = offset.z + obj.oArenaSparkleOffsetZ * (1 - (obj.oTimer / 10)) obj.oPosX = offset2.x obj.oPosY = offset2.y obj.oPosZ = offset2.z end obj_scale(obj, (obj.oTimer / 10) * (obj.oArenaSparkleSize * 0.5 + 1)) end id_bhvArenaSparkle = hook_behavior(nil, OBJ_LIST_UNIMPORTANT, true, bhv_arena_sparkle_init, bhv_arena_sparkle_loop)