HeroEngine Forums
Welcome, Guest. Please login or Register for HeroCloud Account.

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - GFG_Ulfrpsion

Pages: [1] 2 3
1
Quote
Do you mean you used replication on the spec-derived objects?  Because replication should not be used on the actual specs themselves.

yes, SDOs are reverse replicated not the SpecOracles themselves, sorry for the confusion.

Quote
Hi!

Hello!

Quote
I don't know if this will help, but i usually change a value on the server side, which get persisted through the play session. Then replicate its value to the client. So you don't need to use reverse replication in this case.

Ah yeah, I guess that does make sense? Why allow client nodes to modify server nodes without some sort of tracking, invalid data protection or some sort of constraints, right? Plus you can build in CSR support commands as you're going along.

edit: Making a command

2
So I've got a few common fields to the player and NPCs which are stored on the E_CommonCharacter. I'd like some of those values to remain consistent for the player through play sessions, but I can't seem to get the fields to reverse replicate for the player. For example, I'd like the wealth or hitpoints to save past log-in sessions.

I've set the server and client destinations for the fields and classes as well as set the fields to reverse replicate, but it just won't do it. I've also added in as part of the post-area load process adding the player along with the client ID for reverse replication but that doesn't seem to help either.  I've made specOracles and had their instances reverse replicate in the same manner that I'm going about reverse replicating the fields on the player character, but I can't seem to figure out why it is not saving the information. Any help in understanding what I need to do would be deeply appreciated.

I should note that I've also looked in server scripts referencing variables from the E_CommonCharacter class. Their changes all seem to be handled as cmds, and the E_playerCharacter doesn't seem to utilize reverse replication for me to mimic, so I'm stuck.

3
I'm having a problem where data nodes that I've associated with the character are being released post area creation and I can't quite seem to figure out why.

I got from character selection to the clean test area. My nodes replicate to the character only at the Character Selection when it's being purged, and then release before anything else happens. When the character moves to the next area, the replication is not called on area enter, and I can't figure out why it's not being called.

I'm assuming it's because when the nodes are replicated, I do a soft association on the client with the E_playerCharacter object, and those associations are lost post character selection?

I call the replicateNode method within the HE_PostEnteredArea() method in server script, which should replicate the nodes to the E_playerCharacter which handles the replicated nodes in the _OnReplicationNodeAdded() method in the client....only it's only calling it as the Character Selection area is being purged. You can see it in the consol messages I've included below:

Code: [Select]
14:25:24: SYSTEM:System:ActivateAreaSpec 3758002374 assigning ID 1 instance 50
14:25:24: System:SetSkyDomeAsset 0 into Auto in Character Selection
14:25:24: SYSTEM:System:Just received an area.dat file '\world\livecontent\systemgenerated\3758002374\AREA.DAT'
14:25:24: SYSTEM:System:Character Selection (3758002374) activate
14:25:24: System:SCRIPT[_characterSelectionClassMethods]:Got updated names...
14:25:28: SYSTEM:System:SUA purging active area
14:25:28: SYSTEM:System:Character Selection (3758002374) PURGE
14:25:28: SYSTEM:System:Purging EnviroSchemes
14:25:28: SYSTEM:System:Released area 51
14:25:28: SYSTEM:System:LR:setDefaultCacheSize
14:25:28: SYSTEM:System:LR:setDefaultCacheSize done
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:Node added on Replication
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:Node is: 9223372064304664349
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:Node added on Replication
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:Node is: 9223372064305664354
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:Skill source node: 9223372064304664349
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:Skill added to node: 9223372064304664349, SkillName is:Unarmed
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:Node added on Replication
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:Node is: 9223372064305664355
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:Skill source node: 9223372064304664349
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:Skill added to node: 9223372064304664349, SkillName is:1-Handed
.....
.....//runs through a series of lightweightcommands here//
.....
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:On field updated! E_CharacterSkillsTotal
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:Skill List size: 2
14:25:28: !ERROR!HeroScript::HeroMachine::ScriptError:GOM::setPropertyOnNode (11133): requested node ID (0) not found while setting node property "Behave"
14:25:28: !ERROR!System:SCRIPT ERROR: GOM::setPropertyOnNode (11133): requested node ID (0) not found while setting node property "Behave"
11/08/2012 14:25:23
Call trace:
  Script E_equipmentPropBucketClassMethods line 35 me[1000000205]
  Script _BasePropBucketClassMethods line 53 me[1000000205]
starting method/function ASSETSPECREADY
starting me[id=1000000205 class=E_equipmentPropBucket]
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:System. Wat r u doin. SYSTEM. STAHP.
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:Trying to release Skill replicated nodes for destruction
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:System. Wat r u doin. SYSTEM. STAHP.
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:Trying to release Skill replicated nodes for destruction
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:System. Wat r u doin. SYSTEM. STAHP.
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:Trying to release the E_playerCharacter node for destruction
14:25:28: SYSTEM:System:Reset the synchronized clock.
14:25:28: SYSTEM:System:ActivateAreaSpec 4611686018427637930 assigning ID 4611686018427637930 instance 51
14:25:28: System:SetSkyDomeAsset 0 into Auto in Clean Test
14:25:28: SYSTEM:System:Just received an area.dat file '\world\areas\4611686018427637930\AREA.DAT'
14:25:28: SYSTEM:System:Clean Test (4611686018427637930) activate
14:25:28: !ERROR!System:Replication error: Replication error with node 9223372064351664342 'field ID: 9223372059571664325 not present in HeroClass(4611686018427647914)::getField on node 9223372064351664342' doing ReplicationGroupBase.cpp(2056):pVar = pNode->getField(mFieldBeingSet)
14:25:28: System:SCRIPT[LightweightEventsClassMethods]:Adding Event: xpUpdated
14:25:28: System:SCRIPT[LightweightEventsClassMethods]:Adding Event: levelUpdated
14:25:28: System:SCRIPT[LightweightEventsClassMethods]:Adding Event: nameUpdatedSB
14:25:28: System:SCRIPT[LightweightEventsClassMethods]:Adding Event: updateMindMax
14:25:28: System:SCRIPT[LightweightEventsClassMethods]:Adding Event: updateMindCurrent
14:25:28: System:SCRIPT[LightweightEventsClassMethods]:Adding Event: updateMindWounds
14:25:28: System:SCRIPT[LightweightEventsClassMethods]:Adding Event: updateBodyMax
14:25:28: System:SCRIPT[LightweightEventsClassMethods]:Adding Event: updateBodyCurrent
14:25:28: System:SCRIPT[LightweightEventsClassMethods]:Adding Event: updateBodyWounds
14:25:28: System:SCRIPT[LightweightEventsClassMethods]:Adding Event: updateLimbMax
14:25:28: System:SCRIPT[LightweightEventsClassMethods]:Adding Event: updateLimbCurrent
14:25:28: System:SCRIPT[LightweightEventsClassMethods]:Adding Event: updateLimbWounds
14:25:28: System:SCRIPT[_GUITabClassMethods]:_tab has no tab/panel associations, or more than one!
14:25:28: !ERROR!HeroScript::HeroMachine::ScriptError:Could not find ownedPanel for tab: _tab
14:25:28: !ERROR!System:SCRIPT ERROR: Could not find ownedPanel for tab: _tab
11/08/2012 14:25:23
Call trace:
  Script _GUITabClassMethods line 202 me[id=1000006772 class=_GUITab]
  Script _GUITabClassMethods line 147 me[1000006772]
  Script _GUITabbedParentClassMethods line 54 me[1000006762]
starting method/function ONCONTROLBUILD
starting me[id=1000006762 class=_GUITabbedParent]
14:25:28: System:SCRIPT[E_playerAccountClassMethods]:My plyer ccount id: 0
14:25:28: System:SCRIPT[E_playerAccountClassMethods]:My name? :newtest
14:25:28: System:SCRIPT[E_playerAccountClassMethods]:My skills total: 0
14:25:28: System:SCRIPT[E_playerAccountClassMethods]:A group was added to the playet account
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:On field updated! E_experiencePoints
14:25:28: System:SCRIPT[E_playerCharacterClassMethods]:Skill List size: 0


4
GUI Creation / Re: Hide or show GUIs
« on: Nov 02, 12, 08:13:42 AM »
Sorry, let me give some clarity. _toggleCharSheet is a field on the _toggle class of type NodeRef.

with hasVariable(node, string), I'm running into a problem since _toggleCharSheet is of type NodeRef, it doesn't recognize it having the visible field.

But, I've got clarity now in just talking about it. I'll just make it of type GUIControl or even NodeRef of Class since my GUI already inherits from GUIControl. I mean why even have it as just a NodeRef? I don't want it to hold anything but GUIControls. /facepalm, I don't know why I didn't think to do this in the first place.

5
GUI Creation / Re: Hide or show GUIs
« on: Nov 02, 12, 05:45:51 AM »
I believe I've found a solution. I'm using the "press I" tutorial for reference to the code. This is part of the toggling prototype.

Code: [Select]
Method toggleCharSheet()
  var player = GetAccountID()
  //println(player)
  if me._toggleCharSheet = None
    popUpCharacterSheet as NodeRef of Class GUIMovePanel = CreateNodeFromPrototype("E_CharacterAttributesSheet")
    popUpCharacterSheet.build = true
    popUpCharacterSheet.visible = true
    me.TestBoolean = false
      //$LightweightEvents.addLightweightEventListener(addedNode, "attributesChanged", popUpCS)
      me._toggleCharSheet = popUpCharacterSheet
  else
      popUpCharacterSheet as NodeRef of Class GUIMovePanel
      popUpCharacterSheet = me._toggleCharSheet
      if popUpCharacterSheet.visible = false
        popUpCharacterSheet.visible = true
        me._toggleCharSheet = popUpCharacterSheet
      else
        popUpCharacterSheet.visible = false
        me._toggleCharSheet = popUpCharacterSheet
      .
    //DestroyNode(me._toggleCharSheet)
   
    //me._toggleCharSheet = None
  .
.


I put a nested If/else testing the visibility of the GUI, and switching it based on it's current state. Not the cleanest option, but I don't have to build unnecessary fields into my toggling class.

Anyways, it runs very smooth and very quick without any long pauses between button presses.

Now here's my question. In the script, I have to make a temp variable as NodeRef of Class GUIMovePanel, then set it to my toggle panel, switch the variable and then set my toggle panel back to the  temporary move panel. Is there a way to just say if it hasVariable(node, string), opperate on it? The compiler yells at me if I do that. I'm worried I'm throwing my lightweight events off into space by doing it this way though.

6
GUI Creation / [Resolved] Hide or show GUIs
« on: Nov 02, 12, 02:58:05 AM »
Does anyone know of a way to hide or turn the visibility of individual panels off or are layers the only way to do that?  I'm finding that as I am creating panels, and tying in light weight events to each panel, building the panel on the fly causes a significant pause as I start to expand my character data. I'd like to just turn the panels off instead of rebuilding so that I reduce calls to the lightweight event system.


7
Developer Created Tutorials / Re: SpecOracle Step-by-Step issue
« on: Jun 19, 12, 09:57:37 AM »
No problem! Good luck with everything. I'm working on currently getting complex SDO's with helper specs created and replicated to the client after associating to the player on the server. If it works out, I may do another tutorial.


8
GUI Creation / Re: About gui animation interpolate
« on: Jun 18, 12, 09:54:29 AM »
Greetings,

There is actually a built-in interpolation animation for GUIs. It's hard to wrap around at first, so I'll add my code to show you.

Code: [Select]

//method to set the animation for a bar.
method UpdateBar(value as Integer, max as Integer, panelname as String) as Boolean
  var mx = max * 1.00
  var val = value * 1.00
  var ratio = val/max
  var size = (ratio * -100.00)
  println("Size of bar: "+size)
  Slider as NodeRef of Class GUIControl = FindGUIControlByName(me, panelname)
  println(Slider.name)
  Slider.removeAnimations()
  //alert our information for debug purposes.
  println("Size: "+size)
  //Begin our animation information.
  animationString as String = "size.x,"
  animationString = animationString +  Slider.size.x + ","//should be 0.
  animationString = animationString + size +","//should be our bar's size.
  animationString = animationString + .1 + ","
  animationString = animationString + 1 + ","
  animationString = animationString + "false,"
  animationString = animationString + "LINEAR," 
  animationString = animationString + "false,"
  animationString = animationString + "0,"
  animationString = animationString + "slide"
 
  GUIAnimation:addAnimation(Slider, "Interpolate", animationString)
  return true
  .

Basically, by setting up your panels and getting a handle for the panel objects, you can attach an interpolate animation to the bar/panel. Passing in a string with the interpolation type, you can change the interpolated bar. There's really not alot out there for it, so you'll need to play with it a bit. Check this wiki link for some added help:
http://wiki.heroengine.com/wiki/GUI_Animations


9
Developer Created Tutorials / Re: SpecOracle Step-by-Step issue
« on: Jun 18, 12, 09:48:30 AM »
Greetings.

This was an issue I had as well. I found it was because I had not GLOM'ed my specific class to the utilities and spec oracle prototypes.

Since your HeroEngine hotspot causes your engine to crash, you should still have access to the tools that are present without it being rebuilt. Use that to get into the SystemNodesConfiguration GUI. This will be where you can verify that you've glom'ed your class override functions to the right nodes.

If you have and it still doesn't work, then we can debug from there. You may need to duplicate the Hotspot into another GUI so it can create a new node and thus a new hotspot or you haven't added the extra row for you SpecOracle to populate to, and we can check that as well.

10
Ok, now I'm a bit confused. I'll explain how I've set it up and hopefully we can resolve what I'm doing right or wrong from that.

  • I've set up my E_PlayerCharacter methods on the server to create a _replicationgroup if none exists, and I've created a field which stores that noderef on the server-side E_playercharacter class.
  • On area enter, I call the creation of the _replicationgroup which checks to see if one exists and if not, creates a new one.
  • my primary node is my E_playercharacter, I assume I need to change this to something else like a manager class made for the secondary nodes I'm attaching?
  • I add the client ID through the getMyAccount method as the client group.
    • I add all these SDOs I've created as secondary replication objects
    • Now I'm stuck?

    I'm not quite sure how I get these nodes on the client? These nodes are things like the player's skills. If I want the client to respond to this by having this as data as part of the character, how do I identify it? I get the general idea of it, but I'm still confused about how I should or being able to identify the client, and when I do, on the client side, how I identify the data replicated.
    Thanks!

11
I'm having some trouble finding a good bit of information on this and was wondering what others did? I've got a replication group being created for a series of spec derived objects I've created on the server which are hard associated to the character. Now I need them to replicate to the client. I'm not ready to tackle other entities being aware of this information through spacial awareness, I'm just trying to get it onto the client first.

I assume on entering an area, I'm going to need to call something like this?
Code: [Select]
method addClientReplication()
 spatialEntity as ID = me
  if me is kindof _playerCharacter
    spatialEntity = me.getMyAccount()
  .
 myCachedReplicationGroup._addClientDestination(account as ID, spatialEntity as ID)
.

if this is about the case, how am I to get the account and spatialEntity as an ID for the player's character? Will the ID of .getMyAccount from the _playerCharacter class methods script in the server work for these IDs?

As well, to test if the replicated objects are being received on the client, how can I query the replicated objects when received?

I know I can use to trigger when I've replicated the group:
Code: [Select]
method _OnReplicationGroupAdded()
.

But is there a specific method I haven't found yet that can query the secondary replicated objects and get a noderef to them?

12
Developer Created Tutorials / Re: SpecOracle Step-by-Step issue
« on: Apr 23, 12, 12:25:53 PM »
Hey, I just finished writing this up and figured it would help you all out.

Appologies if there are a lot of typos and such. I didn't have a whole lot of time to write it up, and I didn't want to keep you guys waiting.

https://www.dropbox.com/s/4zsppv0xkr67l1o/Spec%20Oracle%20GUI%20Tutorial.docx

13
I'd say GUIs are the best place to start. Messing around with all the GUI stuff and getting your own Stats Window showing up shouldn't take too long and will get you comfortable with using the tools. Once you've got that down pat, moving to the character data should be a breeze.

GUIs use a mark-up language similar to HTML (it functions closer to WPF, or asp, so if you have experience there then you'll grasp it with ease) so if you're comfortable with HTML, understanding some of the properties of the GUI XML, and then eventually going to the XML side (instead of using the editor) will get you rolling with the engine fastest. You'll lightly touch on the client-side scripts with a simple GUI, and it will introduce a lot of the more advanced topics naturally like what a prototype is, or how objects are created on the client and what you have access to as far as events, and that sort of thing. And, since GUIs use a lot of visual items, learning how to reference your game's art asset repository will be helpful.

14
If you've ever done anything in C#, Java or Flash, then you'll probably pick up Hero pretty quickly. You won't be reinventing the wheel for garbage collection nor will you be dealing with pointers....but you also won't be directly dealing with a database in terms of making tables and that sort of thing. It's much more of an Object Oriented database in which you create classes and then the data is represented as instances of those classes. Classes are like records, except they point to a script and have various other things about them.

The hardest part of HeroEngine is learning the design structures...not so much the programming. There's a lot of difficulty with this, and the Wiki/Tutorials don't quite explain everything as they all kind of build on topics you learn as you go along. The biggest hurdles you will face are understanding the relationships game systems have with each other.

If you need a good jumping point, begin with making a simple window. This will get you some hands on with interacting with the client-side script if you add some stuff like buttons or whatever. From here, move to messing around with the character. Maybe add a field or something like a Mana stat, and get it to show up on some of the pre-built GUIs. This will help you understand the event handlers and communicating your data from server to client, as well as scripting on the server-side. From here, you're going to realize that all game objects that you want in your world will be represented with Specs. Either get your hands dirty with prototypes, or try and build a spec oracle. From that, you'll be making stuff in no time.

I won't lie and say this doesn't draw on heavy OOP understanding. I came into programming Hero with C#, C++, Flash/AS, Java, and bunch of other random scripting languages under my belt, and it still breaks my brain frequently. If you've got any OOP experience, then you'll be ahead. You won't be making the next WoW in 6 months, that's just ridiculous...but you will be able to say make what a character is and maybe start getting things like classes or skills or whatever into your game (if you're doing anything like WoW or other MMOs).

And in case you're wondering:
  • Yes Hero supports building a skill system, but they don't just hand it to you.
  • Yes you can build a free-place inventory system. But you'll be building it from ground up.
  • Yes you can make your world seamless.
  • Yes Hero supports player-placing structures and stuff like houses, but it won't be easy and I've yet to see someone complete it fully (I think it requires a full license as you'd need to make some changes to the Engine).
  • Yes Hero supports complex physics, but it's doubtful you'll get anything more than something like WoW or Rift or one of the other bjillion MMOs out there that haven't done it.
  • Hero has some of the best per-polygon collision detection I've seen in a free Engine.
  • I have not seen Hero have the ability to make a flying game that allows you to fly seamlessly from space and land on the ground and then get out and walk around with a toon. Your floating point values for polys would crash if you tried that anyways--you're not a phD in programming so don't expect to reinvent the wheel here.
  • Hero relies on GUI XML, so to make an add-on system for your players, you'll need a license.

Hero is a massive tool, and you'll be able to build pretty much any MMO you want...but you'll building all of it, including what a character is exactly, or what is an inventory and what are items. In 6 months, with a lot of effort, I'm sure you'll be able to program most things in Hero--I've been at it for a total of about 150 working-hours (less than 6 months), and I feel pretty confident that I can program any system I dream up, or I can at least find out how to program it.

15
Developer Created Tutorials / Re: SpecOracle Step-by-Step issue
« on: Apr 13, 12, 08:32:44 PM »
Hello!
Quoting the wiki:
Quote
13. Follow these directions for overriding the $SPECORACLEUTILS system node with a game-specific version.
a. The singleton getter method
Code: [Select]
  // example
  method GetYourThingSpecOracle() as NodeRef of Class YourThingSpecOracle
    yourThingSpecOracle as NodeRef of Class YourThingSpecOracle = $SPECORACLEUTILS._GetSpecOracleByClass( "YourThingSpecOracle")
    return yourThingSpecOracle
  .
b. The class test for your SpecOracle class in HE_GetSpecOracleByClass
Code: [Select]
  // example
  is "yourthingspecoracle"
    if otest is kindof YourThingSpecOracle
      specOracle = otest
      break
    .
  .
c. Add call to singleton getter to HE_GetAllSpecOracles
Code: [Select]
  // example
  add back me.GetYourThingSpecOracle() to oracles

You're going to be creating a class as your Spec Oracle Utilities which interfaces with the rest of the Spec Oracle system. Pretty much telling the Engine your Spec Oracle exists and how to find it.
See:
http://wiki.heroengine.com/wiki/Spec_system#SpecOracleUtils_System_Node

So it's going to be a class representing your SpecOracleUtils system node. Create a new class on the client.
Name it YourGameName_SpecOracleUtils.
The archetype is Data. Package is Game.
Parent classes need to be:
-CollectionOrderedSet
-ObsSubject
-SpecOracle

Mostly these parent classes give it some data stuff that aren't needed on the server or operate differently on the server.

This class, which is basically just another SpecOracleUtils node like any other is your game specific version of the SpecOraclUtils -- overriding.

The implementations of the functions are in this created class' methods. Basically each of these methods have an engine version and a implemented version. They all follow the same basic logic, and you'll see them a lot, but you're not quite using it as an override, just using your function in place of the engine function.

It looks like this:
Code: [Select]
handled as boolean
if hasMethod("HE_GetSpecOracleByClass")
 me.HE_GetSpecOracleByClass
 handled = true
.
if not handled
 me._GetSpecOracleByClass
.

Basically that is saying if it has the HE version of the method, then call it. Otherwise, use the engine default.


My class methods script for this class looks like this:
Code: [Select]
method GetSkillSpecOracle() as NodeRef of Class SkillSpecOracle
  //The singleton getter method
  SkillSpecOracle as NodeRef of Class SkillSpecOracle = $SPECORACLEUTILS._GetSpecOracleByClass( "SkillSpecOracle" )
  return SkillSpecOracle
.


method HE_GetAllSpecOracles( oracles references List of ID ) as Boolean
// This method is called to retrieve all of the oracles of which the spec system should be
//    aware.  The default GUIs and a variety of utility functions depend on your oracle
//    being included in this list
//Add call to singleton getter to HE_GetAllSpecOracles
  add back me.GetSkillSpecOracle() to oracles
  return true
.


method HE_GetSpecOracleByClass( oracleClass as String, specOracle references NodeRef of Class SpecOracle ) as Boolean
  //The class test for your SpecOracle class in HE_GetSpecOracleByClass
  Assert( ClassExists( oracleClass ), "Invalid class name provided to GetSpecOracleByClass")
 
  oracles as List of NodeRef of Class SpecOracle = $SPECORACLEUTILS._GetKnownSpecOracles()
 
  oTest as NodeRef
  foreach o in oracles
    otest = o
    when toLower( oracleClass )
      is "skillspecoracle"
        if otest is kindof SkillSpecOracle
          specOracle = otest
          break
        .
      .
    .
  .
  if specOracle <> None
    return true
  .
 
  return false
.

That's it!
Now it's time to GLOM it to the $SPECORACLEUTILS!
Either Shift+left click the top left, or just hit f5.
Hit the tools tab.
Select System Node Configuration GUI.
Select Client.
Type in the name of the class you just made.
Hit "Add"
BAZING! You're done.


Now for the other steps:

14. Create client-side script YourThingSpecOracleClassMethods from template TemplateSpecOracleClassMethods, changing strings returned as needed.

Since you copied over your SpecOracle from the server, it just copied over the Class fields. Open the script, it will be blank. Select TemplateSpecOracleClassMethods.

15. Create client side YourThingSpecClassMethods from the template TemplateBaseSpecClassMethods, and change getMySpecOracle() to return "YourThingSpecOracle".

Simple enough, you will see a method in the template called "getMySpecOracle()". It's a getter! Just make sure it returns your spec oracle.

Quote
Also I am wondering how to add my new spec with the GUI editor

This gave me the biggest headache.
Make sure you keep this in mind AFTER you get it shown in the GUI Editor:
https://community.heroengine.com/forums/index.php/topic,1180.0.html

This will allow you to add fields that name/describe your Specs in the editor so they appear as more than just "spec key: 1
 spec key: 2
 etc..."


Adding the Spec Oracle to the GUI:
Honestly, just best to make your own implementation of the _HotSpotGUI.

Create a class for the script of your hotspotgui. It can be confusing, but it needs to be MyGameName_HotSpot.
This is because _HotSpot is different than HotSpotGUI methods and you don't want to confuse yourself.

My class has these methods:
Code: [Select]
method HE_buildHotSpotGUI() as NodeRef of Class GUIControl                           
  //Calling HE_buildHotSpotGUI here, overrides the HeroEngine call
  gui as NodeRef of Class GUIControl = createNodeFromPrototype("GFG_HotSpotGUI")   
  //Here is where you have it use your own GUI Control, instead of the HeroEngine one
  gui.build = true
 
  return gui
.

method HE_getHotSpotGUI() as NodeRef of Class GUIControl
  var gui = FindGUIControlByName($GUI._findLayerByName("hotspot"), "GFG_HotSpotGUI")
   
    if gui == None
      gui = me._buildHotSpotGUI()
    .
   
    gui.visible = true
    SetKeyBoardFocus(gui._getTextInputBoxDelay()._GetTextInputBoxDelayTextBox())
    gui._ValidateSelectableHotSpotItems()
    return gui
  .

Now, make a GUI in the GUI XML.
Make sure it inherits from the type _HotSpotGUI.
Call it whatever you've said your GUI is called in this method above:
"HE_buildHotSpotGUI()"
(for me that is this line:
 
Code: [Select]
gui as NodeRef of Class GUIControl = createNodeFromPrototype("GFG_HotSpotGUI")  )

This is saying use my GUI instead of the current HotSpotGUI.
Now, you need to add the space for your SpecOracle.
It's going to be under this:
GUINAME -> Scrollable -> clientarea ->_tabbedParent -> clientarea -> tools -> clientarea -> SpecOracle -> clientarea->.....
Now you're looking at your listed rows of SpecOracles.
Each one is a _collapsableCategoryItem, so just search for that type of GUI and add it to the List.
NAME IT THE SAME THING AS YOUR SPEC ORACLE THIS IS REALLY IMPORTANT!!!! This name is passed as a parameter to open the specific SpecOracle. Make sure the script for this _collapsableCategoryItem is pointing the the same as the other SpecOracles.

Now Rebuild your _HotSpotGUI and you should be able to open your Spec Oracle.
I had some problems with my _HotSpotGUI crashing on rebuild, and that was about a month ago so I don't quite remember what I did to fix it, but if you run into the same thing I'll look back through my posts to see what I figured out.

Hope that helps and sorry for the length!



Pages: [1] 2 3