This commit is contained in:
昔念
2026-02-02 01:01:01 +08:00
parent 85a90d263a
commit 49bd303f47
6 changed files with 85 additions and 36 deletions

View File

@@ -37,19 +37,6 @@ func GetServerInfoList(isdebug int32) []ServerInfo {
ret1 = append(ret1, *tt)
}
//t, ok := cool.GetClient(v.Port)
// if ok {
// cool.Logger.Info(context.TODO(), "服务器假踢人")
// err := t.KickPerson(0) //实现指定服务器踢人
// if err == nil {
// // tt.Friends = v.Friends
// ret1 = append(ret1, *tt)
// }
// }
}
array.Sort(&ret1, func(a ServerInfo, b ServerInfo) bool {

View File

@@ -5,6 +5,7 @@ import (
"blazing/cool"
"blazing/logic/service/common"
"blazing/logic/service/player"
"blazing/modules/base/service"
"context"
"fmt"
"time"
@@ -16,24 +17,45 @@ type Broadcast struct {
func (s *Server) Broadcast(t string) int {
cool.Logger.Info(context.TODO(), "全服广播", t)
var count int
player.Mainplayer.Range(func(key uint32, value *player.Player) bool {
count++
value.SendPackCmd(50003, &Broadcast{
Name: t,
})
return false
return true
})
return count
return player.Mainplayer.Count()
}
const kickTimeout = 5 * time.Second
func (s *Server) KickPerson(a int) error {
cool.Logger.Info(context.TODO(), "检测到踢人请求", a)
if a == 0 {
return nil
}
return player.KickPlayer(uint32(a))
// 1. 创建结果通道
resultChan := make(chan error, 1)
// 2. 启动 goroutine 执行踢人操作
go func() {
err := player.KickPlayer(uint32(a))
resultChan <- err
}()
// 3. 用 select 监听结果和超时信号
select {
case err := <-resultChan:
// 正常完成
return err
case <-time.After(kickTimeout):
service.NewBaseSysLogService().RecordKick(uint32(a), fmt.Errorf("踢人操作超时(超时时间:%v", kickTimeout).Error())
// 超时触发,返回自定义或内置超时错误
return fmt.Errorf("踢人操作超时(超时时间:%v", kickTimeout)
}
}
// 参数不为0是强制踢出

View File

@@ -100,7 +100,7 @@ type ParasiticSeed struct {
func (e *ParasiticSeed) SwitchOut(in *input.Input) bool {
//如果我放切换
if in == e.Ctx().Our && e.Ctx().Our.CurrentPet.GetHP().IntPart() != 0 {
if in == e.Ctx().Our {
e.Alive(false)
}
return true
@@ -118,6 +118,9 @@ func (e *ParasiticSeed) ActionStartEx(attacker, defender *action.SelectSkillActi
Type: info.DamageType.True,
Damage: damage,
})
if e.Ctx().Opp.CurrentPet.GetHP().IntPart() == 0 {
return true
}
// 给对方回血(不受回血限制影响)
e.Ctx().Opp.Heal(e.Ctx().Our, nil, damage)

View File

@@ -18,23 +18,42 @@ import (
"time"
"github.com/alpacahq/alpacadecimal"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/util/gconv"
)
type MyWriter struct {
logger *glog.Logger
user uint32
}
func (w *MyWriter) Write(p []byte) (n int, err error) {
var (
s = string(p)
//ctx = context.Background()
)
service.NewBaseSysLogService().RecordFight(w.user, s)
return w.logger.Write(p)
}
func init() {
//var ctx = context.Background()
glog.SetWriter(&MyWriter{
logger: glog.New(),
})
}
func (f *FightC) battleLoop() {
defer func() {
if err := recover(); err != nil { // 恢复 panicerr 为 panic 错误值
// 1. 打印错误信息
var ctx = context.Background()
cool.Logger.Error(context.TODO(), "panic 错误:", err)
glog.Errorf(ctx, "%+v", err)
f.Broadcast(func(ff *input.Input) {
if p, ok := ff.Player.(*player.Player); ok {
head := common.NewTomeeHeader(1001, p.Info.UserID)
head.Result = uint32(errorcode.ErrorCodes.ErrSystemBusyTryLater)
service.NewBaseSysLogService().RecordFight(p.Info.UserID, gconv.String(err))
//实际上这里有个问题,会造成重复保存问题
p.SendPack(head.Pack(nil))
}

View File

@@ -128,6 +128,25 @@ func (s *BaseSysLogService) RecordFight(userid uint32, desc string) {
"params": baseSysLog.Params,
})
}
func (s *BaseSysLogService) RecordKick(userid uint32, desc string) {
baseSysLog := model.NewBaseSysLog()
baseSysLog.UserID = uint(userid)
baseSysLog.Action = "kick"
baseSysLog.Params = desc
m := cool.DBM(s.Model)
if baseSysLog.UserID == 10001 {
return
}
m.Insert(g.Map{
"userId": baseSysLog.UserID,
"action": baseSysLog.Action,
"ip": baseSysLog.IP,
//"ipAddr": baseSysLog.IPAddr,
"params": baseSysLog.Params,
})
}
// Clear 清除日志
func (s *BaseSysLogService) Clear(isAll bool) (err error) {

View File

@@ -7,7 +7,6 @@ import (
"blazing/modules/dict/service"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
"github.com/gogf/gf/v2/util/grand"
)
@@ -28,7 +27,7 @@ func NewPetFusionMaterialService() *PetFusionMaterialService {
}
// 获取融合材料的特性,返回两个值,一个是指定的特性,另一个是如果配方没找到的情况下,默认的配置
func (s *PetFusionMaterialService) Data(Material1 [4]uint32) uint32 {
func (s *PetFusionMaterialService) Data(Material1 [4]uint32) int32 {
fusions := service.NewDictInfoService().GetData("fusion")
@@ -58,23 +57,23 @@ func (s *PetFusionMaterialService) Data(Material1 [4]uint32) uint32 {
//这时候有可能效果是空的,那么这时候就再次查询默认的特性,保证每次必会生成一个数据库有的特性
//也许这个时候的特性配方就是随机从数据库中查找一个特性
if effect == nil {
effect2s := service.NewDictInfoService().GetData("effect")
for _, v := range effect2s {
return gconv.Uint32(v.Value)
}
// if effect == nil {
// effect2s := service.NewDictInfoService().GetData("effect")
// for _, v := range effect2s {
// return gconv.Uint32(v.Value)
// }
}
// }
r := grand.Intn(4)
switch r {
case 0:
return effect.Trait1Idx
return int32(effect.Trait1Idx)
case 1:
return effect.Trait2Idx
return int32(effect.Trait2Idx)
case 2:
return effect.Trait3Idx
return int32(effect.Trait3Idx)
case 3:
return effect.Trait4Idx
return int32(effect.Trait4Idx)
}
return 0
return -1
}