What is the size of an average area?
An area can be of any physical size. The key metric to consider is how many players will interact in the Area because, on the Area server, a single process will be responsible for managing the message traffic and much of the gameplay (depending on your implementation of course).
Some other considerations:
- Design areas to limit long sight lines to maximize framerate. Use occlusion to its fullest advantage.
- Make sure spots that connect two areas together are spaced apart enough so their proxy space doesn't overlap. This isn't a requirement, but rather more of an optimization.
- Try not to design areas that force/encourage players to congregate in massive numbers in one spot. If you want this, isolate that spot into a separate area but keep in mind that framerate is going to suffer.
How many players can interact in an “average” sized area, assuming most are engaged in strenuous activities such as combat?
This depends on your game design and implementation. One game's "strenuous" activity, like combat, might be entirely different than someone else's. Essentially there is no way to counteract a poorly optimized implementation. As with any game building, you need to balance the aspirations of the game designers with the realities of the platform.
Having several hundreds of players in an area is not unreasonable, given smart implementation. If you want thousands, you will have to experiment to figure out how to match up your implementation with bandwidth and server CPU requirements.
Another factor in all of this is what sort of server hardware you are using.
Assuming the same average-sized zone, how many AI-controlled NPCs would be the norm?
This entirely depends on how complex your game is. With a simple structure, it could be possible to have thousands of NPCs in a single area. With more complex logic, this number could drop to several hundred, and with some effort and extremely inefficient code, it might be possible to have only one. ;)
Area States: What is the purpose and advantage of this system? Why can the state of a Door not simply be persisted the same as, say, the health of a monster?
Consider, what does it mean for a door to be open? What happens when a door transitions from closed to open, or opened to closed? Just a flag that indicates the door is open or not does nothing to make the door actually appear open, make a sound when it opens, affect pathfinding, etc.
The Area State system provides a clean way of expressing all of these things. And more. For example, let's say you have a rock slide that gets triggered when a player casts a particular spell at a certain thing but only when a lever has been thrown somewhere else. This is something you can just hand-script... but the Area State system lets you express this with no scripting at all! Now let's say the players do everything they need to, and that trips the Area State for the rockslide to the new state "SLIDE"... the transition starts an equivalent animation on all of the clients. Now imagine a new player joins the area... how should their client handle this? Clearly you can't have the rockslide in a different state, so the Area State system lets you specify going from a context of NOTSET to SLIDE (in this example) so you can specify what actions need to be taken so that that client can be put in the right visual/physics/collision/etc. state.
Then let's consider if these doors, rock slides, levers, etc. are all part of a mission/quest. And half-way through, the party of players all leave. Let's say your game design is such that in such situations (which is common, because a party might be just two or even one player sometimes) the quest is not forfeit, but will "spin back up" when they return. How do you encapsulate all of the stateful data of the area: what lever is in what position, what door is in what position, which key treasure chests have been looted, what bosses defeated, etc. The Area State system makes it easy to serialize this data and "spin it back up" later for just such situations.
Like most tools included with HeroEngine, these are all optional features that you might or might not use. Maybe you just want to express a door as being open with a boolean and deal with all the other issues in script. In which case, you can do that too! But the Area State system provides you with a ton of capability that maps to the real-world needs of an MMO that no boolean value on Earth ever could.
Areas: What limitations are there for two different objects in different areas interacting? E.g. a player in Area #1 combating a monster in adjacent Area #2? Is this even possible? What about issues with the local coordinate systems?
This is dealt with via a proxy system which was released as a part of the HeroEngine 2009 vol 1 release. Specific things like characters, creatures, objects, etc. that are near area transitions can create proxies on the "other side." This does require a somewhat different HSL programming style, but only for those things that need to deal with proxy mechanics.
- See also: Proxied node
Given an instance on the server, how do I determine the spec FQN from which it was created?
Instances are associated to their AreaAsset Node via an AssetReferenceAss. The diagram of the structure of the area geometry can be seen here: Area Node Structure.
There is also a related method in the InstanceClassMethods script _GetInstanceAreaAsset() and _GetInstanceAreaAssetFQN().
How can you delete an area?
If you want to completely delete the area from the database, this is done via the AREADEL CLI command.
However, you can also change an area's name and remove it from the Organizer panel, which will free up the name so that you can create another one in the same place. For more information, see Organizer Panel#Right-click menu.
How do I control the level of detail of a hightmap?
Heightmap Level Of Detaial (LOD) is handled automatically by the engine and by default is disabled by the "HeightmapLOD" graphics option switch. The default is "disabled" because we found that in almost all situations doing the LOD was less efficient than simply rendering the heightmap without it.
If you choose to enable HeightmapLOD, you can modify the behavior by adjusting a heightmap's LODFactor property to cause the Heightmap to start its LOD faster or slower (the same way you can adjust the LOD Factor for other objects).
LODFactor 0.1 = LOD 10x closer LODFactor 3 = LOD 3x further out
What is the optimal size of a Heightmap in regards to loading times, draw calls, etc...?
There isn't a one size fits all situations answer unfortunately. The proper heightmap size has a lot to do with the area geometry and when that geometry allows the render to cull nodes based on occlusion. An additional consideration is based on the ease of editing, it is faster to make edits and less likely to have collisions when editing in a multiuser environment if the heightmaps are smaller. Consequently, there is a balance point between optimal rendering performance and ease of editing during development.
The good news is that in the Hero Engine 2009 Volume 1 release we have exposed the capability to regrid heightmaps after the fact so you can experiment with your area to find the optimal size based on the unique characteristics of your area.
Why does my map not load all of the way?
The configuration value for your Repository Server's in memory cache may be set to small. This means that any file which exceeded that size could not be loaded into memory to send to the client when it requested the new version.
Try increasing the cache size, however, you will need to bounce your server to have the changes take affect.
In earlier releases we used a dynamic memory caching model that was allowed to exceed the configured cache size at will. The significant refactoring of the Repository Server to significantly improve scalability switched the way memory was allocated from the dynamic model to a static one.
Once your servers have been bounced, this should resolve the issues with logging into areas or HeroBlade being stuck requesting files.
Why does my character get dropped into a gray area of nothingness when I travel to a new room?
So there are several things that could be happening. Explaining the case of arriving in an area and having no room selected is caused by the character being positioned somewhere not in a room, or where HeroBlade was unable to determine a room. Positioning a character during arrival into an area is under script control and by default (assuming you have not overridden the behavior) the character is placed at a point randomly selected from a Path named "Arrival" or if no such path exists at the origin (0,0,0). If you are reconnecting to the same area instance you left, you are (I believe) placed in the position in which you left.
This problem can occur if you are attempting to use seamlessness to edit between two areas, I.E. Edit area A, then run through link and Edit area B. Seamless World does not currently support editing in this fashion and it will cause all sort of oddities to occur.
Why does my character get dropped into a gray area and my room data disappears when I travel to a new room?
There are two potential explanations:
- If you have not completed preloading for the destination, you will see a flash of grey if a loading screen is not put up. By default $BASECLIENT's implementation of _Area_Load_Delayed() is to display a splash screen by calling _AddSplashScreen().
- You may have your transition triggers overlapping, so that it is possible to enter the trigger to go into the next room and still be in the previous rooms trigger to exit. This causes the client to seamlessly move from RoomA->RoomB->RoomA->RoomB continuously until you exit one or the other trigger's volume. Whether you will end up in the RoomA or RoomB is plus or minus luck at that point depending on a variety of potential race conditions. Transition triggers should NEVER overlap in space.
How do I access the world server?
The world Server is area 0 instance 0 and communicating with it is the same as making a remote procedure call to any other area server. However, it is strongly recommended you not use the World Server for anything but the most critical operations as the world process is in change of some very important functionality (it knows what areas are up, where the area in which all players are currently located) and will scale best if you are not overloading it with game logic.
Consequently, there exists a $WORLD system node and mechanics to register areas to receive notification of updates about areas/players from the world server so that you can offload processing that would normally require information available only to the world server.
How do I implement a chat system?
During training, we talk about the concept of "system areas" which handle processing (you can think of them as "services") you do not need or want to perform elsewhere. We have implemented a Chat_System that uses system areas to handle communication. The Chat_System can be extended to solve most if not all chat requirements for a game.
How do I set the time of day for dynamic sky so all users experience the same time?
The time of day behavior is by design. The slider is there as a visualization aid for the design of an environment scheme and its changes to "time" are not persisted to the server. Rather you are free to implement whatever kind of day/night cycle makes sense for your game and communicate the "time of day" to the clients. During the loading of the area, then use external functions to set the client's environmental time of day to whatever is appropriate.
Is there a way to limit the messages in chat panel?
By design, the chat panel just displays all incoming input. If your need is for debugging messaging, have you checked out the debug system Debugging HSL which allows you to send messages for a particular system to a system area and then subscribe/unsubscribe and view a history of the last 500 messages...
How do I create a territory?
- Create 1-n Region nodes to define a volume of the game level
- Use the territory management panel to add a new territory (if you have region nodes selected they will automatically be added to the new territory's list of nodes)
- Add additional region nodes to a territory by selecting them and hitting the "Add Nodes To Territory" button
Can I change the sun and stars views?
The time of day is controlled via HeroScript, so you can establish whatever day/night cycle makes sense for your game. Currently, you can not replace the sun or easily change the starfield used for the night sky.
However, we plan in a future expansion of the dynamic sky system to add heavenly bodies and the ability to easily change the starfield.
Does HeroEngine support chat panel logging?
Yes, you can find them located under the "Documents and Settings/<UserName>/My Documents/HeroBlade Logs", older versions of HeroEngine placed those logs under in the run directory of the client/heroblade. Under v1.21.1, you will also find replication trace logs(when enabled) and memory reports generated by the statistics panel located in the "HeroBlade Logs" folder.
When rendering an area, why do I get the /failed to create index buffer in HeightMapNode::BuildMeshes() / error?
The problem is one of D3D being unable to allocate any more video memory due to the size of that specific area all of which was being rendered.
How does HeroEngine determine which room the camera is in?
The active room is determined by an equation under the hood based on a calculation using the camera position, bounding volumes that contain all of the assets in a room and some additional processing that deals with cases that can't be handled by simple volumetric checks. There is no way for you to explicitly set the active room via script (anything beyond the most simple use case would be a nightmare to try and handle in script anyway).
I am trying to use rooms to restrict the visibility of light sources, how much control over the light source can I gain from this?
Rooming is meant for use in controlling visibility at a gross level. Fine grained visibility control is generally achieved through the automatic occlusion culling of dPVS. You can minimize the hit lights cause by restricting them to affect only the things you really need them to affect.
Additionally, you may wish to consider if you actually need lights to achieve the affect as often particle effects are just as effective at achieving the atmosphere your designers envision. Of course you have to take care to create a particle effect that is optimized as you can just as easily create particle effects that are abusive of system resources. :) With the upcoming v1.21 release, you could potentially have the area set up so the lights do not even exist until you enter some particular awareness range causing them to be instantiated from a prop bucket (and removed when you leave awareness range).
Why does my territory disappear when the instance shuts down?
If you create a territory in a "PLAY" instance it will disappear when the instance shuts down. Play instances do not persist changes, only "EDIT" instances.
Why can't I delete an area and create a new one with the same name?
Removing an area from the area organizer does not actually "delete" the area. It merely removes the area organizer's reference to it in a particular folder. Areas can not be deleted in this fashion.
In order to add a reference to an area back into the organizer rightclick on one of the folders and select "Add existing Area...".
Select your area from the list of areas...
Once you have readded your area to the organizer you can right click on the area to pull up the area's info...
Allowing you to rename your area freeing up the old name.
You can then remove the old area from the organizer again.
You can also completely delete the existing area. This is done directly in the database, via the AREADEL CLI command.
How do I restrict Heightmap editing to a specific Heightmap(s)?
If you do not want the painting to go through when you have overlapped, or if you want to ensure that an action is restricted to the current heightmap and does not bleed over the edge when you paint adjacent heightmaps you can use the limiters section to restrict the brush to only the selected heightmap(s).
How is a spec represented on the server as opposed to the client?
The representation of a spec on the server versus that of the client differs in a couple subtle ways. A spec's data on the server is stored in a prototype, prototypes are loaded (synchronously) on demand allowing for you to use the oracle.getSpecByKey() method to retrieve specs synchronously. A spec's data on the client starts off as a file in the repository, the file is loaded asynchronously to avoid a blocking operation, once a file is loaded the data is deserialized into a node which then acts as a cache for the information allowing synchronous access thereafter.
What needs to be done to deny entry permission for an account/character into an area?
The $TRAVEL system node supports the default "travel" mechanics for moving a character from one area to another, and is used by both the organizer and the /HEGO command. As with all of the system nodes, you can extend it to add arbitrary behavior in HSL such as adding additional asynchronous steps to determine if a player is permitted to go to the area.
Is there a standard way to clone an instance area to a new edit area?
Using the Organizer, go to the edit instance of the area into which you wish to import. Once you are loaded into the area, locate the area you wish to copy in the organizer panel. Select the source area, and click the Import link located at the bottom of the organizer panel.
Once initiated the import can take an extended period of time and your character may be disconnected. Following the completion of the import, shut down the edit instance to finalize the process.
Why can I see the NPC's names but not their bodies?
Positioning of the Character is under script control and it is possible that script positioned your character outside the bounds of all rooms.
Check room visibility in the area panel to ensure that your character is inside a currently visible room.
When traveling between areas with different environments is there a way to cause the environments to blend?
Yes there is a capability in script to "blend" in other Environmental Schemes dynamically. For example, if you were have two rooms (room1 and room2) where room1 has a sunny environment and room2 has a cloudy environment, you would probably have both room1 and room2 use the "sunny" environment and then you would blend in the cloudy environment via HSL based on entering a trigger, region or whatever else you wanted to do.
The HSL API to the environment is described at Environment_panel.
Is there a way to change the skymap?
In the next major release, you will be able to select any texture you choose for the skymap as a part of the Environmental Schemes. In the meantime, you can simply overwrite sky_starry.dds in its existing directory with your own (using the same name).
Is there a way to change the tint of the rain?
There is not currently a convenient way to tint the rain, though I believe you could overwrite the existing texture with your own and that might work.