mirror of
https://github.com/FlourishingWorld/hk4e.git
synced 2026-02-04 14:22:26 +08:00
198 lines
6.3 KiB
Go
198 lines
6.3 KiB
Go
package game
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"hk4e/common/constant"
|
|
"hk4e/gdconf"
|
|
"hk4e/gs/model"
|
|
"hk4e/pkg/logger"
|
|
"hk4e/protocol/cmd"
|
|
"hk4e/protocol/proto"
|
|
|
|
pb "google.golang.org/protobuf/proto"
|
|
)
|
|
|
|
func (g *GameManager) SceneTransToPointReq(player *model.Player, payloadMsg pb.Message) {
|
|
logger.Debug("user get scene trans to point, uid: %v", player.PlayerID)
|
|
req := payloadMsg.(*proto.SceneTransToPointReq)
|
|
|
|
pointDataConfig := gdconf.GetScenePointBySceneIdAndPointId(int32(req.SceneId), int32(req.PointId))
|
|
if pointDataConfig == nil {
|
|
g.SendError(cmd.SceneTransToPointRsp, player, &proto.SceneTransToPointRsp{})
|
|
return
|
|
}
|
|
|
|
// 传送玩家
|
|
sceneId := req.SceneId
|
|
g.TeleportPlayer(player, constant.EnterReasonTransPoint, sceneId, &model.Vector{
|
|
X: pointDataConfig.TranPos.X,
|
|
Y: pointDataConfig.TranPos.Y,
|
|
Z: pointDataConfig.TranPos.Z,
|
|
}, &model.Vector{
|
|
X: pointDataConfig.TranRot.X,
|
|
Y: pointDataConfig.TranRot.Y,
|
|
Z: pointDataConfig.TranRot.Z,
|
|
}, 0)
|
|
|
|
sceneTransToPointRsp := &proto.SceneTransToPointRsp{
|
|
PointId: req.PointId,
|
|
SceneId: req.SceneId,
|
|
}
|
|
g.SendMsg(cmd.SceneTransToPointRsp, player.PlayerID, player.ClientSeq, sceneTransToPointRsp)
|
|
}
|
|
|
|
func (g *GameManager) MarkMapReq(player *model.Player, payloadMsg pb.Message) {
|
|
logger.Debug("user mark map, uid: %v", player.PlayerID)
|
|
req := payloadMsg.(*proto.MarkMapReq)
|
|
operation := req.Op
|
|
if operation == proto.MarkMapReq_ADD {
|
|
logger.Debug("user mark type: %v", req.Mark.PointType)
|
|
if req.Mark.PointType == proto.MapMarkPointType_MONSTER {
|
|
posYInt, err := strconv.ParseInt(req.Mark.Name, 10, 64)
|
|
if err != nil {
|
|
logger.Error("parse pos y error: %v", err)
|
|
posYInt = 300
|
|
}
|
|
// 传送玩家
|
|
g.TeleportPlayer(player, constant.EnterReasonGm, req.Mark.SceneId, &model.Vector{
|
|
X: float64(req.Mark.Pos.X),
|
|
Y: float64(posYInt),
|
|
Z: float64(req.Mark.Pos.Z),
|
|
}, new(model.Vector), 0)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TeleportPlayer 传送玩家至地图上的某个位置
|
|
func (g *GameManager) TeleportPlayer(player *model.Player, enterReason uint16, sceneId uint32, pos, rot *model.Vector, dungeonId uint32) {
|
|
// 传送玩家
|
|
newSceneId := sceneId
|
|
oldSceneId := player.SceneId
|
|
oldPos := &model.Vector{
|
|
X: player.Pos.X,
|
|
Y: player.Pos.Y,
|
|
Z: player.Pos.Z,
|
|
}
|
|
jumpScene := false
|
|
if newSceneId != oldSceneId {
|
|
jumpScene = true
|
|
}
|
|
player.SceneJump = jumpScene
|
|
world := WORLD_MANAGER.GetWorldByID(player.WorldId)
|
|
oldScene := world.GetSceneById(oldSceneId)
|
|
activeAvatarId := world.GetPlayerActiveAvatarId(player)
|
|
g.RemoveSceneEntityNotifyBroadcast(oldScene, proto.VisionType_VISION_REMOVE, []uint32{world.GetPlayerWorldAvatarEntityId(player, activeAvatarId)})
|
|
if jumpScene {
|
|
delTeamEntityNotify := g.PacketDelTeamEntityNotify(oldScene, player)
|
|
g.SendMsg(cmd.DelTeamEntityNotify, player.PlayerID, player.ClientSeq, delTeamEntityNotify)
|
|
|
|
oldScene.RemovePlayer(player)
|
|
player.SceneId = newSceneId
|
|
newScene := world.GetSceneById(newSceneId)
|
|
newScene.AddPlayer(player)
|
|
}
|
|
player.SceneLoadState = model.SceneNone
|
|
player.Pos.X = pos.X
|
|
player.Pos.Y = pos.Y
|
|
player.Pos.Z = pos.Z
|
|
player.Rot.X = rot.X
|
|
player.Rot.Y = rot.Y
|
|
player.Rot.Z = rot.Z
|
|
|
|
var enterType proto.EnterType
|
|
switch enterReason {
|
|
case constant.EnterReasonDungeonEnter:
|
|
logger.Debug("player dungeon scene, scene: %v, pos: %v", player.SceneId, player.Pos)
|
|
enterType = proto.EnterType_ENTER_DUNGEON
|
|
default:
|
|
if jumpScene {
|
|
logger.Debug("player jump scene, scene: %v, pos: %v", player.SceneId, player.Pos)
|
|
enterType = proto.EnterType_ENTER_JUMP
|
|
} else {
|
|
logger.Debug("player goto scene, scene: %v, pos: %v", player.SceneId, player.Pos)
|
|
enterType = proto.EnterType_ENTER_GOTO
|
|
}
|
|
}
|
|
playerEnterSceneNotify := g.PacketPlayerEnterSceneNotifyTp(player, enterType, uint32(enterReason), oldSceneId, oldPos, dungeonId)
|
|
g.SendMsg(cmd.PlayerEnterSceneNotify, player.PlayerID, player.ClientSeq, playerEnterSceneNotify)
|
|
}
|
|
|
|
func (g *GameManager) GetScenePointReq(player *model.Player, payloadMsg pb.Message) {
|
|
logger.Debug("user get scene point, uid: %v", player.PlayerID)
|
|
req := payloadMsg.(*proto.GetScenePointReq)
|
|
|
|
scenePointMapConfig := gdconf.GetScenePointMapBySceneId(int32(req.SceneId))
|
|
if scenePointMapConfig == nil {
|
|
return
|
|
}
|
|
|
|
getScenePointRsp := &proto.GetScenePointRsp{
|
|
SceneId: req.SceneId,
|
|
}
|
|
areaIdMap := make(map[uint32]bool)
|
|
for _, worldAreaData := range gdconf.GetWorldAreaDataMap() {
|
|
if uint32(worldAreaData.SceneId) == req.SceneId {
|
|
areaIdMap[uint32(worldAreaData.AreaId1)] = true
|
|
}
|
|
}
|
|
areaList := make([]uint32, 0)
|
|
for areaId := range areaIdMap {
|
|
areaList = append(areaList, areaId)
|
|
}
|
|
getScenePointRsp.UnlockAreaList = areaList
|
|
for _, pointData := range scenePointMapConfig {
|
|
if pointData.PointType == gdconf.PointTypeOther {
|
|
continue
|
|
}
|
|
getScenePointRsp.UnlockedPointList = append(getScenePointRsp.UnlockedPointList, uint32(pointData.Id))
|
|
}
|
|
g.SendMsg(cmd.GetScenePointRsp, player.PlayerID, player.ClientSeq, getScenePointRsp)
|
|
}
|
|
|
|
func (g *GameManager) GetSceneAreaReq(player *model.Player, payloadMsg pb.Message) {
|
|
logger.Debug("user get scene area, uid: %v", player.PlayerID)
|
|
req := payloadMsg.(*proto.GetSceneAreaReq)
|
|
|
|
getSceneAreaRsp := &proto.GetSceneAreaRsp{
|
|
SceneId: req.SceneId,
|
|
}
|
|
areaIdMap := make(map[uint32]bool)
|
|
for _, worldAreaData := range gdconf.GetWorldAreaDataMap() {
|
|
if uint32(worldAreaData.SceneId) == req.SceneId {
|
|
areaIdMap[uint32(worldAreaData.AreaId1)] = true
|
|
}
|
|
}
|
|
areaList := make([]uint32, 0)
|
|
for areaId := range areaIdMap {
|
|
areaList = append(areaList, areaId)
|
|
}
|
|
getSceneAreaRsp.AreaIdList = areaList
|
|
if req.SceneId == 3 {
|
|
getSceneAreaRsp.CityInfoList = []*proto.CityInfo{
|
|
{CityId: 1, Level: 10},
|
|
{CityId: 2, Level: 10},
|
|
{CityId: 3, Level: 10},
|
|
{CityId: 4, Level: 10},
|
|
{CityId: 99, Level: 1},
|
|
{CityId: 100, Level: 1},
|
|
{CityId: 101, Level: 1},
|
|
{CityId: 102, Level: 1},
|
|
}
|
|
}
|
|
g.SendMsg(cmd.GetSceneAreaRsp, player.PlayerID, player.ClientSeq, getSceneAreaRsp)
|
|
}
|
|
|
|
func (g *GameManager) EnterWorldAreaReq(player *model.Player, payloadMsg pb.Message) {
|
|
logger.Debug("user enter world area, uid: %v", player.PlayerID)
|
|
req := payloadMsg.(*proto.EnterWorldAreaReq)
|
|
|
|
logger.Debug("EnterWorldAreaReq: %v", req)
|
|
|
|
enterWorldAreaRsp := &proto.EnterWorldAreaRsp{
|
|
AreaType: req.AreaType,
|
|
AreaId: req.AreaId,
|
|
}
|
|
g.SendMsg(cmd.EnterWorldAreaRsp, player.PlayerID, player.ClientSeq, enterWorldAreaRsp)
|
|
}
|