492 lines
13 KiB
Go
492 lines
13 KiB
Go
package functions
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"eq2emu/internal/events"
|
|
)
|
|
|
|
// Miscellaneous Utility Functions
|
|
|
|
// SendMessage sends a message (placeholder implementation)
|
|
func SendMessage(ctx *events.EventContext) error {
|
|
message := ctx.GetParameterString("message", "")
|
|
if message == "" {
|
|
return fmt.Errorf("message parameter required")
|
|
}
|
|
|
|
// TODO: Implement message sending
|
|
ctx.Info("Message: %s", message)
|
|
return nil
|
|
}
|
|
|
|
// LogMessage logs a message at specified level
|
|
func LogMessage(ctx *events.EventContext) error {
|
|
level := ctx.GetParameterString("level", "info")
|
|
message := ctx.GetParameterString("message", "")
|
|
|
|
if message == "" {
|
|
return fmt.Errorf("message parameter required")
|
|
}
|
|
|
|
switch strings.ToLower(level) {
|
|
case "debug":
|
|
ctx.Debug("%s", message)
|
|
case "info":
|
|
ctx.Info("%s", message)
|
|
case "warn", "warning":
|
|
ctx.Warn("%s", message)
|
|
case "error":
|
|
ctx.Error("%s", message)
|
|
default:
|
|
ctx.Info("%s", message)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// MakeRandomInt generates a random integer
|
|
func MakeRandomInt(ctx *events.EventContext) error {
|
|
min := ctx.GetParameterInt("min", 0)
|
|
max := ctx.GetParameterInt("max", 100)
|
|
|
|
if min > max {
|
|
min, max = max, min
|
|
}
|
|
|
|
// Simple random - in practice you'd use a proper random generator
|
|
result := min + (int(math.Abs(float64(ctx.EventName[0]))) % (max - min + 1))
|
|
ctx.SetResult("random_int", result)
|
|
return nil
|
|
}
|
|
|
|
// MakeRandomFloat generates a random float
|
|
func MakeRandomFloat(ctx *events.EventContext) error {
|
|
min := ctx.GetParameterFloat("min", 0.0)
|
|
max := ctx.GetParameterFloat("max", 1.0)
|
|
|
|
if min > max {
|
|
min, max = max, min
|
|
}
|
|
|
|
// Simple random float - in practice you'd use a proper random generator
|
|
ratio := float64(int(math.Abs(float64(ctx.EventName[0]))) % 100) / 100.0
|
|
result := min + (max-min)*ratio
|
|
ctx.SetResult("random_float", result)
|
|
return nil
|
|
}
|
|
|
|
// ParseInt parses a string to integer
|
|
func ParseInt(ctx *events.EventContext) error {
|
|
str := ctx.GetParameterString("string", "")
|
|
if str == "" {
|
|
return fmt.Errorf("string parameter required")
|
|
}
|
|
|
|
value, err := strconv.Atoi(str)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to parse integer: %w", err)
|
|
}
|
|
|
|
ctx.SetResult("int_value", value)
|
|
return nil
|
|
}
|
|
|
|
// GetName gets the spawn's name
|
|
func GetName(ctx *events.EventContext) error {
|
|
spawn := ctx.GetSpawn()
|
|
if spawn == nil {
|
|
return fmt.Errorf("no spawn in context")
|
|
}
|
|
|
|
ctx.SetResult("name", spawn.GetName())
|
|
return nil
|
|
}
|
|
|
|
// GetID gets the spawn's ID
|
|
func GetID(ctx *events.EventContext) error {
|
|
spawn := ctx.GetSpawn()
|
|
if spawn == nil {
|
|
return fmt.Errorf("no spawn in context")
|
|
}
|
|
|
|
ctx.SetResult("id", spawn.GetID())
|
|
return nil
|
|
}
|
|
|
|
// GetSpawnID gets the spawn's ID (alias for GetID)
|
|
func GetSpawnID(ctx *events.EventContext) error {
|
|
return GetID(ctx)
|
|
}
|
|
|
|
// IsPlayer checks if spawn is a player
|
|
func IsPlayer(ctx *events.EventContext) error {
|
|
spawn := ctx.GetSpawn()
|
|
if spawn == nil {
|
|
return fmt.Errorf("no spawn in context")
|
|
}
|
|
|
|
ctx.SetResult("is_player", spawn.IsPlayer())
|
|
return nil
|
|
}
|
|
|
|
// IsNPC checks if spawn is an NPC
|
|
func IsNPC(ctx *events.EventContext) error {
|
|
spawn := ctx.GetSpawn()
|
|
if spawn == nil {
|
|
return fmt.Errorf("no spawn in context")
|
|
}
|
|
|
|
ctx.SetResult("is_npc", spawn.IsNPC())
|
|
return nil
|
|
}
|
|
|
|
// IsEntity checks if spawn is an entity
|
|
func IsEntity(ctx *events.EventContext) error {
|
|
spawn := ctx.GetSpawn()
|
|
if spawn == nil {
|
|
return fmt.Errorf("no spawn in context")
|
|
}
|
|
|
|
// TODO: Implement entity checking when Entity interface is available
|
|
ctx.SetResult("is_entity", false) // Default for now
|
|
return nil
|
|
}
|
|
|
|
// IsDead checks if spawn is dead
|
|
func IsDead(ctx *events.EventContext) error {
|
|
spawn := ctx.GetSpawn()
|
|
if spawn == nil {
|
|
return fmt.Errorf("no spawn in context")
|
|
}
|
|
|
|
ctx.SetResult("is_dead", !spawn.IsAlive())
|
|
return nil
|
|
}
|
|
|
|
// GetCharacterID gets the character ID for players
|
|
func GetCharacterID(ctx *events.EventContext) error {
|
|
spawn := ctx.GetSpawn()
|
|
if spawn == nil {
|
|
return fmt.Errorf("no spawn in context")
|
|
}
|
|
|
|
if !spawn.IsPlayer() {
|
|
return fmt.Errorf("spawn is not a player")
|
|
}
|
|
|
|
// TODO: Implement character ID retrieval
|
|
ctx.SetResult("character_id", 0) // Default value
|
|
return nil
|
|
}
|
|
|
|
// Despawn removes the spawn from the world
|
|
func Despawn(ctx *events.EventContext) error {
|
|
spawn := ctx.GetSpawn()
|
|
if spawn == nil {
|
|
return fmt.Errorf("no spawn in context")
|
|
}
|
|
|
|
// TODO: Implement despawn logic
|
|
ctx.Debug("Despawned spawn %s (not yet implemented)", spawn.GetName())
|
|
return nil
|
|
}
|
|
|
|
// Spawn creates a new spawn
|
|
func Spawn(ctx *events.EventContext) error {
|
|
locationID := ctx.GetParameterInt("location_id", 0)
|
|
spawnGroupID := ctx.GetParameterInt("spawn_group_id", 0)
|
|
|
|
// TODO: Implement spawn creation
|
|
ctx.Debug("Created spawn at location %d, group %d (not yet implemented)", locationID, spawnGroupID)
|
|
ctx.SetResult("spawned", true)
|
|
return nil
|
|
}
|
|
|
|
// SpawnByLocationID spawns by location ID
|
|
func SpawnByLocationID(ctx *events.EventContext) error {
|
|
locationID := ctx.GetParameterInt("location_id", 0)
|
|
if locationID <= 0 {
|
|
return fmt.Errorf("invalid location ID")
|
|
}
|
|
|
|
// TODO: Implement location-based spawning
|
|
ctx.Debug("Spawned by location ID %d (not yet implemented)", locationID)
|
|
ctx.SetResult("spawned", true)
|
|
return nil
|
|
}
|
|
|
|
// SpawnGroupByID spawns a group by ID
|
|
func SpawnGroupByID(ctx *events.EventContext) error {
|
|
groupID := ctx.GetParameterInt("group_id", 0)
|
|
if groupID <= 0 {
|
|
return fmt.Errorf("invalid group ID")
|
|
}
|
|
|
|
// TODO: Implement group spawning
|
|
ctx.Debug("Spawned group ID %d (not yet implemented)", groupID)
|
|
ctx.SetResult("spawned", true)
|
|
return nil
|
|
}
|
|
|
|
// DespawnByLocationID despawns spawns at a location
|
|
func DespawnByLocationID(ctx *events.EventContext) error {
|
|
locationID := ctx.GetParameterInt("location_id", 0)
|
|
if locationID <= 0 {
|
|
return fmt.Errorf("invalid location ID")
|
|
}
|
|
|
|
// TODO: Implement location-based despawning
|
|
ctx.Debug("Despawned location ID %d (not yet implemented)", locationID)
|
|
return nil
|
|
}
|
|
|
|
// GetSpawnByLocationID gets spawn by location ID
|
|
func GetSpawnByLocationID(ctx *events.EventContext) error {
|
|
locationID := ctx.GetParameterInt("location_id", 0)
|
|
if locationID <= 0 {
|
|
return fmt.Errorf("invalid location ID")
|
|
}
|
|
|
|
// TODO: Implement spawn retrieval by location
|
|
ctx.SetResult("spawn", nil) // No spawn found
|
|
return nil
|
|
}
|
|
|
|
// GetSpawnByGroupID gets spawn by group ID
|
|
func GetSpawnByGroupID(ctx *events.EventContext) error {
|
|
groupID := ctx.GetParameterInt("group_id", 0)
|
|
if groupID <= 0 {
|
|
return fmt.Errorf("invalid group ID")
|
|
}
|
|
|
|
// TODO: Implement spawn retrieval by group
|
|
ctx.SetResult("spawn", nil) // No spawn found
|
|
return nil
|
|
}
|
|
|
|
// GetSpawnGroupID gets the spawn's group ID
|
|
func GetSpawnGroupID(ctx *events.EventContext) error {
|
|
spawn := ctx.GetSpawn()
|
|
if spawn == nil {
|
|
return fmt.Errorf("no spawn in context")
|
|
}
|
|
|
|
// TODO: Implement group ID retrieval
|
|
ctx.SetResult("group_id", 0) // Default value
|
|
return nil
|
|
}
|
|
|
|
// SetSpawnGroupID sets the spawn's group ID
|
|
func SetSpawnGroupID(ctx *events.EventContext) error {
|
|
spawn := ctx.GetSpawn()
|
|
if spawn == nil {
|
|
return fmt.Errorf("no spawn in context")
|
|
}
|
|
|
|
groupID := ctx.GetParameterInt("group_id", 0)
|
|
|
|
// TODO: Implement group ID setting
|
|
ctx.Debug("Set group ID to %d for spawn %s (not yet implemented)", groupID, spawn.GetName())
|
|
return nil
|
|
}
|
|
|
|
// GetSpawnLocationID gets the spawn's location ID
|
|
func GetSpawnLocationID(ctx *events.EventContext) error {
|
|
spawn := ctx.GetSpawn()
|
|
if spawn == nil {
|
|
return fmt.Errorf("no spawn in context")
|
|
}
|
|
|
|
// TODO: Implement location ID retrieval
|
|
ctx.SetResult("location_id", 0) // Default value
|
|
return nil
|
|
}
|
|
|
|
// GetSpawnLocationPlacementID gets the spawn's location placement ID
|
|
func GetSpawnLocationPlacementID(ctx *events.EventContext) error {
|
|
spawn := ctx.GetSpawn()
|
|
if spawn == nil {
|
|
return fmt.Errorf("no spawn in context")
|
|
}
|
|
|
|
// TODO: Implement location placement ID retrieval
|
|
ctx.SetResult("placement_id", 0) // Default value
|
|
return nil
|
|
}
|
|
|
|
// SetGridID sets the spawn's grid ID
|
|
func SetGridID(ctx *events.EventContext) error {
|
|
spawn := ctx.GetSpawn()
|
|
if spawn == nil {
|
|
return fmt.Errorf("no spawn in context")
|
|
}
|
|
|
|
gridID := ctx.GetParameterInt("grid_id", 0)
|
|
|
|
// TODO: Implement grid ID setting
|
|
ctx.Debug("Set grid ID to %d for spawn %s (not yet implemented)", gridID, spawn.GetName())
|
|
return nil
|
|
}
|
|
|
|
// SpawnSet sets spawn properties by distance/criteria
|
|
func SpawnSet(ctx *events.EventContext) error {
|
|
spawn := ctx.GetSpawn()
|
|
if spawn == nil {
|
|
return fmt.Errorf("no spawn in context")
|
|
}
|
|
|
|
property := ctx.GetParameterString("property", "")
|
|
value := ctx.GetParameterString("value", "")
|
|
|
|
// TODO: Implement spawn property setting
|
|
ctx.Debug("Set property %s to %s for spawn %s (not yet implemented)", property, value, spawn.GetName())
|
|
return nil
|
|
}
|
|
|
|
// SpawnSetByDistance sets spawn properties within distance
|
|
func SpawnSetByDistance(ctx *events.EventContext) error {
|
|
spawn := ctx.GetSpawn()
|
|
if spawn == nil {
|
|
return fmt.Errorf("no spawn in context")
|
|
}
|
|
|
|
distance := ctx.GetParameterFloat("distance", 10.0)
|
|
property := ctx.GetParameterString("property", "")
|
|
value := ctx.GetParameterString("value", "")
|
|
|
|
// TODO: Implement distance-based spawn property setting
|
|
ctx.Debug("Set property %s to %s within distance %f of spawn %s (not yet implemented)",
|
|
property, value, distance, spawn.GetName())
|
|
return nil
|
|
}
|
|
|
|
// IsSpawnGroupAlive checks if spawn group is alive
|
|
func IsSpawnGroupAlive(ctx *events.EventContext) error {
|
|
groupID := ctx.GetParameterInt("group_id", 0)
|
|
if groupID <= 0 {
|
|
return fmt.Errorf("invalid group ID")
|
|
}
|
|
|
|
// TODO: Implement group alive checking
|
|
ctx.SetResult("group_alive", false) // Default value
|
|
return nil
|
|
}
|
|
|
|
// AddSpawnToGroup adds spawn to a group
|
|
func AddSpawnToGroup(ctx *events.EventContext) error {
|
|
spawn := ctx.GetSpawn()
|
|
if spawn == nil {
|
|
return fmt.Errorf("no spawn in context")
|
|
}
|
|
|
|
groupID := ctx.GetParameterInt("group_id", 0)
|
|
if groupID <= 0 {
|
|
return fmt.Errorf("invalid group ID")
|
|
}
|
|
|
|
// TODO: Implement group addition
|
|
ctx.Debug("Added spawn %s to group %d (not yet implemented)", spawn.GetName(), groupID)
|
|
return nil
|
|
}
|
|
|
|
// GetVariableValue gets a variable value
|
|
func GetVariableValue(ctx *events.EventContext) error {
|
|
variableName := ctx.GetParameterString("variable", "")
|
|
if variableName == "" {
|
|
return fmt.Errorf("variable name required")
|
|
}
|
|
|
|
// TODO: Implement variable system
|
|
ctx.SetResult("value", "") // Default empty value
|
|
return nil
|
|
}
|
|
|
|
// SetServerVariable sets a server variable
|
|
func SetServerVariable(ctx *events.EventContext) error {
|
|
variableName := ctx.GetParameterString("variable", "")
|
|
value := ctx.GetParameterString("value", "")
|
|
|
|
if variableName == "" {
|
|
return fmt.Errorf("variable name required")
|
|
}
|
|
|
|
// TODO: Implement server variable system
|
|
ctx.Debug("Set server variable %s to %s (not yet implemented)", variableName, value)
|
|
return nil
|
|
}
|
|
|
|
// GetServerVariable gets a server variable
|
|
func GetServerVariable(ctx *events.EventContext) error {
|
|
variableName := ctx.GetParameterString("variable", "")
|
|
if variableName == "" {
|
|
return fmt.Errorf("variable name required")
|
|
}
|
|
|
|
// TODO: Implement server variable system
|
|
ctx.SetResult("value", "") // Default empty value
|
|
return nil
|
|
}
|
|
|
|
// SetTempVariable sets a temporary variable
|
|
func SetTempVariable(ctx *events.EventContext) error {
|
|
variableName := ctx.GetParameterString("variable", "")
|
|
value := ctx.GetParameterString("value", "")
|
|
|
|
if variableName == "" {
|
|
return fmt.Errorf("variable name required")
|
|
}
|
|
|
|
// TODO: Implement temporary variable system
|
|
ctx.Debug("Set temp variable %s to %s (not yet implemented)", variableName, value)
|
|
return nil
|
|
}
|
|
|
|
// GetTempVariable gets a temporary variable
|
|
func GetTempVariable(ctx *events.EventContext) error {
|
|
variableName := ctx.GetParameterString("variable", "")
|
|
if variableName == "" {
|
|
return fmt.Errorf("variable name required")
|
|
}
|
|
|
|
// TODO: Implement temporary variable system
|
|
ctx.SetResult("value", "") // Default empty value
|
|
return nil
|
|
}
|
|
|
|
// CheckLOS checks line of sight between two positions
|
|
func CheckLOS(ctx *events.EventContext) error {
|
|
spawn := ctx.GetSpawn()
|
|
target := ctx.GetTarget()
|
|
|
|
if spawn == nil {
|
|
return fmt.Errorf("no spawn in context")
|
|
}
|
|
|
|
if target == nil {
|
|
return fmt.Errorf("no target in context")
|
|
}
|
|
|
|
// TODO: Implement line of sight checking
|
|
ctx.SetResult("has_los", true) // Default to true
|
|
return nil
|
|
}
|
|
|
|
// CheckLOSByCoordinates checks line of sight between coordinates
|
|
func CheckLOSByCoordinates(ctx *events.EventContext) error {
|
|
x1 := ctx.GetParameterFloat("x1", 0)
|
|
y1 := ctx.GetParameterFloat("y1", 0)
|
|
z1 := ctx.GetParameterFloat("z1", 0)
|
|
x2 := ctx.GetParameterFloat("x2", 0)
|
|
y2 := ctx.GetParameterFloat("y2", 0)
|
|
z2 := ctx.GetParameterFloat("z2", 0)
|
|
|
|
// TODO: Implement coordinate-based line of sight checking
|
|
ctx.Debug("Checking LOS from (%.2f,%.2f,%.2f) to (%.2f,%.2f,%.2f) (not yet implemented)",
|
|
x1, y1, z1, x2, y2, z2)
|
|
ctx.SetResult("has_los", true) // Default to true
|
|
return nil
|
|
} |