Forum rules - please read before posting.

Playmaker Call Event

Hi, for some reason, the field for calling a specific event within a FSM using the Playmaker action didn't show up.
I asked ChatGPT to fix it and it works. @ChrisIceBox Maybe something got broken in some update, as I saw parts of the original code that were supposed to show that field.

/*
 *
 *  Adventure Creator
 *  by Chris Burton, 2013-2024
 *  
 *  "ActionPlayMaker.cs"
 * 
 *  This action interacts with the popular
 *  PlayMaker FSM-manager.
 * 
 */

using UnityEngine;
using System.Collections.Generic;

#if UNITY_EDITOR
using UnityEditor;
#endif

namespace AC
{

    [System.Serializable]
    public class ActionPlayMaker : Action
    {

        public bool isPlayer;
        public int playerID = -1;
        public int playerParameterID = -1;

        public int constantID = 0;
        public int parameterID = -1;
        public GameObject linkedObject;
        protected GameObject runtimeLinkedObject;

        public string fsmName;
        public int fsmNameParameterID = -1;
        public string eventName;
        public int eventNameParameterID = -1;


        public override ActionCategory Category { get { return ActionCategory.ThirdParty; }}
        public override string Title { get { return "PlayMaker"; }}
        public override string Description { get { return "Calls a specified Event within a PlayMaker FSM. Note that PlayMaker is a separate Unity Asset, and the 'PlayMakerIsPresent' preprocessor must be defined for this to work."; }}


        public override void AssignValues (List<ActionParameter> parameters)
        {
            if (isPlayer)
            {
                Player player = AssignPlayer (playerID, parameters, playerParameterID);
                runtimeLinkedObject = (player != null) ? player.gameObject : null;
            }
            else
            {
                runtimeLinkedObject = AssignFile (parameters, parameterID, constantID, linkedObject);
            }

            fsmName = AssignString (parameters, fsmNameParameterID, fsmName);
            eventName = AssignString (parameters, eventNameParameterID, eventName);
        }


        public override float Run ()
        {
            if (isPlayer && KickStarter.player == null)
            {
                LogWarning ("Cannot use Player's FSM since no Player was found!");
            }

            if (runtimeLinkedObject != null && !string.IsNullOrEmpty (eventName))
            {
                if (fsmName != "")
                {
                    PlayMakerIntegration.CallEvent (runtimeLinkedObject, eventName, fsmName);
                }
                else
                {
                    PlayMakerIntegration.CallEvent (runtimeLinkedObject, eventName);
                }
            }

            return 0f;
        }


        #if UNITY_EDITOR

        public override void ShowGUI (List<ActionParameter> parameters)
        {
            if (PlayMakerIntegration.IsDefinePresent ())
            {
                isPlayer = EditorGUILayout.Toggle ("Use Player's FSM?", isPlayer);
                if (isPlayer)
                {
                    PlayerField (ref playerID, parameters, ref playerParameterID);
                }
                else
                {
                    GameObjectField ("Playmaker FSM:", ref linkedObject, ref constantID, parameters, ref parameterID);
                }

                TextField ("FSM to call (optional):", ref fsmName, parameters, ref fsmNameParameterID);
                TextField ("Event name:", ref eventName, parameters, ref eventNameParameterID);  // Add this line to ensure the eventName field is visible
            }
            else
            {
                EditorGUILayout.HelpBox ("The 'PlayMakerIsPresent' Scripting Define Symbol must be listed in the\nPlayer Settings. Please set it from Edit -> Project Settings -> Player", MessageType.Warning);
            }
        }


        public override void AssignConstantIDs (bool saveScriptsToo, bool fromAssetFile)
        {
            if (!isPlayer)
            {
                constantID = AssignConstantID (linkedObject, constantID, parameterID);
            }
        }


        public override bool ReferencesObjectOrID (GameObject gameObject, int id)
        {
            if (parameterID < 0 && !isPlayer)
            {
                if (linkedObject && linkedObject == gameObject) return true;
                if (constantID == id && id != 0) return true;
            }
            return base.ReferencesObjectOrID (gameObject, id);
        }


        public override bool ReferencesPlayer (int _playerID = -1)
        {
            if (!isPlayer) return false;
            if (_playerID < 0) return true;
            if (playerID < 0 && playerParameterID < 0) return true;
            return (playerParameterID < 0 && playerID == _playerID);
        }

        #endif


        /**
         * <summary>Creates a new instance of the 'Third Party: PlayMaker' Action</summary>
         * <param name = "playMakerFSM">The GameObject with the Playmaker FSM to trigger</param>
         * <param name = "eventToCall">The name of the event to trigger</param>
         * <param name = "fsmName">The name of the FSM to call</param>
         * <returns>The generated Action</returns>
         */
        public static ActionPlayMaker CreateNew (GameObject playmakerFSM, string eventToCall, string fsmName = "")
        {
            ActionPlayMaker newAction = CreateNew<ActionPlayMaker> ();
            newAction.linkedObject = playmakerFSM;
            newAction.TryAssignConstantID (newAction.linkedObject, ref newAction.constantID);
            newAction.eventName = eventToCall;
            newAction.fsmName = fsmName;
            return newAction;
        }

    }

}

Comments

Sign In or Register to comment.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Welcome to the official forum for Adventure Creator.