func AddUserPositionValidation(validator func(*user.User, int64, int64, int64) bool)
AddUserPositionValidation registers a validation function to be called on Sync
validator func(userData *user.User, x int64, y int64, z int64) bool - Custom function to invoked for position validation.
func AfterDisappearCmd(callback func(*user.User, func(error)))
AfterDisappearCmd registers a command to be executed after field disappear: Must be called before ExposeCommands()
func AfterSyncCmd(callback func(*user.User, func(error)))
AfterSyncCmd registers a command to be executed after field sync: Must be called before ExposeCommands()
func AfterSyncInitCmd(callback func(*user.User, func(error)))
AfterSyncInitCmd registers a command to be executed after field sync: Must be called before ExposeCommands()
func BeforeDisappearCmd(callback func(*user.User, func(error)))
BeforeDisappearCmd registers a command to be executed before field disappear: Must be called before ExposeCommands()
func BeforeSyncCmd(callback func(*user.User, func(error)))
BeforeSyncCmd registers a command to be executed before field sync: Must be called before ExposeCommands()
func BeforeSyncInitCmd(callback func(*user.User, func(error)))
BeforeSyncInitCmd registers a command to be executed before field sync: Must be called before ExposeCommands()
func Broadcast(userData *user.User, uList []*UserEntity, ver uint8, cmd uint16, msg []byte, reliable bool)
Broadcast broadcast a message to the list of users found by Sync or FindUsersByPosition function
userData *user.User - User that sends broadcast. uList []*UserEntity - An array of user entities to send broadcast to. ver uint8 - Command version to be used as braodcast. cmd uint16 - Command ID to be used as broadcast. msg []byte - Message byte array to be sent as broadcast. reliable bool - If true, UDP will become RUDP.
func CalcDistance(myX, myY, yourX, yourY int64) int64
CalcDistance calculates distance using triangle
┬──────────>(Me) │ /| │ / | │ / | distance / | Y │ / | │ / _| └───>/____|_| (You) X myX int64 - X coordinate to calculate the distance against yourX. myY int64 - Y coordinate to calculate the distance against yourY. yourX int64 - X coordinate to calculate the distance against myX. yourY int64 - Y coordinate to calculage the distance against myY.
func Disappear(userData *user.User, syncLimit int)
Disappear removes the user client from field map
userData *user.User - User that will be disappear. syncLimit int - Maximum number of remote users to synchronize the disappearance.
func DiscardNPCByID(id string) bool
DiscardNPCByID deletes an NPC with matching ID
[NOTE] Uses mutex lock internally.
id string - Target NPC ID to delete.
func ExposeCommands()
ExposeCommands exposes commands to the client to work with Field package
func GetGridRangeByGridKey(gridKey string) (int64, int64, int64, int64)
GetGridRangeByGridKey returns grid range of x and y. This function works only with grids of the node.
[NOTE] Uses mutex lock internally.
return x1, x2, y1, y2
Grid key is obtained by GetGrids()
gridKey string - Target grid key to retrive the grid positions.
func GetGridSize() int64
GetGridSize returns the size of the grid
func GetGrids() []string
GetGrids returns a list of grids the node is assigned to
func GetServerSyncLimit() int
GetServerSyncLimit returns serverSyncLimit
func GetUserPosition(userData *user.User) (int64, int64, int64)
GetUserPosition returns the current user position: x, y, z
[NOTE] Uses mutex lock internally.
userData *user.User - Target user to retrieve the positions of.
func IsUserInSight(mySID, otherSID string) bool
IsUserInSight evalutes if the remote user is in sight or not
[NOTE] Uses mutex lock internally.
mySID string - Target SID of the user to check if the other user is in sight or not. otherSID string - Target SID of the other user to check if my user is in sight or not.
func IsWS()
IsWS called internally by commands.go
func PrintGridLayout(gl *GridLayout)
PrintGridLayout prints the grid layout into standard out
func Reconnect(meshEndPoint string, userData *user.User, callback func(error, string))
Reconnect returns the end point of the node for the client to reconnect to
[NOTE] Uses mutex lock internally.
meshEndPoint string - Internal server address to direct the user for reconnection. userData *user.User - Target user to direct the reconnection. callback func(error, publicServerEndpoint string) - Callback to be invoked when server operation of reconnection is completed.
func ServerSync(x, y, z int64, message []byte, syncLimit int, reliable bool)
ServerSync sends messages from the server to the clients within the view
[NOTE] Uses mutex lock internally.
This is meant to be used to synchronize NPC entities from the server to the client.
x int64 - X coordinate to be used to synchronize. y int64 - Y coordinate to be used to synchronize. z int64 - Z space to be used to synchronize. syncLimit int - Maximum number of users to synchronize with. reliable bool - If true, UDP will become RUDP.
func SetCustomFilter(customFilterID uint8, filter func(*user.User, []*UserEntity) []*UserEntity)
SetCustomFilter defines a custom filter that will be invoked when user client indicates while synchronizing. The purpose of the filter is to manipulate the users in sight for synchronizing.
customFilterID uint8 - Unique ID to identify the cuntom filter. filter func(userData *user.User, entities []*Entity) - Custom operation function to perform filterting.
func SetOnGridUpdated(callback func([]string))
SetOnGridUpdated registers a callback function on grid map updated.
[NOTE] Uses mutex lock internally.
The callback receives grid x1, y1 and grid x2, y2.
Each node has two sets of grid x and y
callback func(gridPositions []string) - Callback to be invoked when grids are updated.
func SetOnNPCTransported(callback func(*Npc))
SetOnNPCTransported registers a callback on NPC transport
callback func(*Npc) - Callback to be invoked when the target NPC is transported to another server based on X and Y.
func Setup(confpath string)
Setup setup Field module
confpath string - Absolute path of the configuration file to be loaded.
func Sync(userData *user.User, x, y, z int64, syncLimit int, msg []byte) (string, []*UserEntity, []*UserEntity, [][]byte)
Sync updates its own position and find others within the sight (fieldOfVisionSize) - z is used as a literal value instead of range like x and y. Use z value to create "different" area.
[NOTE] Uses mutex lock internally.
// returned values: meshNodeEndPoint, usersInSight, usersNotInSight, userMessageListInsight := field.Sync(userData, x, y, z, syncLimit, message) userData *user.User - User that will be synchronize the data. x int64 - X position of the user to synchronize. y int64 - Y position of the user to synchronize. z int64 - Z space of the user to synchronize. syncLimit int - Maximum number of users to synchronize with. msg []byte - Synchronize byte array data.
func SyncBroadcast( userData *user.User, x, y, z int64, syncLimit int, ver uint8, cmd uint16, msg []byte, reliable bool, )
SyncBroadcast sends a message to clients that are in sight with ver and cmd given
[NOTE] Uses mutex lock internally.
userData *user.User - User to send synchronize broadcast. x int64 - X coordinate to be used to synchronize. y int64 - Y coordinate to be used to synchronize. z int64 - Z space to be used to synchronize. ver uint8 - Command version to be used to be sent as broadcast. cmd uint16 - Command ID to be used to be sent as broadcast. msg []byte - Synchronize byte array data. reliable bool - If true, UDP will become RUDP.
func SyncNearbyGrids( userData *user.User, x, y, z int64, customFilterID uint8, syncLimit int, msg []byte, reliable bool, callback func(error, [][]byte), )
SyncNearbyGrids synchronize with nearby remote grids including remote grids
[NOTE] Uses mutex lock internally.
userData *user.User - User to synchronize. x int64 - X position of the user to synchronize. y int64 - Y position of the user to synchronize. z int64 - Z space of the user to synchronize. msg []byte - Synchronize byte array data. reliable bool - If true, UDP will become RUDP. callback func(error, messageList [][]byte) - Callback to be invoked when the oeration is completed.
func Update(userData *user.User, x int64, y int64, z int64) string
Update updates the given userData(client)'s position data and returns a mesh address if the client must reconnect to a new mesh node
[NOTE] Uses mutex lock internally.
userData *user.User - Target user to update its X, Y, and Z. x int64 - X coordinate to replace the current value with. y int64 - Y coordinate to replace the current value with. z int64 - Z space to replace the current value with.
GridData grid data with size and coordinate
type GridData struct {
// contains filtered or unexported fields
}
func GetMyGrids() []*GridData
GetMyGrids returns an array of grids of the node
[NOTE] Uses mutex lock internally.
func (gd *GridData) GetKey() string
GetKey returns the unique key of the grid
func (gd *GridData) GetPosition() (int64, int64)
GetPosition returns X and Y coordinate of the grid
x, y := gd.GetPosition()
GridLayout is a representation of the layout of grids
type GridLayout struct { N *GridLayout E *GridLayout S *GridLayout W *GridLayout Parent *GridLayout Root *GridData }
func NewGridLayout(gd *GridData, parent *GridLayout) *GridLayout
NewGridLayout creates a new GridLayout
func (gl *GridLayout) Add(gd *GridData)
Add adds a GridData to GridLayout
Npc is a server-controlled non-playable-character data struct.
Npc should be synchronized with clients via ServerSync and should NEVER be controlled by clients
type Npc struct { sync.RWMutex // contains filtered or unexported fields }
func GetNPCByID(id string) *Npc
GetNPCByID returns an NPC with matching ID
[NOTE] Uses mutex lock internally.
id string - Target NPC ID.
func NewNPC(x int64, y int64, z int64) (*Npc, error)
NewNPC creates a new non-player-character entity to be controlled on the server and synchronized by ServerSync.
[NOTE] Uses mutex lock internally.
x int64 - initial X coordinate of the new NPC to be created. y int64 - initial Y coordinate of the new NPC to be created. z int64 - initial Z space of the new NPC to be created. Z space is not coordinate, but it describes dimension or space.
func (n *Npc) Get(key string) interface{}
Get returns custom property value
[NOTE] Uses mutex lock internally.
func (n *Npc) GetID() string
GetID returns the unique ID of NPC
func (n *Npc) GetPosition() (int64, int64, int64)
GetPosition returns X, Y position and Z space
func (n *Npc) Incr(key string, delta int) (int, error)
Incr increments custom property (it must be an int) by delta
[NOTE] Uses mutex lock internally.
key string - Property name of the NPC to increment. delta int - Property value of the NPC to increment.
func (n *Npc) Set(key string, value interface{})
Set sets custom property
[NOTE] Uses mutex lock internally.
key string - Property name of the NPC to set. value interface{} - Property value of the NPC to set.
func (n *Npc) SetOnDiscard(cb func(*Npc))
SetOnDiscard registers a callback function to be invoked on DiscardNPCByID
[NOTE] Uses mutex lock internally.
cb func(*Npc) - Callback assigned to be invoked when the target NPC is deleted.
func (n *Npc) SetPosition(x int64, y int64, z int64)
SetPosition sets X, Y position and Z space
x int64 - X coordinate to assgin to the target NPC. y int64 - Y coordinate to assgin to the target NPC. z int64 - Z space to assign to the target NPC. Z is not coordinate, but it describes dimension or space.
UserEntity a user data structure
type UserEntity struct {
// contains filtered or unexported fields
}
func ApplyCustomFilter(customFilterID uint8, userData *user.User, uList []*UserEntity) []*UserEntity
ApplyCustomFilter executes pre-defined custom filter on the list of UserEntity to controll who to broadcast to
customFilterID uint8 - Unique ID to identify the cuntom filter. userData *user.User - User to apply the filter. uList []*UserEntity - An array of user entities that are in sight to be manipulated.
func FindUsersByPosition(x, y, z int64, howMany int) ([]*UserEntity, []string)
FindUsersByPosition returns an array of user entities and an array of user IDs within the given area (x, y, z)
[NOTE] Uses mutex lock internally.
x int64 - X coordinate to find the users with. y int64 - Y coordinate to find the users with. z int64 - Z space to find the users with. howmany int - Maximum number of users to find.
func (ue *UserEntity) GetCoordinates() (int64, int64)
GetCoordinates returns the X,Y position of UserEntity
func (ue *UserEntity) GetDistance() int64
GetDistance returns the distance between the user and you
func (ue *UserEntity) GetID() string
GetID returnns the user ID of the user
func (ue *UserEntity) GetSID() string
GetSID returns SID of the user