game_sync/robot/base/function.go

126 lines
3.4 KiB
Go

package base
import (
"math/rand"
"time"
"mongo.games.com/goserver/core/netlib"
"mongo.games.com/goserver/core/timer"
"mongo.games.com/game/proto"
player_proto "mongo.games.com/game/protocol/player"
)
func GetUser(s *netlib.Session) *player_proto.SCPlayerData {
if user, ok := s.GetAttribute(SessionAttributeUser).(*player_proto.SCPlayerData); ok {
return user
}
return nil
}
func GetScene(s *netlib.Session) IScene {
if sceneId, ok := s.GetAttribute(SessionAttributeSceneId).(int32); ok {
return SceneMgrSingleton.GetScene(sceneId)
}
ss := s.GetAttribute(SessionAttributeScene)
if ss != nil {
if scene, ok := ss.(IScene); ok {
return scene
}
}
return nil
}
func HadScene(s *netlib.Session) bool {
if sceneId, ok := s.GetAttribute(SessionAttributeSceneId).(int32); ok {
return sceneId > 0
}
if scene := s.GetAttribute(SessionAttributeScene); scene != nil {
return true
}
return false
}
func StartSessionPingTimer(s *netlib.Session, act timer.TimerAction, ud interface{}, interval time.Duration, times int) bool {
StopSessionPingTimer(s)
if hTimer, ok := timer.StartTimer(act, ud, interval, times); ok {
s.SetAttribute(SessionAttributePingTimer, hTimer)
return true
}
return false
}
func StopSessionPingTimer(s *netlib.Session) {
if h, ok := s.GetAttribute(SessionAttributePingTimer).(timer.TimerHandle); ok {
if h != timer.TimerHandle(0) {
timer.StopTimer(h)
s.RemoveAttribute(SessionAttributePingTimer)
}
}
}
// StartSessionLoginTimer 登录定时器
func StartSessionLoginTimer(s *netlib.Session, act timer.TimerAction, ud interface{}, interval time.Duration, times int) bool {
StopSessionLoginTimer(s)
if hTimer, ok := timer.StartTimer(act, ud, interval, times); ok {
s.SetAttribute(SessionAttributeLoginTimer, hTimer)
return true
}
return false
}
func StopSessionLoginTimer(s *netlib.Session) {
if h, ok := s.GetAttribute(SessionAttributeLoginTimer).(timer.TimerHandle); ok {
if h != timer.TimerHandle(0) {
timer.StopTimer(h)
s.RemoveAttribute(SessionAttributeLoginTimer)
}
}
}
// ExePMCmd 机器人特殊指令
func ExePMCmd(s *netlib.Session, cmd string) {
CSPMCmd := &player_proto.CSPMCmd{
Cmd: proto.String(cmd),
}
proto.SetDefaults(CSPMCmd)
s.Send(int(player_proto.PlayerPacketID_PACKET_CS_PMCMD), CSPMCmd)
}
// DelaySendSecond 延迟消息发送
// DelaySendSecond(s, packetid, pack, []int{1, 2}...) 1到2秒随机延迟发送消息
func DelaySendSecond(s *netlib.Session, packetid int, pack interface{}, params ...int) {
DelaySendDuration(s, packetid, pack, time.Second, params...)
}
// DelaySendMillisecond 延迟消息发送
// DelaySendMillisecond(s, packetid, pack, []int{1, 2}...) 1到2毫秒随机延迟发送消息
func DelaySendMillisecond(s *netlib.Session, packetid int, pack interface{}, params ...int) {
DelaySendDuration(s, packetid, pack, time.Millisecond, params...)
}
// DelaySendDuration 在某个时间区间随机延迟发送一次消息
// unit 时间单位
// params 延时区间
func DelaySendDuration(s *netlib.Session, packetid int, pack interface{}, unit time.Duration, params ...int) {
min := 1
if len(params) > 0 {
min = params[0]
}
max := min + 3
if len(params) > 1 {
max = params[1]
}
if max < min {
min, max = max, min
} else if max == min {
max = min + 1
}
thinkSec := time.Duration(min + rand.Intn(max-min))
timer.StartTimer(timer.TimerActionWrapper(func(h timer.TimerHandle, ud interface{}) bool {
s.Send(packetid, pack)
return true
}), nil, unit*thinkSec, 1)
}