// [StructLayout(LayoutKind.Explicit)] // struct MyMessage { // [FieldOffset(0)] // public int Foo; // // [FieldOffset(4)] // public int Bar; // // [FieldOffset(5)] // public ulong Data; // } // // // struct MessageHeader { // // } void PrintPosition(CharacterData *cd) { // CharacterData empty = default; // *cd = empty; // Debug.Log(wo->Transform.Positon); // Debug.Log(wo->Type); }
public void Swap(Character newCharacter, bool isMetalSonic = false) { Handle = GetCharacterGameObject(PlayerID); // Reset character size before swap Rescale(1f); // Store original CharacterData CharacterData *oldCharacterData = CharacterData; NextAction = PlayerAction.ReturnToNormal; // Set Metal Sonic flag _gameHandler.IsMetalSonic = isMetalSonic; // Change main function of the game object Handle->executor = _characterMainFunctions[newCharacter]; // Delete old character if (newCharacter == Character.Gamma) { Destructor((IntPtr)Handle); } // Set new character ID CharacterID = newCharacter; // Set action to intialize Info->Action = (byte)PlayerObjectAction.Initialize; // Cancel special states of the character Info->Status &= ~(Status.Attack | Status.Ball | Status.LightDash | Status.Unknown3); // Free player collision Info->CollisionInfo = null; // Load new character Executor((IntPtr)Handle); if (CharacterID == Character.Eggman) { Handle->displayer = _eggmanDisplay.DisplayFunction; } // Copy CharacterData stuff from old character CharacterData->Powerups = oldCharacterData->Powerups; CharacterData->JumpTime = oldCharacterData->JumpTime; CharacterData->UnderwaterTime = oldCharacterData->UnderwaterTime; CharacterData->PathDistance = oldCharacterData->PathDistance; CharacterData->Speed = oldCharacterData->Speed; CharacterData->HeldObject = oldCharacterData->HeldObject; // Load special player animations if (newCharacter != Character.Eggman && newCharacter != Character.Tikal) { LoadSpecialPlayerAnimations(newCharacter); } }