126 lines
3.4 KiB
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)
|
|
}
|