• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

NPC System by Arad MNK V 1.3.0

This bundle is marked as useful / simple. Simplicity is bliss, low effort and/or may contain minor bugs.
Uhm...

This is my very first fully MUI (Well this is actually MPI; Due to the idea) and Leak-less system/Spell.
I made this for my own Map, but I wanted to help My friend Pinzu to see many things are possible in GUI and vJASS isn't always needed.

Useful for RPG's and stuff.

PS: First spell uploaded on Hive by me :D



  • NPC Init
    • Events
      • Game - UnitIndexEvent becomes Equal to 3.00
    • Conditions
    • Actions
      • -------- Hashtable --------
      • Hashtable - Create a hashtable
      • Set NPC_Hashtable = (Last created hashtable)
      • -------- Players --------
        • Do Multiple ActionsFor each (Integer A) from 1 to 12, do (Actions)
          • Loop - Actions
            • Trigger - Add to NPC Up <gen> the event (Player - (Player((Integer A))) Presses the Up Arrow key)
            • Trigger - Add to NPC Down <gen> the event (Player - (Player((Integer A))) Presses the Down Arrow key)
            • Trigger - Add to NPC Right <gen> the event (Player - (Player((Integer A))) Presses the Right Arrow key)
      • -------- - --------
      • -------- - --------
      • -------- Configurables --------
      • -------- - --------
      • -------- - --------
      • -------- Colors and Stuff --------
      • -------- Normal Asking color --------
      • Set NPC_Normal_Color = |cFF00FF00
      • -------- Selected Asking color --------
      • Set NPC_Select_Color = |cFF20C000
      • -------- Returned Answer color --------
      • Set NPC_Message_Color = |cFF37C881
      • -------- - --------
      • -------- Range of when the Hero is near to apply the Mode --------
      • Set NPC_HeroRange = 200.00
      • -------- - --------
      • -------- - --------
      • -------- End of Configurables --------
      • -------- (-----------------------------------------------------------------------------------------) --------
      • -------- (-----------------------------------------------------------------------------------------) --------
      • -------- From now on, it's only a demo and you can Delete them all but have at least one as a Template. --------
      • -------- (-----------------------------------------------------------------------------------------) --------
      • -------- (-----------------------------------------------------------------------------------------) --------
      • -------- Units --------
      • -------- - --------
      • -------- Registration Index --------
      • Set NPC_UnitRegister = Villager (Male 2) 0003 <gen>
      • -------- This will choose the Unit you want To Register --------
      • Set NPC_RegisterNumber_Index = (Custom value of NPC_UnitRegister)
      • -------- Sets the Custom Value --------
      • -------- Adds this guy to a Unit Group. This prevents talking to people who aren't registered, --------
      • Unit Group - Add NPC_UnitRegister to NPC_NPC_Group
      • -------- - --------
      • -------- DON'T CHANGE --------
      • Set NPC_General_Index = 0
      • Set NPC_General_Index = (NPC_General_Index + 1)
      • -------- What you Ask --------
      • Set NPC_Ask[NPC_General_Index] = Hello.
      • -------- What it Answers --------
      • Set NPC_Answer[NPC_General_Index] = Greetings.
      • -------- How many seconds does the Answer take --------
      • Set NPC_MessageShow_Wait[NPC_General_Index] = 3.00
      • -------- What does the Answer Trigger? --------
      • -------- NOOB Only: If you don't know how to use triggers in Custom Scripts, just use "gg_trg_(Name of your trigger without Parenthesis)" --------
      • -------- NOOB Only: If you don't want any action to be triggered, use "null" without the Quotation marks, --------
      • -------- NOOB Only: Custom scripts are (Case) Sensitive; so work with them with caution. --------
      • Custom script: set udg_NPC_Trigger[udg_NPC_General_Index] = null
      • -------- Repeat! --------
      • Set NPC_General_Index = (NPC_General_Index + 1)
      • Set NPC_Ask[NPC_General_Index] = How are You?
      • Set NPC_Answer[NPC_General_Index] = Fine, Thanks.
      • Set NPC_MessageShow_Wait[NPC_General_Index] = 4.00
      • Custom script: set udg_NPC_Trigger[udg_NPC_General_Index] = null
      • Set NPC_General_Index = (NPC_General_Index + 1)
      • Set NPC_Ask[NPC_General_Index] = Bye!
      • Set NPC_Answer[NPC_General_Index] = Bye!
      • Set NPC_MessageShow_Wait[NPC_General_Index] = 2.00
      • Custom script: set udg_NPC_Trigger[udg_NPC_General_Index] = gg_trg_NPC_Exit
      • Set NPC_NumberOfConversation = NPC_General_Index
      • Set NPC_General_Index = 0
      • -------- - --------
      • Hashtable - Save Handle OfNPC_UnitRegister as 0 of NPC_RegisterNumber_Index in NPC_Hashtable
      • Hashtable - Save NPC_NumberOfConversation as 0 of (Key (Load 0 of NPC_RegisterNumber_Index in NPC_Hashtable)) in NPC_Hashtable
      • Hashtable - Save (Facing of NPC_UnitRegister) as (NPC_NumberOfConversation + 1) of (Key (Load 0 of NPC_RegisterNumber_Index in NPC_Hashtable)) in NPC_Hashtable
        • Do Multiple ActionsFor each (Integer NPC_UnitRegister_Index) from 1 to NPC_NumberOfConversation, do (Actions)
          • Loop - Actions
            • Hashtable - Save NPC_Ask[NPC_UnitRegister_Index] as NPC_UnitRegister_Index of (Key (Load 0 of NPC_RegisterNumber_Index in NPC_Hashtable)) in NPC_Hashtable
            • Hashtable - Save NPC_Answer[NPC_UnitRegister_Index] as (Key (Load 0 of NPC_RegisterNumber_Index in NPC_Hashtable)) of NPC_UnitRegister_Index in NPC_Hashtable
            • Hashtable - Save Handle OfNPC_Trigger[NPC_UnitRegister_Index] as NPC_UnitRegister_Index of (Key (Load 0 of NPC_RegisterNumber_Index in NPC_Hashtable)) in NPC_Hashtable
            • Hashtable - Save NPC_MessageShow_Wait[NPC_UnitRegister_Index] as NPC_UnitRegister_Index of (Key (Load 0 of NPC_RegisterNumber_Index in NPC_Hashtable)) in NPC_Hashtable
      • -------- - --------
      • -------- - --------
      • Set NPC_UnitRegister = Villager (Female) 0001 <gen>
      • Set NPC_RegisterNumber_Index = (Custom value of NPC_UnitRegister)
      • Unit Group - Add NPC_UnitRegister to NPC_NPC_Group
      • -------- - --------
      • Set NPC_General_Index = (NPC_General_Index + 1)
      • Set NPC_Ask[NPC_General_Index] = Hello.
      • Set NPC_Answer[NPC_General_Index] = Hello!
      • Set NPC_MessageShow_Wait[NPC_General_Index] = 3.00
      • Custom script: set udg_NPC_Trigger[udg_NPC_General_Index] = null
      • Set NPC_General_Index = (NPC_General_Index + 1)
      • Set NPC_Ask[NPC_General_Index] = How are You?
      • Set NPC_Answer[NPC_General_Index] = Can't be better! I Have met a Hero!
      • Set NPC_MessageShow_Wait[NPC_General_Index] = 7.00
      • Custom script: set udg_NPC_Trigger[udg_NPC_General_Index] = null
      • Set NPC_General_Index = (NPC_General_Index + 1)
      • Set NPC_Ask[NPC_General_Index] = Bye!
      • Set NPC_Answer[NPC_General_Index] = Don't Go :( |n I Believe you have Important buisness to attend to...
      • Set NPC_MessageShow_Wait[NPC_General_Index] = 6.00
      • Custom script: set udg_NPC_Trigger[udg_NPC_General_Index] = gg_trg_NPC_Exit
      • Set NPC_General_Index = (NPC_General_Index + 1)
      • Set NPC_Ask[NPC_General_Index] = May I kill you?
      • Set NPC_Answer[NPC_General_Index] = Doesn't matter :) Do it!
      • Set NPC_MessageShow_Wait[NPC_General_Index] = 4.00
      • Custom script: set udg_NPC_Trigger[udg_NPC_General_Index] = gg_trg_NPC_Death_Test
      • Set NPC_NumberOfConversation = NPC_General_Index
      • Set NPC_General_Index = 0
      • -------- - --------
      • Hashtable - Save Handle OfNPC_UnitRegister as 0 of NPC_RegisterNumber_Index in NPC_Hashtable
      • Hashtable - Save NPC_NumberOfConversation as 0 of (Key (Load 0 of NPC_RegisterNumber_Index in NPC_Hashtable)) in NPC_Hashtable
      • Hashtable - Save (Facing of NPC_UnitRegister) as (NPC_NumberOfConversation + 1) of (Key (Load 0 of NPC_RegisterNumber_Index in NPC_Hashtable)) in NPC_Hashtable
        • Do Multiple ActionsFor each (Integer NPC_UnitRegister_Index) from 1 to NPC_NumberOfConversation, do (Actions)
          • Loop - Actions
            • Hashtable - Save NPC_Ask[NPC_UnitRegister_Index] as NPC_UnitRegister_Index of (Key (Load 0 of NPC_RegisterNumber_Index in NPC_Hashtable)) in NPC_Hashtable
            • Hashtable - Save NPC_Answer[NPC_UnitRegister_Index] as (Key (Load 0 of NPC_RegisterNumber_Index in NPC_Hashtable)) of NPC_UnitRegister_Index in NPC_Hashtable
            • Hashtable - Save Handle OfNPC_Trigger[NPC_UnitRegister_Index] as NPC_UnitRegister_Index of (Key (Load 0 of NPC_RegisterNumber_Index in NPC_Hashtable)) in NPC_Hashtable
            • Hashtable - Save NPC_MessageShow_Wait[NPC_UnitRegister_Index] as NPC_UnitRegister_Index of (Key (Load 0 of NPC_RegisterNumber_Index in NPC_Hashtable)) in NPC_Hashtable
      • -------- - --------
      • -------- - --------
      • Set NPC_UnitRegister = Child (2) 0002 <gen>
      • Set NPC_RegisterNumber_Index = (Custom value of NPC_UnitRegister)
      • Unit Group - Add NPC_UnitRegister to NPC_NPC_Group
      • -------- - --------
      • Set NPC_General_Index = (NPC_General_Index + 1)
      • Set NPC_Ask[NPC_General_Index] = Hello.
      • Set NPC_Answer[NPC_General_Index] = Shush! Hello!
      • Set NPC_MessageShow_Wait[NPC_General_Index] = 3.00
      • Custom script: set udg_NPC_Trigger[udg_NPC_General_Index] = null
      • Set NPC_General_Index = (NPC_General_Index + 1)
      • Set NPC_Ask[NPC_General_Index] = What are you doing?
      • Set NPC_Answer[NPC_General_Index] = Playing Hide and Seek with daddy! Now please, Please, PLEASE GO!
      • Set NPC_MessageShow_Wait[NPC_General_Index] = 7.00
      • Custom script: set udg_NPC_Trigger[udg_NPC_General_Index] = null
      • Set NPC_General_Index = (NPC_General_Index + 1)
      • Set NPC_Ask[NPC_General_Index] = Bye!
      • Set NPC_Answer[NPC_General_Index] = Oh Finally! BYE!
      • Set NPC_MessageShow_Wait[NPC_General_Index] = 4.00
      • Custom script: set udg_NPC_Trigger[udg_NPC_General_Index] = gg_trg_NPC_Exit
      • Set NPC_NumberOfConversation = NPC_General_Index
      • Set NPC_General_Index = 0
      • -------- - --------
      • Hashtable - Save Handle OfNPC_UnitRegister as 0 of NPC_RegisterNumber_Index in NPC_Hashtable
      • Hashtable - Save NPC_NumberOfConversation as 0 of (Key (Load 0 of NPC_RegisterNumber_Index in NPC_Hashtable)) in NPC_Hashtable
      • Hashtable - Save (Facing of NPC_UnitRegister) as (NPC_NumberOfConversation + 1) of (Key (Load 0 of NPC_RegisterNumber_Index in NPC_Hashtable)) in NPC_Hashtable
        • Do Multiple ActionsFor each (Integer NPC_UnitRegister_Index) from 1 to NPC_NumberOfConversation, do (Actions)
          • Loop - Actions
            • Hashtable - Save NPC_Ask[NPC_UnitRegister_Index] as NPC_UnitRegister_Index of (Key (Load 0 of NPC_RegisterNumber_Index in NPC_Hashtable)) in NPC_Hashtable
            • Hashtable - Save NPC_Answer[NPC_UnitRegister_Index] as (Key (Load 0 of NPC_RegisterNumber_Index in NPC_Hashtable)) of NPC_UnitRegister_Index in NPC_Hashtable
            • Hashtable - Save Handle OfNPC_Trigger[NPC_UnitRegister_Index] as NPC_UnitRegister_Index of (Key (Load 0 of NPC_RegisterNumber_Index in NPC_Hashtable)) in NPC_Hashtable
            • Hashtable - Save NPC_MessageShow_Wait[NPC_UnitRegister_Index] as NPC_UnitRegister_Index of (Key (Load 0 of NPC_RegisterNumber_Index in NPC_Hashtable)) in NPC_Hashtable
      • -------- - --------
      • -------- - --------
  • NPC Entering
    • Events
      • Player - Player 1 (Red) Selects a unit
      • Player - Player 2 (Blue) Selects a unit
      • Player - Player 3 (Teal) Selects a unit
      • Player - Player 4 (Purple) Selects a unit
      • Player - Player 5 (Yellow) Selects a unit
      • Player - Player 6 (Orange) Selects a unit
      • Player - Player 7 (Green) Selects a unit
      • Player - Player 8 (Pink) Selects a unit
      • Player - Player 9 (Gray) Selects a unit
      • Player - Player 10 (Light Blue) Selects a unit
      • Player - Player 11 (Dark Green) Selects a unit
      • Player - Player 12 (Brown) Selects a unit
    • Conditions
      • ((Triggering unit) is in NPC_NPC_Group) Equal to (==) True
    • Actions
      • Set NPC_PlayerNumber = (Player number of (Triggering player))
      • Set Temp_P = (Position of (Triggering unit))
      • Set NPC_TempUnitGroup = (Units within NPC_HeroRange of Temp_P matching ((((Matching unit) is in NPC_NPC_Group) Equal to (==) True) and (((Matching unit) is alive) Equal to (==) True)))
        • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
          • If - Conditions
            • (Number of units in NPC_TempUnitGroup) Not equal to (!=) 1
            • ((Triggering unit) is in NPC_NPC_Group) Equal to (==) True
          • Then - Actions
            • Custom script: call DestroyGroup(udg_NPC_TempUnitGroup)
            • Custom script: call RemoveLocation(udg_Temp_P)
            • Skip remaining actions
          • Else - Actions
      • Unit Group - Pick every unit in NPC_NPC_Group and do (Actions)
        • Loop - Actions
          • Set NPC_Unit_Talk[NPC_PlayerNumber] = (Picked unit)
      • Custom script: call DestroyGroup(udg_NPC_TempUnitGroup)
      • Selection - Clear selection for (Player(NPC_PlayerNumber))
      • Camera - Pan camera for (Player(NPC_PlayerNumber)) to Temp_P over 1.00 seconds
      • Unit - Make NPC_Unit_Talk[NPC_PlayerNumber] Invulnerable
      • Unit - Make NPC_Unit_Talk[NPC_PlayerNumber] face (Triggering unit) over 2.00 seconds
      • Unit - Make (Triggering unit) face NPC_Unit_Talk[NPC_PlayerNumber] over 2.00 seconds
      • Set Temp_PlayerGroup = (Player group((Player(NPC_PlayerNumber))))
      • Cinematic - Turn cinematic mode On for Temp_PlayerGroup over 0.20 seconds
      • Cinematic - Enable user control for Temp_PlayerGroup
      • Cinematic - Turn subtitle display override On
      • Set NPC_IsInMode[NPC_PlayerNumber] = True
      • Set NPC_AskedUnit[NPC_PlayerNumber] = (Triggering unit)
      • Set NPC_Load_TalkTimes_Integer = (Load 0 of (Key (Load 0 of (Custom value of (Triggering unit)) in NPC_Hashtable)) from NPC_Hashtable)
      • Set NPC_Line[NPC_PlayerNumber] = 1
      • Custom script: call RemoveLocation(udg_Temp_P)
      • Set NPC_Message_Ask = <Empty String>
        • Do Multiple ActionsFor each (Integer Integer_General) from 1 to NPC_Load_TalkTimes_Integer, do (Actions)
          • Loop - Actions
            • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
              • If - Conditions
                • Integer_General Equal to (==) 1
              • Then - Actions
                • Set NPC_Message_Ask = (NPC_Message_Ask + (NPC_Select_Color + (> + ((Load Integer_General of (Key (Triggering unit)) from NPC_Hashtable) + |r|n))))
              • Else - Actions
                • Set NPC_Message_Ask = (NPC_Message_Ask + (NPC_Normal_Color + (<Empty String> + ((Load Integer_General of (Key (Triggering unit)) from NPC_Hashtable) + |r|n))))
      • Cinematic - Send transmission to Temp_PlayerGroup from NPC_Unit_Talk[NPC_PlayerNumber] named |cFF01660CWhat to A...: Play No sound and display NPC_Message_Ask. Modify duration: Set to 600.00 seconds and Don't wait
      • Custom script: call DestroyForce(udg_Temp_PlayerGroup)
      • Wait 1.00 seconds
      • Set NPC_PlayerNumber = (Player number of (Triggering player))
      • Camera - Lock camera target for (Player(NPC_PlayerNumber)) to (Triggering unit), offset by (0.00, 0.00) using Default rotation
  • NPC Up
    • Events
    • Conditions
      • NPC_IsInMode[(Player number of (Triggering player))] Equal to (==) True
      • NPC_IsTalking[(Player number of (Triggering player))] Equal to (==) False
    • Actions
      • Set Temp_PlayerGroup = (Player group((Player(NPC_PlayerNumber))))
      • Set NPC_PlayerNumber = (Player number of (Triggering player))
      • Set NPC_Load_TalkTimes_Integer = (Load 0 of (Key (Load 0 of (Custom value of NPC_AskedUnit[NPC_PlayerNumber]) in NPC_Hashtable)) from NPC_Hashtable)
      • Set NPC_Line[NPC_PlayerNumber] = (NPC_Line[NPC_PlayerNumber] - 1)
        • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
          • If - Conditions
            • NPC_Line[NPC_PlayerNumber] Equal to (==) 0
          • Then - Actions
            • Set NPC_Line[NPC_PlayerNumber] = NPC_Load_TalkTimes_Integer
          • Else - Actions
      • Set NPC_Message_Ask = <Empty String>
        • Do Multiple ActionsFor each (Integer Integer_General) from 1 to NPC_Load_TalkTimes_Integer, do (Actions)
          • Loop - Actions
            • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
              • If - Conditions
                • Integer_General Equal to (==) NPC_Line[NPC_PlayerNumber]
              • Then - Actions
                • Set NPC_Message_Ask = (NPC_Message_Ask + (NPC_Select_Color + (> + ((Load Integer_General of (Key (Load 0 of (Custom value of NPC_AskedUnit[NPC_PlayerNumber]) in NPC_Hashtable)) from NPC_Hashtable) + |r|n))))
              • Else - Actions
                • Set NPC_Message_Ask = (NPC_Message_Ask + (NPC_Normal_Color + (<Empty String> + ((Load Integer_General of (Key (Load 0 of (Custom value of NPC_AskedUnit[NPC_PlayerNumber]) in NPC_Hashtable)) from NPC_Hashtable) + |r|n))))
      • Cinematic - Send transmission to Temp_PlayerGroup from NPC_Unit_Talk[NPC_PlayerNumber] named |cFF01660CWhat to A...: Play No sound and display NPC_Message_Ask. Modify duration: Set to 600.00 seconds and Don't wait
      • Custom script: call DestroyForce(udg_Temp_PlayerGroup)
  • NPC Down
    • Events
    • Conditions
      • NPC_IsInMode[(Player number of (Triggering player))] Equal to (==) True
      • NPC_IsTalking[(Player number of (Triggering player))] Equal to (==) False
    • Actions
      • Set Temp_PlayerGroup = (Player group((Player(NPC_PlayerNumber))))
      • Set NPC_PlayerNumber = (Player number of (Triggering player))
      • Set NPC_Load_TalkTimes_Integer = (Load 0 of (Key (Load 0 of (Custom value of NPC_AskedUnit[NPC_PlayerNumber]) in NPC_Hashtable)) from NPC_Hashtable)
      • Set NPC_Line[NPC_PlayerNumber] = (NPC_Line[NPC_PlayerNumber] + 1)
        • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
          • If - Conditions
            • NPC_Line[NPC_PlayerNumber] Equal to (==) (NPC_Load_TalkTimes_Integer + 1)
          • Then - Actions
            • Set NPC_Line[NPC_PlayerNumber] = 1
          • Else - Actions
      • Set NPC_Message_Ask = <Empty String>
        • Do Multiple ActionsFor each (Integer Integer_General) from 1 to NPC_Load_TalkTimes_Integer, do (Actions)
          • Loop - Actions
            • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
              • If - Conditions
                • Integer_General Equal to (==) NPC_Line[NPC_PlayerNumber]
              • Then - Actions
                • Set NPC_Message_Ask = (NPC_Message_Ask + (NPC_Select_Color + (> + ((Load Integer_General of (Key (Load 0 of (Custom value of NPC_AskedUnit[NPC_PlayerNumber]) in NPC_Hashtable)) from NPC_Hashtable) + |r|n))))
              • Else - Actions
                • Set NPC_Message_Ask = (NPC_Message_Ask + (NPC_Normal_Color + (<Empty String> + ((Load Integer_General of (Key (Load 0 of (Custom value of NPC_AskedUnit[NPC_PlayerNumber]) in NPC_Hashtable)) from NPC_Hashtable) + |r|n))))
      • Cinematic - Send transmission to Temp_PlayerGroup from NPC_Unit_Talk[NPC_PlayerNumber] named |cFF01660CWhat to A...: Play No sound and display NPC_Message_Ask. Modify duration: Set to 600.00 seconds and Don't wait
      • Custom script: call DestroyForce(udg_Temp_PlayerGroup)
  • NPC Right
    • Events
    • Conditions
      • NPC_IsInMode[(Player number of (Triggering player))] Equal to (==) True
      • NPC_IsTalking[(Player number of (Triggering player))] Equal to (==) False
    • Actions
      • Set NPC_PlayerNumber = (Player number of (Triggering player))
      • Set Temp_PlayerGroup = (Player group((Player(NPC_PlayerNumber))))
      • Set NPC_IsTalking[NPC_PlayerNumber] = True
      • Set NPC_Load_TalkTimes_Integer = (Load 0 of (Key (Load 0 of (Custom value of NPC_AskedUnit[NPC_PlayerNumber]) in NPC_Hashtable)) from NPC_Hashtable)
      • Set NPC_Action = (Load NPC_Line[NPC_PlayerNumber] of (Key (Load 0 of (Custom value of NPC_AskedUnit[NPC_PlayerNumber]) in NPC_Hashtable)) in NPC_Hashtable)
      • Set NPC_Wait = (Load NPC_Line[NPC_PlayerNumber] of (Key (Load 0 of (Custom value of NPC_AskedUnit[NPC_PlayerNumber]) in NPC_Hashtable)) from NPC_Hashtable)
      • Set NPC_Message_Answer = (NPC_Message_Color + ((Load (Key (Load 0 of (Custom value of NPC_AskedUnit[NPC_PlayerNumber]) in NPC_Hashtable)) of NPC_Line[NPC_PlayerNumber] from NPC_Hashtable) + |r))
      • Cinematic - Send transmission to Temp_PlayerGroup from NPC_AskedUnit[NPC_PlayerNumber] named (Name of NPC_AskedUnit[NPC_PlayerNumber]): Play No sound and display NPC_Message_Answer. Modify duration: Set to NPC_Wait seconds and Don't wait
      • Custom script: call DestroyForce(udg_Temp_PlayerGroup)
      • Wait NPC_Wait seconds
      • Set Temp_PlayerGroup = (Player group((Player(NPC_PlayerNumber))))
      • Set NPC_Action = (Load NPC_Line[NPC_PlayerNumber] of (Key (Load 0 of (Custom value of NPC_AskedUnit[NPC_PlayerNumber]) in NPC_Hashtable)) in NPC_Hashtable)
      • Set NPC_Load_TalkTimes_Integer = (Load 0 of (Key (Load 0 of (Custom value of NPC_AskedUnit[NPC_PlayerNumber]) in NPC_Hashtable)) from NPC_Hashtable)
      • Trigger - Run NPC_Action (checking conditions)
      • Set NPC_PlayerNumber = (Player number of (Triggering player))
      • Set NPC_IsTalking[NPC_PlayerNumber] = False
        • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
          • If - Conditions
            • NPC_IsInMode[NPC_PlayerNumber] Equal to (==) False
          • Then - Actions
            • Skip remaining actions
          • Else - Actions
      • Set NPC_Message_Ask = <Empty String>
        • Do Multiple ActionsFor each (Integer Integer_General) from 1 to NPC_Load_TalkTimes_Integer, do (Actions)
          • Loop - Actions
            • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
              • If - Conditions
                • Integer_General Equal to (==) NPC_Line[NPC_PlayerNumber]
              • Then - Actions
                • Set NPC_Message_Ask = (NPC_Message_Ask + (NPC_Select_Color + (> + ((Load Integer_General of (Key (Load 0 of (Custom value of NPC_AskedUnit[NPC_PlayerNumber]) in NPC_Hashtable)) from NPC_Hashtable) + |r|n))))
              • Else - Actions
                • Set NPC_Message_Ask = (NPC_Message_Ask + (NPC_Normal_Color + (<Empty String> + ((Load Integer_General of (Key (Load 0 of (Custom value of NPC_AskedUnit[NPC_PlayerNumber]) in NPC_Hashtable)) from NPC_Hashtable) + |r|n))))
      • Cinematic - Send transmission to Temp_PlayerGroup from NPC_Unit_Talk[NPC_PlayerNumber] named |cFF01660CWhat to A...: Play No sound and display NPC_Message_Ask. Modify duration: Set to 600.00 seconds and Don't wait
      • Custom script: call DestroyForce(udg_Temp_PlayerGroup)
  • NPC Exit
    • Events
      • Player - Player 1 (Red) skips a cinematic sequence
      • Player - Player 2 (Blue) skips a cinematic sequence
      • Player - Player 3 (Teal) skips a cinematic sequence
      • Player - Player 4 (Purple) skips a cinematic sequence
      • Player - Player 5 (Yellow) skips a cinematic sequence
      • Player - Player 6 (Orange) skips a cinematic sequence
      • Player - Player 7 (Green) skips a cinematic sequence
      • Player - Player 8 (Pink) skips a cinematic sequence
    • Conditions
      • NPC_IsInMode[(Player number of (Triggering player))] Equal to (==) True
    • Actions
      • Set Temp_PlayerGroup = (Player group((Player(NPC_PlayerNumber))))
      • Set NPC_Load_TalkTimes_Integer = (Load 0 of (Key (Load 0 of (Custom value of NPC_AskedUnit[NPC_PlayerNumber]) in NPC_Hashtable)) from NPC_Hashtable)
      • Set NPC_PlayerNumber = (Player number of (Triggering player))
      • Unit - Make NPC_AskedUnit[NPC_PlayerNumber] face (Load (NPC_Load_TalkTimes_Integer + 1) of (Key (Load 0 of (Custom value of NPC_AskedUnit[NPC_PlayerNumber]) in NPC_Hashtable)) from NPC_Hashtable) over 2.00 seconds
      • Unit - Make NPC_Unit_Talk[NPC_PlayerNumber] Vulnerable
      • Selection - Select NPC_Unit_Talk[NPC_PlayerNumber] for (Player(NPC_PlayerNumber))
      • Cinematic - Turn cinematic mode Off for Temp_PlayerGroup over 0.20 seconds
      • Camera - Reset camera for (Player(NPC_PlayerNumber)) to standard game-view over 0.00 seconds
      • Set NPC_IsInMode[NPC_PlayerNumber] = False
      • Custom script: call DestroyForce(udg_Temp_PlayerGroup)



What is this?


This is a Highly Configurable System useful for RPG Makers or Even SPRPG's. This is used to Speak to somebody using Cinematic Mode + Arrow Keys for a specific amount of time and Do whatever Needed using External Triggers.

NOTE: This system is MPI, Not MUI. Mainly because of the Idea Itself. So It might be "Only" useful for RPG's.


How to work with this

Go Near a unit with your "Specific" Hero. (200 Range)
Select it. This enables the Mode.

You may Exit at Any time using ESC.
Toggle between Dialogues using Up (/\) and Down (\/) Arrow keys.
Select a Dialogue using Right (>) Arrow Key.

NOTE: Left Arrow Key Toggles Nothing.
NOTE: Actions defined in the Init Trigger Happen "After" the Answer is Fully given.
NOTE: The Wait should be Fully Functional.

Requirements


Bribe's Unit Indexer (Included).


V 1.0.0
Release

V 1.1.0
Fixed an MUI bug in the Wait

V 1.2.0
Fixed so many things before moderators tell me :D

V 1.3.0
Fixed some Stuff, removed and Added some Things, and now the spell is based on Unit Indexer.


Keywords:
NPC, System, MPI, RPG, Arad MNK, Speak, Talk, Configurable
Contents

NPC system by Arad MNK (Map)

Reviews
12:26, 4th Sep 2015 IcemanBo: http://www.hiveworkshop.com/forums/spells-569/npc-system-arad-mnk-v-1-3-0-a-269046/#post2726359
Level 17
Joined
Dec 11, 2014
Messages
2,004
Seems like my system, question is whom of us got the most user friendly one :p

Yes... I saw many system like this and their Weak Points.

PS: I actually wanted to use yours; but when I saw it happened on Map init I simply forgot about it :)

~Triggers added and NPC Entering trigger updated with 4 new events (9-12 Player event)

EDIT:
Changelog:

Wait MUI problem is solved using Locals
 
Last edited:

Chaosy

Tutorial Reviewer
Level 40
Joined
Jun 9, 2011
Messages
13,183
Ugh.. that is a lot of code o_O

I used an online text counter to get the number of lines used. My system use 114 rows and your use 289 (comment lines included so it's a bit less)
And then we have the wait, as you use triggering X and nothing else after the wait it's still MUI but the wait remain inaccurate, +- 0.27 seconds I think it is.
 
Level 17
Joined
Dec 11, 2014
Messages
2,004
Accuracy isn't Needed.

My system is Hardcoded. The Whole thing was supposed to be made for a Lazy guy such as me so that When I want to add some Things I won't have to make a whole New Trigger and Stuff. Just Register and Bye Bye.
Also; I'm a bit Anti-JASS (I know however it is very useful indeed) so I wanted to use Custom Scripts ONLY for Leaks, not the System. Yours has a Bit Lot of JASS .

And also: Only Count the Main stuff in The Init trigger. Most things there are a Demo.
 

Chaosy

Tutorial Reviewer
Level 40
Joined
Jun 9, 2011
Messages
13,183
Accuracy isn't Needed.

My system is Hardcoded. The Whole thing was supposed to be made for a Lazy guy such as me so that When I want to add some Things I won't have to make a whole New Trigger and Stuff. Just Register and Bye Bye.
Also; I'm a bit Anti-JASS (I know however it is very useful indeed) so I wanted to use Custom Scripts ONLY for Leaks, not the System. Yours has a Bit Lot of JASS .

And also: Only Count the Main stuff in The Init trigger. Most things there are a Demo.

My system was pretty much 100% GUI until I wanted to merge three triggers into one. That's when I was forced to add vjass. It is possible to do in GUI if one really wants to.

I don't mind that you code in that way. But if you want it to be approved you might want to do something about it as I doubt it will get approved as of now.
 
- The system is much too specific imo. It should not handle things like cam settings, selections, invulnerability. Systems should be straight forward.
For certain maps it might be okay, but as it influences gameplay these things should be seperated from a chat system.
- Does the demo work correctly? It seems bugged for me. For example, I could not end dialogs.
- Units can't talk more than once sentence. (?)
- When there will be like 5 answer possibilities it won't fit in the box anymore.(?)
- Demo code should not be included in system code. It should be seperated.
- Why you null certain Trigger variables in config?
- UnitType support dialog would be cool.
- User control when to start NPC dialog was good.

Don't get me wrong, it might be useful for a map, but for a general system submission it's far away from being useful.
I don't want to unmotivate you, but I think it's very hard to create a good chat system, especially in GUI, because all becomes a mess.
 
Level 17
Joined
Dec 11, 2014
Messages
2,004
- The system is much too specific imo. It should not handle things like cam settings, selections, invulnerability. Systems should be straight forward.
For certain maps it might be okay, but as it influences gameplay these things should be seperated from a chat system.
- Does the demo work correctly? It seems bugged for me. For example, I could not end dialogs.
- Units can't talk more than once sentence. (?)
- When there will be like 5 answer possibilities it won't fit in the box anymore.(?)
- Demo code should not be included in system code. It should be seperated.
- Why you null certain Trigger variables in config?
- UnitType support dialog would be cool.
- User control when to start NPC dialog was good.

Don't get me wrong, it might be useful for a map, but for a general system submission it's far away from being useful.
I don't want to unmotivate you, but I think it's very hard to create a good chat system, especially in GUI, because all becomes a mess.
At first, thank you for Moderation.

This isn't a chat System, It's an NPC system. You talk to units, not players.

- You couldn't? What do you mean? Like, Using ESC or Bye?
- If you mean Transmissions, yes.
- Exactly. I was thinking about a Page system as well.
- It Includes both Configuration and Init Triggers. Is this a Problem?
- The system runs a Trigger with each Transmission. Setting it to null means it runs nothing.
- Hmmmm..... That's a good idea and can be easily implemented. OK.
- Thank you.

PS: This MUST be Needs fix as I forgot to add Deindexing Support XD
 
Yes, true you talk with a non-player unit, but only say 1 sentence might not suffice. It is very limiting the whole.

I was not able to end the talk in any way in the demo.
I could not walk around and test something, I insantly got into the conversation when selecting the paladin.

Yes, demo and core system should be seperated.

- Thank you.
It maybe was misleading. I meant it was good if the user had control when to start a dialog.^^

I forgot to add Deindexing Support XD
Okay:).
 
Level 17
Joined
Dec 11, 2014
Messages
2,004
- That will make Merging... Very hard.

- Oh Shit... I forgot to change that.

- Hehe, They Both had the "After Unit Index" Therefore I used them as the Same. Will Change.

- Whoops!
Well, that is pretty much impossible.
In My system, the Asking is built during Loading. Loads Line 1, 2, 3, etc. So I can't use "Enter" for strings like that, so I Have to use "|n".
And This only works for tooltips and Texts in Cinematic/Letterbox mode.

- Yup! Glad it wasn't approved then I had to tell a mod to Approve it again...!
 
Top