From b5faba41511e6fd9329f56bd1ea2130b9eb71ab1 Mon Sep 17 00:00:00 2001 From: flswld Date: Mon, 10 Apr 2023 19:32:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E4=B8=96=E7=95=8CAOI=E5=B9=BF?= =?UTF-8?q?=E6=92=AD=E5=9F=9F=E9=9A=94=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/constant/default_ability.go | 16 +- common/constant/element_type.go | 153 +++---------- common/constant/item_constant.go | 20 +- common/constant/open_state.go | 332 ++++++++++++++--------------- common/constant/player_prop.go | 84 ++++---- common/constant/stamina_cost.go | 36 ++-- gate/net/proto_endecode.go | 12 ++ gs/game/audio_video.go | 2 +- gs/game/game.go | 42 +++- gs/game/game_world_manager.go | 7 + gs/game/player_avatar.go | 8 +- gs/game/player_chat.go | 4 +- gs/game/player_common.go | 2 +- gs/game/player_fight_sync.go | 268 ++++++++++++++++------- gs/game/player_multiplayer.go | 10 +- gs/game/player_scene.go | 86 ++++---- gs/game/player_team.go | 92 +++----- gs/game/player_vehicle.go | 2 +- gs/game/player_world.go | 16 +- gs/model/db_avatar.go | 106 +++++---- gs/model/db_team.go | 40 ---- pkg/alg/aoi.go | 5 + 22 files changed, 677 insertions(+), 666 deletions(-) diff --git a/common/constant/default_ability.go b/common/constant/default_ability.go index 27c36666..ca73ef56 100644 --- a/common/constant/default_ability.go +++ b/common/constant/default_ability.go @@ -3,24 +3,22 @@ package constant import "hk4e/pkg/endec" var ( - DEFAULT_ABILITY_STRINGS []string - DEFAULT_ABILITY_HASHES []int32 - DEFAULT_ABILITY_NAME int32 + DEFAULT_ABILITY_HASH_CODE []int32 ) func init() { - DEFAULT_ABILITY_STRINGS = []string{ + defaultAbilityStringList := []string{ "Avatar_DefaultAbility_VisionReplaceDieInvincible", "Avatar_DefaultAbility_AvartarInShaderChange", "Avatar_SprintBS_Invincible", "Avatar_Freeze_Duration_Reducer", "Avatar_Attack_ReviveEnergy", "Avatar_Component_Initializer", - "Avatar_FallAnthem_Achievement_Listener", + "Avatar_HDMesh_Controller", + "Avatar_Trampoline_Jump_Controller", } - DEFAULT_ABILITY_HASHES = make([]int32, 0) - for _, v := range DEFAULT_ABILITY_STRINGS { - DEFAULT_ABILITY_HASHES = append(DEFAULT_ABILITY_HASHES, endec.Hk4eAbilityHashCode(v)) + DEFAULT_ABILITY_HASH_CODE = make([]int32, 0) + for _, defaultAbilityString := range defaultAbilityStringList { + DEFAULT_ABILITY_HASH_CODE = append(DEFAULT_ABILITY_HASH_CODE, endec.Hk4eAbilityHashCode(defaultAbilityString)) } - DEFAULT_ABILITY_NAME = endec.Hk4eAbilityHashCode("Default") } diff --git a/common/constant/element_type.go b/common/constant/element_type.go index 3f116de4..0ed011f2 100644 --- a/common/constant/element_type.go +++ b/common/constant/element_type.go @@ -1,134 +1,49 @@ package constant -import "hk4e/pkg/endec" +const ( + ELEMENT_TYPE_FIRE = 1 + ELEMENT_TYPE_WATER = 2 + ELEMENT_TYPE_GRASS = 3 + ELEMENT_TYPE_ELEC = 4 + ELEMENT_TYPE_ICE = 5 + ELEMENT_TYPE_WIND = 7 + ELEMENT_TYPE_ROCK = 8 +) -var ElementTypeConst *ElementType - -type ElementTypeValue struct { - Value uint16 - CurrEnergyProp uint16 - MaxEnergyProp uint16 - TeamResonanceId uint16 - ConfigName string - ConfigHash int32 +type FightPropEnergy struct { + CurEnergy int + MaxEnergy int } -type ElementType struct { - None *ElementTypeValue - Fire *ElementTypeValue - Water *ElementTypeValue - Grass *ElementTypeValue - Electric *ElementTypeValue - Ice *ElementTypeValue - Frozen *ElementTypeValue - Wind *ElementTypeValue - Rock *ElementTypeValue - AntiFire *ElementTypeValue - Default *ElementTypeValue - VALUE_MAP map[uint16]*ElementTypeValue -} +var ELEMENT_TYPE_FIGHT_PROP_ENERGY_MAP map[int]*FightPropEnergy func init() { - ElementTypeConst = new(ElementType) - ElementTypeConst.None = &ElementTypeValue{ - 0, - FIGHT_PROP_CUR_FIRE_ENERGY, - FIGHT_PROP_MAX_FIRE_ENERGY, - 0, - "", - endec.Hk4eAbilityHashCode(""), + ELEMENT_TYPE_FIGHT_PROP_ENERGY_MAP[ELEMENT_TYPE_FIRE] = &FightPropEnergy{ + CurEnergy: FIGHT_PROP_CUR_FIRE_ENERGY, + MaxEnergy: FIGHT_PROP_MAX_FIRE_ENERGY, } - ElementTypeConst.Fire = &ElementTypeValue{ - 1, - FIGHT_PROP_CUR_FIRE_ENERGY, - FIGHT_PROP_MAX_FIRE_ENERGY, - 10101, - "TeamResonance_Fire_Lv2", - endec.Hk4eAbilityHashCode("TeamResonance_Fire_Lv2"), + ELEMENT_TYPE_FIGHT_PROP_ENERGY_MAP[ELEMENT_TYPE_WATER] = &FightPropEnergy{ + CurEnergy: FIGHT_PROP_CUR_WATER_ENERGY, + MaxEnergy: FIGHT_PROP_MAX_WATER_ENERGY, } - ElementTypeConst.Water = &ElementTypeValue{ - 2, - FIGHT_PROP_CUR_WATER_ENERGY, - FIGHT_PROP_MAX_WATER_ENERGY, - 10201, - "TeamResonance_Water_Lv2", - endec.Hk4eAbilityHashCode("TeamResonance_Water_Lv2"), + ELEMENT_TYPE_FIGHT_PROP_ENERGY_MAP[ELEMENT_TYPE_GRASS] = &FightPropEnergy{ + CurEnergy: FIGHT_PROP_CUR_GRASS_ENERGY, + MaxEnergy: FIGHT_PROP_MAX_GRASS_ENERGY, } - ElementTypeConst.Grass = &ElementTypeValue{ - 3, - FIGHT_PROP_CUR_GRASS_ENERGY, - FIGHT_PROP_MAX_GRASS_ENERGY, - 0, - "", - endec.Hk4eAbilityHashCode(""), + ELEMENT_TYPE_FIGHT_PROP_ENERGY_MAP[ELEMENT_TYPE_ELEC] = &FightPropEnergy{ + CurEnergy: FIGHT_PROP_CUR_ELEC_ENERGY, + MaxEnergy: FIGHT_PROP_MAX_ELEC_ENERGY, } - ElementTypeConst.Electric = &ElementTypeValue{ - 4, - FIGHT_PROP_CUR_ELEC_ENERGY, - FIGHT_PROP_MAX_ELEC_ENERGY, - 10401, - "TeamResonance_Electric_Lv2", - endec.Hk4eAbilityHashCode("TeamResonance_Electric_Lv2"), + ELEMENT_TYPE_FIGHT_PROP_ENERGY_MAP[ELEMENT_TYPE_ICE] = &FightPropEnergy{ + CurEnergy: FIGHT_PROP_CUR_ICE_ENERGY, + MaxEnergy: FIGHT_PROP_MAX_ICE_ENERGY, } - ElementTypeConst.Ice = &ElementTypeValue{ - 5, - FIGHT_PROP_CUR_ICE_ENERGY, - FIGHT_PROP_MAX_ICE_ENERGY, - 10601, - "TeamResonance_Ice_Lv2", - endec.Hk4eAbilityHashCode("TeamResonance_Ice_Lv2"), + ELEMENT_TYPE_FIGHT_PROP_ENERGY_MAP[ELEMENT_TYPE_WIND] = &FightPropEnergy{ + CurEnergy: FIGHT_PROP_CUR_WIND_ENERGY, + MaxEnergy: FIGHT_PROP_MAX_WIND_ENERGY, } - ElementTypeConst.Frozen = &ElementTypeValue{ - 6, - FIGHT_PROP_CUR_ICE_ENERGY, - FIGHT_PROP_MAX_ICE_ENERGY, - 0, - "", - endec.Hk4eAbilityHashCode(""), + ELEMENT_TYPE_FIGHT_PROP_ENERGY_MAP[ELEMENT_TYPE_ROCK] = &FightPropEnergy{ + CurEnergy: FIGHT_PROP_CUR_ROCK_ENERGY, + MaxEnergy: FIGHT_PROP_MAX_ROCK_ENERGY, } - ElementTypeConst.Wind = &ElementTypeValue{ - 7, - FIGHT_PROP_CUR_WIND_ENERGY, - FIGHT_PROP_MAX_WIND_ENERGY, - 10301, - "TeamResonance_Wind_Lv2", - endec.Hk4eAbilityHashCode("TeamResonance_Wind_Lv2"), - } - ElementTypeConst.Rock = &ElementTypeValue{ - 8, - FIGHT_PROP_CUR_ROCK_ENERGY, - FIGHT_PROP_MAX_ROCK_ENERGY, - 10701, - "TeamResonance_Rock_Lv2", - endec.Hk4eAbilityHashCode("TeamResonance_Rock_Lv2"), - } - ElementTypeConst.AntiFire = &ElementTypeValue{ - 9, - FIGHT_PROP_CUR_FIRE_ENERGY, - FIGHT_PROP_MAX_FIRE_ENERGY, - 0, - "", - endec.Hk4eAbilityHashCode(""), - } - ElementTypeConst.Default = &ElementTypeValue{ - 255, - FIGHT_PROP_CUR_FIRE_ENERGY, - FIGHT_PROP_MAX_FIRE_ENERGY, - 10801, - "TeamResonance_AllDifferent", - endec.Hk4eAbilityHashCode("TeamResonance_AllDifferent"), - } - - ElementTypeConst.VALUE_MAP = make(map[uint16]*ElementTypeValue) - ElementTypeConst.VALUE_MAP[0] = ElementTypeConst.None - ElementTypeConst.VALUE_MAP[1] = ElementTypeConst.Fire - ElementTypeConst.VALUE_MAP[2] = ElementTypeConst.Water - ElementTypeConst.VALUE_MAP[3] = ElementTypeConst.Grass - ElementTypeConst.VALUE_MAP[4] = ElementTypeConst.Electric - ElementTypeConst.VALUE_MAP[5] = ElementTypeConst.Ice - ElementTypeConst.VALUE_MAP[6] = ElementTypeConst.Frozen - ElementTypeConst.VALUE_MAP[7] = ElementTypeConst.Wind - ElementTypeConst.VALUE_MAP[8] = ElementTypeConst.Rock - ElementTypeConst.VALUE_MAP[9] = ElementTypeConst.AntiFire - ElementTypeConst.VALUE_MAP[255] = ElementTypeConst.Default } diff --git a/common/constant/item_constant.go b/common/constant/item_constant.go index fa864bad..6609c5d4 100644 --- a/common/constant/item_constant.go +++ b/common/constant/item_constant.go @@ -2,17 +2,17 @@ package constant const ( // 虚拟物品 - ITEM_ID_HCOIN uint32 = 201 // 原石 - ITEM_ID_SCOIN uint32 = 202 // 摩拉 - ITEM_ID_MCOIN uint32 = 203 // 创世结晶 - ITEM_ID_RESIN uint32 = 106 // 树脂 - ITEM_ID_LEGENDARY_KEY uint32 = 207 // 传说任务钥匙 - ITEM_ID_HOME_COIN uint32 = 204 // 洞天宝钱 - ITEM_ID_PLAYER_EXP uint32 = 102 // 冒险阅历 + ITEM_ID_HCOIN = 201 // 原石 + ITEM_ID_SCOIN = 202 // 摩拉 + ITEM_ID_MCOIN = 203 // 创世结晶 + ITEM_ID_RESIN = 106 // 树脂 + ITEM_ID_LEGENDARY_KEY = 207 // 传说任务钥匙 + ITEM_ID_HOME_COIN = 204 // 洞天宝钱 + ITEM_ID_PLAYER_EXP = 102 // 冒险阅历 // 武器强化物品 - ITEM_ID_WEAPON_UPGRADE_MAGIC uint32 = 104013 // 精锻用魔矿 - ITEM_ID_WEAPON_UPGRADE_GOOD uint32 = 104012 // 精锻用良矿 - ITEM_ID_WEAPON_UPGRADE_MOTLEY uint32 = 104011 // 精锻用杂矿 + ITEM_ID_WEAPON_UPGRADE_MAGIC = 104013 // 精锻用魔矿 + ITEM_ID_WEAPON_UPGRADE_GOOD = 104012 // 精锻用良矿 + ITEM_ID_WEAPON_UPGRADE_MOTLEY = 104011 // 精锻用杂矿 ) // 虚拟物品对应玩家的属性 diff --git a/common/constant/open_state.go b/common/constant/open_state.go index c80a6c6d..dbc151d0 100644 --- a/common/constant/open_state.go +++ b/common/constant/open_state.go @@ -1,172 +1,172 @@ package constant const ( - OPEN_STATE_NONE uint16 = 0 - OPEN_STATE_PAIMON uint16 = 1 - OPEN_STATE_PAIMON_NAVIGATION uint16 = 2 - OPEN_STATE_AVATAR_PROMOTE uint16 = 3 - OPEN_STATE_AVATAR_TALENT uint16 = 4 - OPEN_STATE_WEAPON_PROMOTE uint16 = 5 - OPEN_STATE_WEAPON_AWAKEN uint16 = 6 - OPEN_STATE_QUEST_REMIND uint16 = 7 - OPEN_STATE_GAME_GUIDE uint16 = 8 - OPEN_STATE_COOK uint16 = 9 - OPEN_STATE_WEAPON_UPGRADE uint16 = 10 - OPEN_STATE_RELIQUARY_UPGRADE uint16 = 11 - OPEN_STATE_RELIQUARY_PROMOTE uint16 = 12 - OPEN_STATE_WEAPON_PROMOTE_GUIDE uint16 = 13 - OPEN_STATE_WEAPON_CHANGE_GUIDE uint16 = 14 - OPEN_STATE_PLAYER_LVUP_GUIDE uint16 = 15 - OPEN_STATE_FRESHMAN_GUIDE uint16 = 16 - OPEN_STATE_SKIP_FRESHMAN_GUIDE uint16 = 17 - OPEN_STATE_GUIDE_MOVE_CAMERA uint16 = 18 - OPEN_STATE_GUIDE_SCALE_CAMERA uint16 = 19 - OPEN_STATE_GUIDE_KEYBOARD uint16 = 20 - OPEN_STATE_GUIDE_MOVE uint16 = 21 - OPEN_STATE_GUIDE_JUMP uint16 = 22 - OPEN_STATE_GUIDE_SPRINT uint16 = 23 - OPEN_STATE_GUIDE_MAP uint16 = 24 - OPEN_STATE_GUIDE_ATTACK uint16 = 25 - OPEN_STATE_GUIDE_FLY uint16 = 26 - OPEN_STATE_GUIDE_TALENT uint16 = 27 - OPEN_STATE_GUIDE_RELIC uint16 = 28 - OPEN_STATE_GUIDE_RELIC_PROM uint16 = 29 - OPEN_STATE_COMBINE uint16 = 30 - OPEN_STATE_GACHA uint16 = 31 - OPEN_STATE_GUIDE_GACHA uint16 = 32 - OPEN_STATE_GUIDE_TEAM uint16 = 33 - OPEN_STATE_GUIDE_PROUD uint16 = 34 - OPEN_STATE_GUIDE_AVATAR_PROMOTE uint16 = 35 - OPEN_STATE_GUIDE_ADVENTURE_CARD uint16 = 36 - OPEN_STATE_FORGE uint16 = 37 - OPEN_STATE_GUIDE_BAG uint16 = 38 - OPEN_STATE_EXPEDITION uint16 = 39 - OPEN_STATE_GUIDE_ADVENTURE_DAILYTASK uint16 = 40 - OPEN_STATE_GUIDE_ADVENTURE_DUNGEON uint16 = 41 - OPEN_STATE_TOWER uint16 = 42 - OPEN_STATE_WORLD_STAMINA uint16 = 43 - OPEN_STATE_TOWER_FIRST_ENTER uint16 = 44 - OPEN_STATE_RESIN uint16 = 45 - OPEN_STATE_LIMIT_REGION_FRESHMEAT uint16 = 47 - OPEN_STATE_LIMIT_REGION_GLOBAL uint16 = 48 - OPEN_STATE_MULTIPLAYER uint16 = 49 - OPEN_STATE_GUIDE_MOUSEPC uint16 = 50 - OPEN_STATE_GUIDE_MULTIPLAYER uint16 = 51 - OPEN_STATE_GUIDE_DUNGEONREWARD uint16 = 52 - OPEN_STATE_GUIDE_BLOSSOM uint16 = 53 - OPEN_STATE_AVATAR_FASHION uint16 = 54 - OPEN_STATE_PHOTOGRAPH uint16 = 55 - OPEN_STATE_GUIDE_KSLQUEST uint16 = 56 - OPEN_STATE_PERSONAL_LINE uint16 = 57 - OPEN_STATE_GUIDE_PERSONAL_LINE uint16 = 58 - OPEN_STATE_GUIDE_APPEARANCE uint16 = 59 - OPEN_STATE_GUIDE_PROCESS uint16 = 60 - OPEN_STATE_GUIDE_PERSONAL_LINE_KEY uint16 = 61 - OPEN_STATE_GUIDE_WIDGET uint16 = 62 - OPEN_STATE_GUIDE_ACTIVITY_SKILL_ASTER uint16 = 63 - OPEN_STATE_GUIDE_COLDCLIMATE uint16 = 64 - OPEN_STATE_DERIVATIVE_MALL uint16 = 65 - OPEN_STATE_GUIDE_EXITMULTIPLAYER uint16 = 66 - OPEN_STATE_GUIDE_THEATREMACHANICUS_BUILD uint16 = 67 - OPEN_STATE_GUIDE_THEATREMACHANICUS_REBUILD uint16 = 68 - OPEN_STATE_GUIDE_THEATREMACHANICUS_CARD uint16 = 69 - OPEN_STATE_GUIDE_THEATREMACHANICUS_MONSTER uint16 = 70 - OPEN_STATE_GUIDE_THEATREMACHANICUS_MISSION_CHECK uint16 = 71 - OPEN_STATE_GUIDE_THEATREMACHANICUS_BUILD_SELECT uint16 = 72 - OPEN_STATE_GUIDE_THEATREMACHANICUS_CHALLENGE_START uint16 = 73 - OPEN_STATE_GUIDE_CONVERT uint16 = 74 - OPEN_STATE_GUIDE_THEATREMACHANICUS_MULTIPLAYER uint16 = 75 - OPEN_STATE_GUIDE_COOP_TASK uint16 = 76 - OPEN_STATE_GUIDE_HOMEWORLD_ADEPTIABODE uint16 = 77 - OPEN_STATE_GUIDE_HOMEWORLD_DEPLOY uint16 = 78 - OPEN_STATE_GUIDE_CHANNELLERSLAB_EQUIP uint16 = 79 - OPEN_STATE_GUIDE_CHANNELLERSLAB_MP_SOLUTION uint16 = 80 - OPEN_STATE_GUIDE_CHANNELLERSLAB_POWER uint16 = 81 - OPEN_STATE_GUIDE_HIDEANDSEEK_SKILL uint16 = 82 - OPEN_STATE_GUIDE_HOMEWORLD_MAPLIST uint16 = 83 - OPEN_STATE_GUIDE_RELICRESOLVE uint16 = 84 - OPEN_STATE_GUIDE_GGUIDE uint16 = 85 - OPEN_STATE_GUIDE_GGUIDE_HINT uint16 = 86 - OPEN_STATE_CITY_REPUATION_MENGDE uint16 = 800 - OPEN_STATE_CITY_REPUATION_LIYUE uint16 = 801 - OPEN_STATE_CITY_REPUATION_UI_HINT uint16 = 802 - OPEN_STATE_CITY_REPUATION_INAZUMA uint16 = 803 - OPEN_STATE_SHOP_TYPE_MALL uint16 = 900 - OPEN_STATE_SHOP_TYPE_RECOMMANDED uint16 = 901 - OPEN_STATE_SHOP_TYPE_GENESISCRYSTAL uint16 = 902 - OPEN_STATE_SHOP_TYPE_GIFTPACKAGE uint16 = 903 - OPEN_STATE_SHOP_TYPE_PAIMON uint16 = 1001 - OPEN_STATE_SHOP_TYPE_CITY uint16 = 1002 - OPEN_STATE_SHOP_TYPE_BLACKSMITH uint16 = 1003 - OPEN_STATE_SHOP_TYPE_GROCERY uint16 = 1004 - OPEN_STATE_SHOP_TYPE_FOOD uint16 = 1005 - OPEN_STATE_SHOP_TYPE_SEA_LAMP uint16 = 1006 - OPEN_STATE_SHOP_TYPE_VIRTUAL_SHOP uint16 = 1007 - OPEN_STATE_SHOP_TYPE_LIYUE_GROCERY uint16 = 1008 - OPEN_STATE_SHOP_TYPE_LIYUE_SOUVENIR uint16 = 1009 - OPEN_STATE_SHOP_TYPE_LIYUE_RESTAURANT uint16 = 1010 - OPEN_STATE_SHOP_TYPE_INAZUMA_SOUVENIR uint16 = 1011 - OPEN_STATE_SHOP_TYPE_NPC_TOMOKI uint16 = 1012 - OPEN_ADVENTURE_MANUAL uint16 = 1100 - OPEN_ADVENTURE_MANUAL_CITY_MENGDE uint16 = 1101 - OPEN_ADVENTURE_MANUAL_CITY_LIYUE uint16 = 1102 - OPEN_ADVENTURE_MANUAL_MONSTER uint16 = 1103 - OPEN_ADVENTURE_MANUAL_BOSS_DUNGEON uint16 = 1104 - OPEN_STATE_ACTIVITY_SEALAMP uint16 = 1200 - OPEN_STATE_ACTIVITY_SEALAMP_TAB2 uint16 = 1201 - OPEN_STATE_ACTIVITY_SEALAMP_TAB3 uint16 = 1202 - OPEN_STATE_BATTLE_PASS uint16 = 1300 - OPEN_STATE_BATTLE_PASS_ENTRY uint16 = 1301 - OPEN_STATE_ACTIVITY_CRUCIBLE uint16 = 1400 - OPEN_STATE_ACTIVITY_NEWBEEBOUNS_OPEN uint16 = 1401 - OPEN_STATE_ACTIVITY_NEWBEEBOUNS_CLOSE uint16 = 1402 - OPEN_STATE_ACTIVITY_ENTRY_OPEN uint16 = 1403 - OPEN_STATE_MENGDE_INFUSEDCRYSTAL uint16 = 1404 - OPEN_STATE_LIYUE_INFUSEDCRYSTAL uint16 = 1405 - OPEN_STATE_SNOW_MOUNTAIN_ELDER_TREE uint16 = 1406 - OPEN_STATE_MIRACLE_RING uint16 = 1407 - OPEN_STATE_COOP_LINE uint16 = 1408 - OPEN_STATE_INAZUMA_INFUSEDCRYSTAL uint16 = 1409 - OPEN_STATE_FISH uint16 = 1410 - OPEN_STATE_GUIDE_SUMO_TEAM_SKILL uint16 = 1411 - OPEN_STATE_GUIDE_FISH_RECIPE uint16 = 1412 - OPEN_STATE_HOME uint16 = 1500 - OPEN_STATE_ACTIVITY_HOMEWORLD uint16 = 1501 - OPEN_STATE_ADEPTIABODE uint16 = 1502 - OPEN_STATE_HOME_AVATAR uint16 = 1503 - OPEN_STATE_HOME_EDIT uint16 = 1504 - OPEN_STATE_HOME_EDIT_TIPS uint16 = 1505 - OPEN_STATE_RELIQUARY_DECOMPOSE uint16 = 1600 - OPEN_STATE_ACTIVITY_H5 uint16 = 1700 - OPEN_STATE_ORAIONOKAMI uint16 = 2000 - OPEN_STATE_GUIDE_CHESS_MISSION_CHECK uint16 = 2001 - OPEN_STATE_GUIDE_CHESS_BUILD uint16 = 2002 - OPEN_STATE_GUIDE_CHESS_WIND_TOWER_CIRCLE uint16 = 2003 - OPEN_STATE_GUIDE_CHESS_CARD_SELECT uint16 = 2004 - OPEN_STATE_INAZUMA_MAINQUEST_FINISHED uint16 = 2005 - OPEN_STATE_PAIMON_LVINFO uint16 = 2100 - OPEN_STATE_TELEPORT_HUD uint16 = 2101 - OPEN_STATE_GUIDE_MAP_UNLOCK uint16 = 2102 - OPEN_STATE_GUIDE_PAIMON_LVINFO uint16 = 2103 - OPEN_STATE_GUIDE_AMBORTRANSPORT uint16 = 2104 - OPEN_STATE_GUIDE_FLY_SECOND uint16 = 2105 - OPEN_STATE_GUIDE_KAEYA_CLUE uint16 = 2106 - OPEN_STATE_CAPTURE_CODEX uint16 = 2107 - OPEN_STATE_ACTIVITY_FISH_OPEN uint16 = 2200 - OPEN_STATE_ACTIVITY_FISH_CLOSE uint16 = 2201 - OPEN_STATE_GUIDE_ROGUE_MAP uint16 = 2205 - OPEN_STATE_GUIDE_ROGUE_RUNE uint16 = 2206 - OPEN_STATE_GUIDE_BARTENDER_FORMULA uint16 = 2210 - OPEN_STATE_GUIDE_BARTENDER_MIX uint16 = 2211 - OPEN_STATE_GUIDE_BARTENDER_CUP uint16 = 2212 - OPEN_STATE_GUIDE_MAIL_FAVORITES uint16 = 2400 - OPEN_STATE_GUIDE_POTION_CONFIGURE uint16 = 2401 - OPEN_STATE_GUIDE_LANV2_FIREWORK uint16 = 2402 - OPEN_STATE_LOADINGTIPS_ENKANOMIYA uint16 = 2403 - OPEN_STATE_MICHIAE_CASKET uint16 = 2500 - OPEN_STATE_MAIL_COLLECT_UNLOCK_RED_POINT uint16 = 2501 - OPEN_STATE_LUMEN_STONE uint16 = 2600 - OPEN_STATE_GUIDE_CRYSTALLINK_BUFF uint16 = 2601 + OPEN_STATE_NONE = 0 + OPEN_STATE_PAIMON = 1 + OPEN_STATE_PAIMON_NAVIGATION = 2 + OPEN_STATE_AVATAR_PROMOTE = 3 + OPEN_STATE_AVATAR_TALENT = 4 + OPEN_STATE_WEAPON_PROMOTE = 5 + OPEN_STATE_WEAPON_AWAKEN = 6 + OPEN_STATE_QUEST_REMIND = 7 + OPEN_STATE_GAME_GUIDE = 8 + OPEN_STATE_COOK = 9 + OPEN_STATE_WEAPON_UPGRADE = 10 + OPEN_STATE_RELIQUARY_UPGRADE = 11 + OPEN_STATE_RELIQUARY_PROMOTE = 12 + OPEN_STATE_WEAPON_PROMOTE_GUIDE = 13 + OPEN_STATE_WEAPON_CHANGE_GUIDE = 14 + OPEN_STATE_PLAYER_LVUP_GUIDE = 15 + OPEN_STATE_FRESHMAN_GUIDE = 16 + OPEN_STATE_SKIP_FRESHMAN_GUIDE = 17 + OPEN_STATE_GUIDE_MOVE_CAMERA = 18 + OPEN_STATE_GUIDE_SCALE_CAMERA = 19 + OPEN_STATE_GUIDE_KEYBOARD = 20 + OPEN_STATE_GUIDE_MOVE = 21 + OPEN_STATE_GUIDE_JUMP = 22 + OPEN_STATE_GUIDE_SPRINT = 23 + OPEN_STATE_GUIDE_MAP = 24 + OPEN_STATE_GUIDE_ATTACK = 25 + OPEN_STATE_GUIDE_FLY = 26 + OPEN_STATE_GUIDE_TALENT = 27 + OPEN_STATE_GUIDE_RELIC = 28 + OPEN_STATE_GUIDE_RELIC_PROM = 29 + OPEN_STATE_COMBINE = 30 + OPEN_STATE_GACHA = 31 + OPEN_STATE_GUIDE_GACHA = 32 + OPEN_STATE_GUIDE_TEAM = 33 + OPEN_STATE_GUIDE_PROUD = 34 + OPEN_STATE_GUIDE_AVATAR_PROMOTE = 35 + OPEN_STATE_GUIDE_ADVENTURE_CARD = 36 + OPEN_STATE_FORGE = 37 + OPEN_STATE_GUIDE_BAG = 38 + OPEN_STATE_EXPEDITION = 39 + OPEN_STATE_GUIDE_ADVENTURE_DAILYTASK = 40 + OPEN_STATE_GUIDE_ADVENTURE_DUNGEON = 41 + OPEN_STATE_TOWER = 42 + OPEN_STATE_WORLD_STAMINA = 43 + OPEN_STATE_TOWER_FIRST_ENTER = 44 + OPEN_STATE_RESIN = 45 + OPEN_STATE_LIMIT_REGION_FRESHMEAT = 47 + OPEN_STATE_LIMIT_REGION_GLOBAL = 48 + OPEN_STATE_MULTIPLAYER = 49 + OPEN_STATE_GUIDE_MOUSEPC = 50 + OPEN_STATE_GUIDE_MULTIPLAYER = 51 + OPEN_STATE_GUIDE_DUNGEONREWARD = 52 + OPEN_STATE_GUIDE_BLOSSOM = 53 + OPEN_STATE_AVATAR_FASHION = 54 + OPEN_STATE_PHOTOGRAPH = 55 + OPEN_STATE_GUIDE_KSLQUEST = 56 + OPEN_STATE_PERSONAL_LINE = 57 + OPEN_STATE_GUIDE_PERSONAL_LINE = 58 + OPEN_STATE_GUIDE_APPEARANCE = 59 + OPEN_STATE_GUIDE_PROCESS = 60 + OPEN_STATE_GUIDE_PERSONAL_LINE_KEY = 61 + OPEN_STATE_GUIDE_WIDGET = 62 + OPEN_STATE_GUIDE_ACTIVITY_SKILL_ASTER = 63 + OPEN_STATE_GUIDE_COLDCLIMATE = 64 + OPEN_STATE_DERIVATIVE_MALL = 65 + OPEN_STATE_GUIDE_EXITMULTIPLAYER = 66 + OPEN_STATE_GUIDE_THEATREMACHANICUS_BUILD = 67 + OPEN_STATE_GUIDE_THEATREMACHANICUS_REBUILD = 68 + OPEN_STATE_GUIDE_THEATREMACHANICUS_CARD = 69 + OPEN_STATE_GUIDE_THEATREMACHANICUS_MONSTER = 70 + OPEN_STATE_GUIDE_THEATREMACHANICUS_MISSION_CHECK = 71 + OPEN_STATE_GUIDE_THEATREMACHANICUS_BUILD_SELECT = 72 + OPEN_STATE_GUIDE_THEATREMACHANICUS_CHALLENGE_START = 73 + OPEN_STATE_GUIDE_CONVERT = 74 + OPEN_STATE_GUIDE_THEATREMACHANICUS_MULTIPLAYER = 75 + OPEN_STATE_GUIDE_COOP_TASK = 76 + OPEN_STATE_GUIDE_HOMEWORLD_ADEPTIABODE = 77 + OPEN_STATE_GUIDE_HOMEWORLD_DEPLOY = 78 + OPEN_STATE_GUIDE_CHANNELLERSLAB_EQUIP = 79 + OPEN_STATE_GUIDE_CHANNELLERSLAB_MP_SOLUTION = 80 + OPEN_STATE_GUIDE_CHANNELLERSLAB_POWER = 81 + OPEN_STATE_GUIDE_HIDEANDSEEK_SKILL = 82 + OPEN_STATE_GUIDE_HOMEWORLD_MAPLIST = 83 + OPEN_STATE_GUIDE_RELICRESOLVE = 84 + OPEN_STATE_GUIDE_GGUIDE = 85 + OPEN_STATE_GUIDE_GGUIDE_HINT = 86 + OPEN_STATE_CITY_REPUATION_MENGDE = 800 + OPEN_STATE_CITY_REPUATION_LIYUE = 801 + OPEN_STATE_CITY_REPUATION_UI_HINT = 802 + OPEN_STATE_CITY_REPUATION_INAZUMA = 803 + OPEN_STATE_SHOP_TYPE_MALL = 900 + OPEN_STATE_SHOP_TYPE_RECOMMANDED = 901 + OPEN_STATE_SHOP_TYPE_GENESISCRYSTAL = 902 + OPEN_STATE_SHOP_TYPE_GIFTPACKAGE = 903 + OPEN_STATE_SHOP_TYPE_PAIMON = 1001 + OPEN_STATE_SHOP_TYPE_CITY = 1002 + OPEN_STATE_SHOP_TYPE_BLACKSMITH = 1003 + OPEN_STATE_SHOP_TYPE_GROCERY = 1004 + OPEN_STATE_SHOP_TYPE_FOOD = 1005 + OPEN_STATE_SHOP_TYPE_SEA_LAMP = 1006 + OPEN_STATE_SHOP_TYPE_VIRTUAL_SHOP = 1007 + OPEN_STATE_SHOP_TYPE_LIYUE_GROCERY = 1008 + OPEN_STATE_SHOP_TYPE_LIYUE_SOUVENIR = 1009 + OPEN_STATE_SHOP_TYPE_LIYUE_RESTAURANT = 1010 + OPEN_STATE_SHOP_TYPE_INAZUMA_SOUVENIR = 1011 + OPEN_STATE_SHOP_TYPE_NPC_TOMOKI = 1012 + OPEN_ADVENTURE_MANUAL = 1100 + OPEN_ADVENTURE_MANUAL_CITY_MENGDE = 1101 + OPEN_ADVENTURE_MANUAL_CITY_LIYUE = 1102 + OPEN_ADVENTURE_MANUAL_MONSTER = 1103 + OPEN_ADVENTURE_MANUAL_BOSS_DUNGEON = 1104 + OPEN_STATE_ACTIVITY_SEALAMP = 1200 + OPEN_STATE_ACTIVITY_SEALAMP_TAB2 = 1201 + OPEN_STATE_ACTIVITY_SEALAMP_TAB3 = 1202 + OPEN_STATE_BATTLE_PASS = 1300 + OPEN_STATE_BATTLE_PASS_ENTRY = 1301 + OPEN_STATE_ACTIVITY_CRUCIBLE = 1400 + OPEN_STATE_ACTIVITY_NEWBEEBOUNS_OPEN = 1401 + OPEN_STATE_ACTIVITY_NEWBEEBOUNS_CLOSE = 1402 + OPEN_STATE_ACTIVITY_ENTRY_OPEN = 1403 + OPEN_STATE_MENGDE_INFUSEDCRYSTAL = 1404 + OPEN_STATE_LIYUE_INFUSEDCRYSTAL = 1405 + OPEN_STATE_SNOW_MOUNTAIN_ELDER_TREE = 1406 + OPEN_STATE_MIRACLE_RING = 1407 + OPEN_STATE_COOP_LINE = 1408 + OPEN_STATE_INAZUMA_INFUSEDCRYSTAL = 1409 + OPEN_STATE_FISH = 1410 + OPEN_STATE_GUIDE_SUMO_TEAM_SKILL = 1411 + OPEN_STATE_GUIDE_FISH_RECIPE = 1412 + OPEN_STATE_HOME = 1500 + OPEN_STATE_ACTIVITY_HOMEWORLD = 1501 + OPEN_STATE_ADEPTIABODE = 1502 + OPEN_STATE_HOME_AVATAR = 1503 + OPEN_STATE_HOME_EDIT = 1504 + OPEN_STATE_HOME_EDIT_TIPS = 1505 + OPEN_STATE_RELIQUARY_DECOMPOSE = 1600 + OPEN_STATE_ACTIVITY_H5 = 1700 + OPEN_STATE_ORAIONOKAMI = 2000 + OPEN_STATE_GUIDE_CHESS_MISSION_CHECK = 2001 + OPEN_STATE_GUIDE_CHESS_BUILD = 2002 + OPEN_STATE_GUIDE_CHESS_WIND_TOWER_CIRCLE = 2003 + OPEN_STATE_GUIDE_CHESS_CARD_SELECT = 2004 + OPEN_STATE_INAZUMA_MAINQUEST_FINISHED = 2005 + OPEN_STATE_PAIMON_LVINFO = 2100 + OPEN_STATE_TELEPORT_HUD = 2101 + OPEN_STATE_GUIDE_MAP_UNLOCK = 2102 + OPEN_STATE_GUIDE_PAIMON_LVINFO = 2103 + OPEN_STATE_GUIDE_AMBORTRANSPORT = 2104 + OPEN_STATE_GUIDE_FLY_SECOND = 2105 + OPEN_STATE_GUIDE_KAEYA_CLUE = 2106 + OPEN_STATE_CAPTURE_CODEX = 2107 + OPEN_STATE_ACTIVITY_FISH_OPEN = 2200 + OPEN_STATE_ACTIVITY_FISH_CLOSE = 2201 + OPEN_STATE_GUIDE_ROGUE_MAP = 2205 + OPEN_STATE_GUIDE_ROGUE_RUNE = 2206 + OPEN_STATE_GUIDE_BARTENDER_FORMULA = 2210 + OPEN_STATE_GUIDE_BARTENDER_MIX = 2211 + OPEN_STATE_GUIDE_BARTENDER_CUP = 2212 + OPEN_STATE_GUIDE_MAIL_FAVORITES = 2400 + OPEN_STATE_GUIDE_POTION_CONFIGURE = 2401 + OPEN_STATE_GUIDE_LANV2_FIREWORK = 2402 + OPEN_STATE_LOADINGTIPS_ENKANOMIYA = 2403 + OPEN_STATE_MICHIAE_CASKET = 2500 + OPEN_STATE_MAIL_COLLECT_UNLOCK_RED_POINT = 2501 + OPEN_STATE_LUMEN_STONE = 2600 + OPEN_STATE_GUIDE_CRYSTALLINK_BUFF = 2601 ) var ALL_OPEN_STATE []uint16 diff --git a/common/constant/player_prop.go b/common/constant/player_prop.go index 0d33c523..89550f9a 100644 --- a/common/constant/player_prop.go +++ b/common/constant/player_prop.go @@ -1,46 +1,46 @@ package constant const ( - PLAYER_PROP_EXP uint16 = 1001 // 角色经验 - PLAYER_PROP_BREAK_LEVEL uint16 = 1002 // 角色突破等阶 - PLAYER_PROP_SATIATION_VAL uint16 = 1003 // 角色饱食度 - PLAYER_PROP_SATIATION_PENALTY_TIME uint16 = 1004 // 角色饱食度溢出 - PLAYER_PROP_LEVEL uint16 = 4001 // 角色等级 - PLAYER_PROP_LAST_CHANGE_AVATAR_TIME uint16 = 10001 // 上一次改变角色的时间 暂不确定 - PLAYER_PROP_MAX_SPRING_VOLUME uint16 = 10002 // 七天神像最大恢复血量 0-8500000 - PLAYER_PROP_CUR_SPRING_VOLUME uint16 = 10003 // 七天神像当前血量 0-PROP_MAX_SPRING_VOLUME - PLAYER_PROP_IS_SPRING_AUTO_USE uint16 = 10004 // 是否开启靠近自动回血 0 1 - PLAYER_PROP_SPRING_AUTO_USE_PERCENT uint16 = 10005 // 自动回血百分比 0-100 - PLAYER_PROP_IS_FLYABLE uint16 = 10006 // 禁止使用风之翼 0 1 - PLAYER_PROP_IS_WEATHER_LOCKED uint16 = 10007 // 游戏内天气锁定 - PLAYER_PROP_IS_GAME_TIME_LOCKED uint16 = 10008 // 游戏内时间锁定 - PLAYER_PROP_IS_TRANSFERABLE uint16 = 10009 // 是否禁止传送 0 1 - PLAYER_PROP_MAX_STAMINA uint16 = 10010 // 最大体力 0-24000 - PLAYER_PROP_CUR_PERSIST_STAMINA uint16 = 10011 // 当前体力 0-PROP_MAX_STAMINA - PLAYER_PROP_CUR_TEMPORARY_STAMINA uint16 = 10012 // 当前临时体力 暂不确定 - PLAYER_PROP_PLAYER_LEVEL uint16 = 10013 // 冒险等级 - PLAYER_PROP_PLAYER_EXP uint16 = 10014 // 冒险经验 - PLAYER_PROP_PLAYER_HCOIN uint16 = 10015 // 原石 可以为负数 - PLAYER_PROP_PLAYER_SCOIN uint16 = 10016 // 摩拉 - PLAYER_PROP_PLAYER_MP_SETTING_TYPE uint16 = 10017 // 多人游戏世界权限 0禁止加入 1直接加入 2需要申请 - PLAYER_PROP_IS_MP_MODE_AVAILABLE uint16 = 10018 // 玩家当前的世界是否可加入 0 1 例如任务中就不可加入 - PLAYER_PROP_PLAYER_WORLD_LEVEL uint16 = 10019 // 世界等级 0-8 - PLAYER_PROP_PLAYER_RESIN uint16 = 10020 // 树脂 0-2000 - PLAYER_PROP_PLAYER_WAIT_SUB_HCOIN uint16 = 10022 // 暂存的原石 暂不确定 - PLAYER_PROP_PLAYER_WAIT_SUB_SCOIN uint16 = 10023 // 暂存的摩拉 暂不确定 - PLAYER_PROP_IS_ONLY_MP_WITH_PS_PLAYER uint16 = 10024 // 当前玩家多人世界里是否有PS主机玩家 0 1 - PLAYER_PROP_PLAYER_MCOIN uint16 = 10025 // 创世结晶 可以为负数 - PLAYER_PROP_PLAYER_WAIT_SUB_MCOIN uint16 = 10026 // 暂存的创世结晶 暂不确定 - PLAYER_PROP_PLAYER_LEGENDARY_KEY uint16 = 10027 // 传说任务钥匙 - PLAYER_PROP_IS_HAS_FIRST_SHARE uint16 = 10028 // 是否拥有抽卡结果首次分享奖励 暂不确定 - PLAYER_PROP_PLAYER_FORGE_POINT uint16 = 10029 // 锻造相关 - PLAYER_PROP_CUR_CLIMATE_METER uint16 = 10035 // 天气相关 - PLAYER_PROP_CUR_CLIMATE_TYPE uint16 = 10036 // 天气相关 - PLAYER_PROP_CUR_CLIMATE_AREA_ID uint16 = 10037 // 天气相关 - PLAYER_PROP_CUR_CLIMATE_AREA_CLIMATE_TYPE uint16 = 10038 // 天气相关 - PLAYER_PROP_PLAYER_WORLD_LEVEL_LIMIT uint16 = 10039 // 降低世界等级到此等级 暂不确定 - PLAYER_PROP_PLAYER_WORLD_LEVEL_ADJUST_CD uint16 = 10040 // 降低世界等级的CD - PLAYER_PROP_PLAYER_LEGENDARY_DAILY_TASK_NUM uint16 = 10041 // 传说每日任务数量 暂不确定 - PLAYER_PROP_PLAYER_HOME_COIN uint16 = 10042 // 洞天宝钱 - PLAYER_PROP_PLAYER_WAIT_SUB_HOME_COIN uint16 = 10043 // 暂存的洞天宝钱 暂不确定 + PLAYER_PROP_EXP = 1001 // 角色经验 + PLAYER_PROP_BREAK_LEVEL = 1002 // 角色突破等阶 + PLAYER_PROP_SATIATION_VAL = 1003 // 角色饱食度 + PLAYER_PROP_SATIATION_PENALTY_TIME = 1004 // 角色饱食度溢出 + PLAYER_PROP_LEVEL = 4001 // 角色等级 + PLAYER_PROP_LAST_CHANGE_AVATAR_TIME = 10001 // 上一次改变角色的时间 暂不确定 + PLAYER_PROP_MAX_SPRING_VOLUME = 10002 // 七天神像最大恢复血量 0-8500000 + PLAYER_PROP_CUR_SPRING_VOLUME = 10003 // 七天神像当前血量 0-PROP_MAX_SPRING_VOLUME + PLAYER_PROP_IS_SPRING_AUTO_USE = 10004 // 是否开启靠近自动回血 0 1 + PLAYER_PROP_SPRING_AUTO_USE_PERCENT = 10005 // 自动回血百分比 0-100 + PLAYER_PROP_IS_FLYABLE = 10006 // 禁止使用风之翼 0 1 + PLAYER_PROP_IS_WEATHER_LOCKED = 10007 // 游戏内天气锁定 + PLAYER_PROP_IS_GAME_TIME_LOCKED = 10008 // 游戏内时间锁定 + PLAYER_PROP_IS_TRANSFERABLE = 10009 // 是否禁止传送 0 1 + PLAYER_PROP_MAX_STAMINA = 10010 // 最大体力 0-24000 + PLAYER_PROP_CUR_PERSIST_STAMINA = 10011 // 当前体力 0-PROP_MAX_STAMINA + PLAYER_PROP_CUR_TEMPORARY_STAMINA = 10012 // 当前临时体力 暂不确定 + PLAYER_PROP_PLAYER_LEVEL = 10013 // 冒险等级 + PLAYER_PROP_PLAYER_EXP = 10014 // 冒险经验 + PLAYER_PROP_PLAYER_HCOIN = 10015 // 原石 可以为负数 + PLAYER_PROP_PLAYER_SCOIN = 10016 // 摩拉 + PLAYER_PROP_PLAYER_MP_SETTING_TYPE = 10017 // 多人游戏世界权限 0禁止加入 1直接加入 2需要申请 + PLAYER_PROP_IS_MP_MODE_AVAILABLE = 10018 // 玩家当前的世界是否可加入 0 1 例如任务中就不可加入 + PLAYER_PROP_PLAYER_WORLD_LEVEL = 10019 // 世界等级 0-8 + PLAYER_PROP_PLAYER_RESIN = 10020 // 树脂 0-2000 + PLAYER_PROP_PLAYER_WAIT_SUB_HCOIN = 10022 // 暂存的原石 暂不确定 + PLAYER_PROP_PLAYER_WAIT_SUB_SCOIN = 10023 // 暂存的摩拉 暂不确定 + PLAYER_PROP_IS_ONLY_MP_WITH_PS_PLAYER = 10024 // 当前玩家多人世界里是否有PS主机玩家 0 1 + PLAYER_PROP_PLAYER_MCOIN = 10025 // 创世结晶 可以为负数 + PLAYER_PROP_PLAYER_WAIT_SUB_MCOIN = 10026 // 暂存的创世结晶 暂不确定 + PLAYER_PROP_PLAYER_LEGENDARY_KEY = 10027 // 传说任务钥匙 + PLAYER_PROP_IS_HAS_FIRST_SHARE = 10028 // 是否拥有抽卡结果首次分享奖励 暂不确定 + PLAYER_PROP_PLAYER_FORGE_POINT = 10029 // 锻造相关 + PLAYER_PROP_CUR_CLIMATE_METER = 10035 // 天气相关 + PLAYER_PROP_CUR_CLIMATE_TYPE = 10036 // 天气相关 + PLAYER_PROP_CUR_CLIMATE_AREA_ID = 10037 // 天气相关 + PLAYER_PROP_CUR_CLIMATE_AREA_CLIMATE_TYPE = 10038 // 天气相关 + PLAYER_PROP_PLAYER_WORLD_LEVEL_LIMIT = 10039 // 降低世界等级到此等级 暂不确定 + PLAYER_PROP_PLAYER_WORLD_LEVEL_ADJUST_CD = 10040 // 降低世界等级的CD + PLAYER_PROP_PLAYER_LEGENDARY_DAILY_TASK_NUM = 10041 // 传说每日任务数量 暂不确定 + PLAYER_PROP_PLAYER_HOME_COIN = 10042 // 洞天宝钱 + PLAYER_PROP_PLAYER_WAIT_SUB_HOME_COIN = 10043 // 暂存的洞天宝钱 暂不确定 ) diff --git a/common/constant/stamina_cost.go b/common/constant/stamina_cost.go index 87cd2a33..ad3eb2c9 100644 --- a/common/constant/stamina_cost.go +++ b/common/constant/stamina_cost.go @@ -2,24 +2,24 @@ package constant const ( // 消耗耐力 - STAMINA_COST_CLIMBING_BASE int32 = -100 // 缓慢攀爬基数 - STAMINA_COST_CLIMB_START int32 = -500 // 攀爬开始 - STAMINA_COST_CLIMB_JUMP int32 = -2500 // 攀爬跳跃 - STAMINA_COST_DASH int32 = -360 // 快速跑步 - STAMINA_COST_FLY int32 = -60 // 滑翔 - STAMINA_COST_SPRINT int32 = -1800 // 冲刺 - STAMINA_COST_SWIM_DASH_START int32 = -200 // 快速游泳开始 - STAMINA_COST_SWIM_DASH int32 = -204 // 快速游泳 - STAMINA_COST_SWIMMING int32 = -400 // 缓慢游泳 + STAMINA_COST_CLIMBING_BASE = -100 // 缓慢攀爬基数 + STAMINA_COST_CLIMB_START = -500 // 攀爬开始 + STAMINA_COST_CLIMB_JUMP = -2500 // 攀爬跳跃 + STAMINA_COST_DASH = -360 // 快速跑步 + STAMINA_COST_FLY = -60 // 滑翔 + STAMINA_COST_SPRINT = -1800 // 冲刺 + STAMINA_COST_SWIM_DASH_START = -200 // 快速游泳开始 + STAMINA_COST_SWIM_DASH = -204 // 快速游泳 + STAMINA_COST_SWIMMING = -400 // 缓慢游泳 // 恢复耐力 - STAMINA_COST_POWERED_FLY int32 = 500 // 滑翔加速(风圈等) - STAMINA_COST_RUN int32 = 500 // 正常跑步 - STAMINA_COST_STANDBY int32 = 500 // 站立 - STAMINA_COST_WALK int32 = 500 // 走路 + STAMINA_COST_POWERED_FLY = 500 // 滑翔加速(风圈等) + STAMINA_COST_RUN = 500 // 正常跑步 + STAMINA_COST_STANDBY = 500 // 站立 + STAMINA_COST_WALK = 500 // 走路 // 载具浪船 - STAMINA_COST_SKIFF_DASH int32 = -204 // 浪船加速 - STAMINA_COST_SKIFF_NORMAL int32 = 500 // 浪船正常移动 (回复耐力) - STAMINA_COST_POWERED_SKIFF int32 = 500 // 浪船加速(风圈等) (回复耐力) - STAMINA_COST_IN_SKIFF int32 = 500 // 处于浪船中回复角色耐力 (回复耐力) - STAMINA_COST_SKIFF_NOBODY int32 = 500 // 浪船无人时回复载具耐力 (回复耐力) + STAMINA_COST_SKIFF_DASH = -204 // 浪船加速 + STAMINA_COST_SKIFF_NORMAL = 500 // 浪船正常移动 (回复耐力) + STAMINA_COST_POWERED_SKIFF = 500 // 浪船加速(风圈等) (回复耐力) + STAMINA_COST_IN_SKIFF = 500 // 处于浪船中回复角色耐力 (回复耐力) + STAMINA_COST_SKIFF_NOBODY = 500 // 浪船无人时回复载具耐力 (回复耐力) ) diff --git a/gate/net/proto_endecode.go b/gate/net/proto_endecode.go index 9862cf8a..b5ed9cd1 100644 --- a/gate/net/proto_endecode.go +++ b/gate/net/proto_endecode.go @@ -384,9 +384,15 @@ func ConvClientPbDataToServer(protoObj pb.Message, clientCmdProtoMap *client_pro ntf := protoObj.(*proto.AbilityInvocationsNotify) for _, entry := range ntf.Invokes { switch entry.ArgumentType { + case proto.AbilityInvokeArgument_ABILITY_META_MODIFIER_CHANGE: + serverProtoObj := new(proto.AbilityMetaModifierChange) + ConvClientPbDataToServerCore("AbilityMetaModifierChange", serverProtoObj, &entry.AbilityData, clientCmdProtoMap) case proto.AbilityInvokeArgument_ABILITY_MIXIN_COST_STAMINA: serverProtoObj := new(proto.AbilityMixinCostStamina) ConvClientPbDataToServerCore("AbilityMixinCostStamina", serverProtoObj, &entry.AbilityData, clientCmdProtoMap) + case proto.AbilityInvokeArgument_ABILITY_META_MODIFIER_DURABILITY_CHANGE: + serverProtoObj := new(proto.AbilityMetaModifierDurabilityChange) + ConvClientPbDataToServerCore("AbilityMetaModifierDurabilityChange", serverProtoObj, &entry.AbilityData, clientCmdProtoMap) } } case *proto.ClientAbilityChangeNotify: @@ -429,9 +435,15 @@ func ConvServerPbDataToClient(protoObj pb.Message, clientCmdProtoMap *client_pro ntf := protoObj.(*proto.AbilityInvocationsNotify) for _, entry := range ntf.Invokes { switch entry.ArgumentType { + case proto.AbilityInvokeArgument_ABILITY_META_MODIFIER_CHANGE: + serverProtoObj := new(proto.AbilityMetaModifierChange) + ConvServerPbDataToClientCore("AbilityMetaModifierChange", serverProtoObj, &entry.AbilityData, clientCmdProtoMap) case proto.AbilityInvokeArgument_ABILITY_MIXIN_COST_STAMINA: serverProtoObj := new(proto.AbilityMixinCostStamina) ConvServerPbDataToClientCore("AbilityMixinCostStamina", serverProtoObj, &entry.AbilityData, clientCmdProtoMap) + case proto.AbilityInvokeArgument_ABILITY_META_MODIFIER_DURABILITY_CHANGE: + serverProtoObj := new(proto.AbilityMetaModifierDurabilityChange) + ConvServerPbDataToClientCore("AbilityMetaModifierDurabilityChange", serverProtoObj, &entry.AbilityData, clientCmdProtoMap) } } case *proto.ClientAbilityChangeNotify: diff --git a/gs/game/audio_video.go b/gs/game/audio_video.go index f9accc40..c86acb32 100644 --- a/gs/game/audio_video.go +++ b/gs/game/audio_video.go @@ -311,7 +311,7 @@ func UpdateFrame(rgb bool) { for _, v := range SCREEN_ENTITY_ID_LIST { scene.DestroyEntity(v) } - GAME.RemoveSceneEntityNotifyBroadcast(scene, proto.VisionType_VISION_REMOVE, SCREEN_ENTITY_ID_LIST, false, nil) + GAME.RemoveSceneEntityNotifyBroadcast(scene, proto.VisionType_VISION_REMOVE, SCREEN_ENTITY_ID_LIST, false, 0) SCREEN_ENTITY_ID_LIST = make([]uint32, 0) leftTopPos := &model.Vector{ X: BASE_POS.X + float64(SCREEN_WIDTH)*SCREEN_DPI/2, diff --git a/gs/game/game.go b/gs/game/game.go index e50ac576..4406e7d1 100644 --- a/gs/game/game.go +++ b/gs/game/game.go @@ -375,9 +375,9 @@ func (g *Game) SendToWorldA(world *World, cmdId uint16, seq uint32, msg pb.Messa } // SendToWorldAEC 给世界内除某玩家(一般是自己)以外的所有玩家发消息 -func (g *Game) SendToWorldAEC(world *World, cmdId uint16, seq uint32, msg pb.Message, uid uint32) { +func (g *Game) SendToWorldAEC(world *World, cmdId uint16, seq uint32, msg pb.Message, aecUid uint32) { for _, v := range world.GetAllPlayer() { - if uid == v.PlayerID { + if aecUid == v.PlayerID { continue } GAME.SendMsg(cmdId, v.PlayerID, seq, msg) @@ -389,6 +389,44 @@ func (g *Game) SendToWorldH(world *World, cmdId uint16, seq uint32, msg pb.Messa GAME.SendMsg(cmdId, world.GetOwner().PlayerID, seq, msg) } +// SendToSceneA 给场景内所有玩家发消息 +func (g *Game) SendToSceneA(scene *Scene, cmdId uint16, seq uint32, msg pb.Message) { + world := scene.GetWorld() + if WORLD_MANAGER.IsBigWorld(world) { + bigWorldAoi := world.GetBigWorldAoi() + otherWorldAvatarMap := bigWorldAoi.GetObjectListByPos(float32(SELF.Pos.X), float32(SELF.Pos.Y), float32(SELF.Pos.Z)) + for uid := range otherWorldAvatarMap { + GAME.SendMsg(cmdId, uint32(uid), seq, msg) + } + } else { + for _, v := range scene.GetAllPlayer() { + GAME.SendMsg(cmdId, v.PlayerID, seq, msg) + } + } +} + +// SendToSceneAEC 给场景内除某玩家(一般是自己)以外的所有玩家发消息 +func (g *Game) SendToSceneAEC(scene *Scene, cmdId uint16, seq uint32, msg pb.Message, aecUid uint32) { + world := scene.GetWorld() + if WORLD_MANAGER.IsBigWorld(world) { + bigWorldAoi := world.GetBigWorldAoi() + otherWorldAvatarMap := bigWorldAoi.GetObjectListByPos(float32(SELF.Pos.X), float32(SELF.Pos.Y), float32(SELF.Pos.Z)) + for uid := range otherWorldAvatarMap { + if aecUid == uint32(uid) { + continue + } + GAME.SendMsg(cmdId, uint32(uid), seq, msg) + } + } else { + for _, v := range scene.GetAllPlayer() { + if aecUid == v.PlayerID { + continue + } + GAME.SendMsg(cmdId, v.PlayerID, seq, msg) + } + } +} + func (g *Game) ReLoginPlayer(userId uint32, isQuitMp bool) { reason := proto.ClientReconnectReason_CLIENT_RECONNNECT_NONE if isQuitMp { diff --git a/gs/game/game_world_manager.go b/gs/game/game_world_manager.go index 2c547508..f4580f31 100644 --- a/gs/game/game_world_manager.go +++ b/gs/game/game_world_manager.go @@ -327,6 +327,10 @@ func (w *World) GetWorldPlayerNum() int { return len(w.playerMap) } +func (w *World) GetBigWorldAoi() *alg.AoiManager { + return w.bigWorldAoi +} + func (w *World) AddPlayer(player *model.Player, sceneId uint32) { w.peerList = append(w.peerList, player) w.playerMap[player.PlayerID] = player @@ -714,6 +718,9 @@ func (w *World) UpdateMultiplayerTeam() { // 世界聊天 func (w *World) AddChat(chatInfo *proto.ChatInfo) { + if len(w.chatMsgList) > 100 { + w.chatMsgList = w.chatMsgList[1:] + } w.chatMsgList = append(w.chatMsgList, chatInfo) } diff --git a/gs/game/player_avatar.go b/gs/game/player_avatar.go index 7cc69181..9ec995b0 100644 --- a/gs/game/player_avatar.go +++ b/gs/game/player_avatar.go @@ -276,9 +276,7 @@ func (g *Game) AvatarWearFlycloakReq(player *model.Player, payloadMsg pb.Message AvatarGuid: req.AvatarGuid, FlycloakId: req.FlycloakId, } - for _, scenePlayer := range scene.GetAllPlayer() { - g.SendMsg(cmd.AvatarFlycloakChangeNotify, scenePlayer.PlayerID, scenePlayer.ClientSeq, avatarFlycloakChangeNotify) - } + g.SendToSceneA(scene, cmd.AvatarFlycloakChangeNotify, player.ClientSeq, avatarFlycloakChangeNotify) avatarWearFlycloakRsp := &proto.AvatarWearFlycloakRsp{ AvatarGuid: req.AvatarGuid, @@ -338,9 +336,7 @@ func (g *Game) AvatarChangeCostumeReq(player *model.Player, payloadMsg pb.Messag } else { avatarChangeCostumeNotify.EntityInfo = g.PacketSceneEntityInfoAvatar(scene, player, avatar.AvatarId) } - for _, scenePlayer := range scene.GetAllPlayer() { - g.SendMsg(cmd.AvatarChangeCostumeNotify, scenePlayer.PlayerID, scenePlayer.ClientSeq, avatarChangeCostumeNotify) - } + g.SendToSceneA(scene, cmd.AvatarChangeCostumeNotify, player.ClientSeq, avatarChangeCostumeNotify) avatarChangeCostumeRsp := &proto.AvatarChangeCostumeRsp{ AvatarGuid: req.AvatarGuid, diff --git a/gs/game/player_chat.go b/gs/game/player_chat.go index 4a45ac30..452d3eff 100644 --- a/gs/game/player_chat.go +++ b/gs/game/player_chat.go @@ -253,9 +253,7 @@ func (g *Game) PlayerChatReq(player *model.Player, payloadMsg pb.Message) { ChannelId: channelId, ChatInfo: sendChatInfo, } - for _, worldPlayer := range world.GetAllPlayer() { - g.SendMsg(cmd.PlayerChatNotify, worldPlayer.PlayerID, player.ClientSeq, playerChatNotify) - } + g.SendToWorldA(world, cmd.PlayerChatNotify, player.ClientSeq, playerChatNotify) g.SendMsg(cmd.PlayerChatRsp, player.PlayerID, player.ClientSeq, new(proto.PlayerChatRsp)) } diff --git a/gs/game/player_common.go b/gs/game/player_common.go index e4724792..4c1bcd4d 100644 --- a/gs/game/player_common.go +++ b/gs/game/player_common.go @@ -219,7 +219,7 @@ func (g *Game) ScenePlayerLocationNotify(world *World) { } } } - GAME.SendToWorldA(world, cmd.ScenePlayerLocationNotify, 0, scenePlayerLocationNotify) + GAME.SendToSceneA(scene, cmd.ScenePlayerLocationNotify, 0, scenePlayerLocationNotify) } } diff --git a/gs/game/player_fight_sync.go b/gs/game/player_fight_sync.go index 750f4498..67b6387d 100644 --- a/gs/game/player_fight_sync.go +++ b/gs/game/player_fight_sync.go @@ -26,6 +26,7 @@ func DoForward[IET model.InvokeEntryType](player *model.Player, invokeHandler *m if world == nil { return } + scene := world.GetSceneById(player.SceneId) if srcNtf != nil && copyFieldList != nil { for _, fieldName := range copyFieldList { reflection.CopyStructField(newNtf, srcNtf, fieldName) @@ -36,11 +37,11 @@ func DoForward[IET model.InvokeEntryType](player *model.Player, invokeHandler *m } if invokeHandler.AllLen() > 0 { reflection.SetStructFieldValue(newNtf, forwardField, invokeHandler.EntryListForwardAll) - GAME.SendToWorldA(world, cmdId, player.ClientSeq, newNtf) + GAME.SendToSceneA(scene, cmdId, player.ClientSeq, newNtf) } if invokeHandler.AllExceptCurLen() > 0 { reflection.SetStructFieldValue(newNtf, forwardField, invokeHandler.EntryListForwardAllExceptCur) - GAME.SendToWorldAEC(world, cmdId, player.ClientSeq, newNtf, player.PlayerID) + GAME.SendToSceneAEC(scene, cmdId, player.ClientSeq, newNtf, player.PlayerID) } if invokeHandler.HostLen() > 0 { reflection.SetStructFieldValue(newNtf, forwardField, invokeHandler.EntryListForwardHost) @@ -74,13 +75,9 @@ func (g *Game) MassiveEntityElementOpBatchNotify(player *model.Player, payloadMs return } scene := world.GetSceneById(player.SceneId) - if scene == nil { - logger.Error("scene is nil, sceneId: %v", player.SceneId) - return - } req.OpIdx = scene.GetMeeoIndex() scene.SetMeeoIndex(scene.GetMeeoIndex() + 1) - g.SendToWorldA(world, cmd.MassiveEntityElementOpBatchNotify, player.ClientSeq, req) + g.SendToSceneA(scene, cmd.MassiveEntityElementOpBatchNotify, player.ClientSeq, req) } func (g *Game) CombatInvocationsNotify(player *model.Player, payloadMsg pb.Message) { @@ -120,7 +117,7 @@ func (g *Game) CombatInvocationsNotify(player *model.Player, payloadMsg pb.Messa currHp = 0 } fightProp[constant.FIGHT_PROP_CUR_HP] = currHp - g.EntityFightPropUpdateNotifyBroadcast(world, target) + g.EntityFightPropUpdateNotifyBroadcast(scene, target) switch target.GetEntityType() { case constant.ENTITY_TYPE_AVATAR: case constant.ENTITY_TYPE_MONSTER: @@ -135,13 +132,7 @@ func (g *Game) CombatInvocationsNotify(player *model.Player, payloadMsg pb.Messa break } logger.Debug("[EvtBeingHit] GadgetData: %+v, EntityId: %v, uid: %v", gadgetDataConfig, target.GetId(), player.PlayerID) - // TODO 临时的解决方案 - if strings.Contains(gadgetDataConfig.ServerLuaScript, "SetGadgetState") { - g.ChangeGadgetState(player, target.GetId(), constant.GADGET_STATE_GEAR_START) - } - if strings.Contains(gadgetDataConfig.ServerLuaScript, "Controller") { - g.ChangeGadgetState(player, target.GetId(), constant.GADGET_STATE_GEAR_START) - } + g.handleGadgetEntityBeHitLow(player, target, attackResult.ElementType) } case proto.CombatTypeArgument_ENTITY_MOVE: entityMoveInfo := new(proto.EntityMoveInfo) @@ -161,24 +152,21 @@ func (g *Game) CombatInvocationsNotify(player *model.Player, payloadMsg pb.Messa } if sceneEntity.GetEntityType() == constant.ENTITY_TYPE_AVATAR { // 玩家实体在移动 - g.AoiPlayerMove(player, player.Pos, &model.Vector{ - X: float64(motionInfo.Pos.X), - Y: float64(motionInfo.Pos.Y), - Z: float64(motionInfo.Pos.Z), - }) + g.SceneBlockAoiPlayerMove(player, world, scene, player.Pos, + &model.Vector{X: float64(motionInfo.Pos.X), Y: float64(motionInfo.Pos.Y), Z: float64(motionInfo.Pos.Z)}, + ) + if WORLD_MANAGER.IsBigWorld(world) { + g.BigWorldAoiPlayerMove(player, world, scene, player.Pos, + &model.Vector{X: float64(motionInfo.Pos.X), Y: float64(motionInfo.Pos.Y), Z: float64(motionInfo.Pos.Z)}, + ) + } // 场景区域触发器检测 - g.SceneRegionTriggerCheck(player, player.Pos, &model.Vector{ - X: float64(motionInfo.Pos.X), - Y: float64(motionInfo.Pos.Y), - Z: float64(motionInfo.Pos.Z), - }, sceneEntity.GetId()) + g.SceneRegionTriggerCheck(player, player.Pos, + &model.Vector{X: float64(motionInfo.Pos.X), Y: float64(motionInfo.Pos.Y), Z: float64(motionInfo.Pos.Z)}, + sceneEntity.GetId()) // 更新玩家的位置信息 - player.Pos.X = float64(motionInfo.Pos.X) - player.Pos.Y = float64(motionInfo.Pos.Y) - player.Pos.Z = float64(motionInfo.Pos.Z) - player.Rot.X = float64(motionInfo.Rot.X) - player.Rot.Y = float64(motionInfo.Rot.Y) - player.Rot.Z = float64(motionInfo.Rot.Z) + player.Pos.X, player.Pos.Y, player.Pos.Z = float64(motionInfo.Pos.X), float64(motionInfo.Pos.Y), float64(motionInfo.Pos.Z) + player.Rot.X, player.Rot.Y, player.Rot.Z = float64(motionInfo.Rot.X), float64(motionInfo.Rot.Y), float64(motionInfo.Rot.Z) // 玩家安全位置更新 switch motionInfo.State { case proto.MotionState_MOTION_DANGER_RUN, @@ -192,9 +180,7 @@ func (g *Game) CombatInvocationsNotify(player *model.Player, payloadMsg pb.Messa proto.MotionState_MOTION_WALK, proto.MotionState_MOTION_DASH: // 仅在陆地时更新玩家安全位置 - player.SafePos.X = player.Pos.X - player.SafePos.Y = player.Pos.Y - player.SafePos.Z = player.Pos.Z + player.SafePos.X, player.SafePos.Y, player.SafePos.Z = player.Pos.X, player.Pos.Y, player.Pos.Z } // 处理耐力消耗 g.ImmediateStamina(player, motionInfo.State) @@ -202,13 +188,9 @@ func (g *Game) CombatInvocationsNotify(player *model.Player, payloadMsg pb.Messa // 非玩家实体在移动 // 更新场景实体的位置信息 pos := sceneEntity.GetPos() - pos.X = float64(motionInfo.Pos.X) - pos.Y = float64(motionInfo.Pos.Y) - pos.Z = float64(motionInfo.Pos.Z) + pos.X, pos.Y, pos.Z = float64(motionInfo.Pos.X), float64(motionInfo.Pos.Y), float64(motionInfo.Pos.Z) rot := sceneEntity.GetRot() - rot.X = float64(motionInfo.Rot.X) - rot.Y = float64(motionInfo.Rot.Y) - rot.Z = float64(motionInfo.Rot.Z) + rot.X, rot.Y, rot.Z = float64(motionInfo.Rot.X), float64(motionInfo.Rot.Y), float64(motionInfo.Rot.Z) if sceneEntity.GetEntityType() == constant.ENTITY_TYPE_GADGET { // 载具耐力消耗 gadgetEntity := sceneEntity.GetGadgetEntity() @@ -249,13 +231,7 @@ func (g *Game) CombatInvocationsNotify(player *model.Player, payloadMsg pb.Messa } } -func (g *Game) AoiPlayerMove(player *model.Player, oldPos *model.Vector, newPos *model.Vector) { - world := WORLD_MANAGER.GetWorldByID(player.WorldId) - if world == nil { - logger.Error("get player world is nil, uid: %v", player.PlayerID) - return - } - scene := world.GetSceneById(player.SceneId) +func (g *Game) SceneBlockAoiPlayerMove(player *model.Player, world *World, scene *Scene, oldPos *model.Vector, newPos *model.Vector) { sceneBlockAoiMap := WORLD_MANAGER.GetSceneBlockAoiMap() aoiManager, exist := sceneBlockAoiMap[player.SceneId] if !exist { @@ -328,18 +304,54 @@ func (g *Game) AoiPlayerMove(player *model.Player, oldPos *model.Vector, newPos if len(addEntityIdList) > 0 { g.AddSceneEntityNotify(player, proto.VisionType_VISION_MEET, addEntityIdList, false, false) } - if WORLD_MANAGER.IsBigWorld(world) { - oldGid := world.bigWorldAoi.GetGidByPos(float32(oldPos.X), float32(oldPos.Y), float32(oldPos.Z)) - newGid := world.bigWorldAoi.GetGidByPos(float32(newPos.X), float32(newPos.Y), float32(newPos.Z)) - if oldGid != newGid { - // 玩家跨越了格子 - logger.Debug("player cross big world aoi grid, oldGid: %v, newGid: %v, uid: %v", oldGid, newGid, player.PlayerID) - // 老格子移除玩家 新格子添加玩家 - activeAvatarId := world.GetPlayerActiveAvatarId(player) - activeWorldAvatar := world.GetPlayerWorldAvatar(player, activeAvatarId) - world.bigWorldAoi.RemoveObjectFromGrid(int64(player.PlayerID), oldGid) - world.bigWorldAoi.AddObjectToGrid(int64(player.PlayerID), activeWorldAvatar, newGid) - oldOtherWorldAvatarMap := world.bigWorldAoi.GetObjectListByPos(float32(oldPos.X), float32(oldPos.Y), float32(oldPos.Z)) +} + +func (g *Game) BigWorldAoiPlayerMove(player *model.Player, world *World, scene *Scene, oldPos *model.Vector, newPos *model.Vector) { + bigWorldAoi := world.GetBigWorldAoi() + oldGid := bigWorldAoi.GetGidByPos(float32(oldPos.X), float32(oldPos.Y), float32(oldPos.Z)) + newGid := bigWorldAoi.GetGidByPos(float32(newPos.X), float32(newPos.Y), float32(newPos.Z)) + if oldGid != newGid { + // 玩家跨越了格子 + logger.Debug("player cross big world aoi grid, oldGid: %v, newGid: %v, uid: %v", oldGid, newGid, player.PlayerID) + // 找出本次移动所带来的消失和出现的格子 + oldGridList := bigWorldAoi.GetSurrGridListByGid(oldGid) + newGridList := bigWorldAoi.GetSurrGridListByGid(newGid) + delGridIdList := make([]uint32, 0) + for _, oldGrid := range oldGridList { + exist := false + for _, newGrid := range newGridList { + if oldGrid.GetGid() == newGrid.GetGid() { + exist = true + break + } + } + if exist { + continue + } + delGridIdList = append(delGridIdList, oldGrid.GetGid()) + } + addGridIdList := make([]uint32, 0) + for _, newGrid := range newGridList { + exist := false + for _, oldGrid := range oldGridList { + if newGrid.GetGid() == oldGrid.GetGid() { + exist = true + break + } + } + if exist { + continue + } + addGridIdList = append(addGridIdList, newGrid.GetGid()) + } + activeAvatarId := world.GetPlayerActiveAvatarId(player) + activeWorldAvatar := world.GetPlayerWorldAvatar(player, activeAvatarId) + // 处理消失的格子 + for _, delGridId := range delGridIdList { + // 老格子移除玩家 + bigWorldAoi.RemoveObjectFromGrid(int64(player.PlayerID), delGridId) + // 通知自己 老格子里的其它玩家消失 + oldOtherWorldAvatarMap := bigWorldAoi.GetObjectListByGid(delGridId) delEntityIdList := make([]uint32, 0) for _, otherWorldAvatarAny := range oldOtherWorldAvatarMap { otherWorldAvatar := otherWorldAvatarAny.(*WorldAvatar) @@ -348,19 +360,22 @@ func (g *Game) AoiPlayerMove(player *model.Player, oldPos *model.Vector, newPos } delEntityIdList = append(delEntityIdList, otherWorldAvatar.GetAvatarEntityId()) } - // 通知自己 老格子里的其它玩家消失 g.RemoveSceneEntityNotifyToPlayer(player, proto.VisionType_VISION_MISS, delEntityIdList) + // 通知老格子里的其它玩家 自己消失 for otherPlayerId := range oldOtherWorldAvatarMap { if uint32(otherPlayerId) == player.PlayerID { continue } otherPlayer := USER_MANAGER.GetOnlineUser(uint32(otherPlayerId)) - // 通知老格子里的其它玩家 自己消失 - g.RemoveSceneEntityNotifyToPlayer(otherPlayer, proto.VisionType_VISION_MISS, []uint32{ - activeWorldAvatar.GetAvatarEntityId(), - }) + g.RemoveSceneEntityNotifyToPlayer(otherPlayer, proto.VisionType_VISION_MISS, []uint32{activeWorldAvatar.GetAvatarEntityId()}) } - newOtherWorldAvatarMap := world.bigWorldAoi.GetObjectListByPos(float32(newPos.X), float32(newPos.Y), float32(newPos.Z)) + } + // 处理出现的格子 + for _, addGridId := range addGridIdList { + // 新格子添加玩家 + bigWorldAoi.AddObjectToGrid(int64(player.PlayerID), activeWorldAvatar, addGridId) + // 通知自己 新格子里的其他玩家出现 + newOtherWorldAvatarMap := bigWorldAoi.GetObjectListByGid(addGridId) addEntityIdList := make([]uint32, 0) for _, otherWorldAvatarAny := range newOtherWorldAvatarMap { otherWorldAvatar := otherWorldAvatarAny.(*WorldAvatar) @@ -369,15 +384,14 @@ func (g *Game) AoiPlayerMove(player *model.Player, oldPos *model.Vector, newPos } addEntityIdList = append(addEntityIdList, otherWorldAvatar.GetAvatarEntityId()) } - // 通知自己 新格子里的其他玩家出现 g.AddSceneEntityNotify(player, proto.VisionType_VISION_MEET, addEntityIdList, false, false) + // 通知新格子里的其他玩家 自己出现 for otherPlayerId := range newOtherWorldAvatarMap { if uint32(otherPlayerId) == player.PlayerID { continue } otherPlayer := USER_MANAGER.GetOnlineUser(uint32(otherPlayerId)) sceneEntityInfoAvatar := g.PacketSceneEntityInfoAvatar(scene, player, world.GetPlayerActiveAvatarId(player)) - // 通知新格子里的其他玩家 自己出现 g.AddSceneEntityNotifyToPlayer(otherPlayer, proto.VisionType_VISION_MEET, []*proto.SceneEntityInfo{sceneEntityInfoAvatar}) } } @@ -402,6 +416,7 @@ func (g *Game) AbilityInvocationsNotify(player *model.Player, payloadMsg pb.Mess // logger.Debug("EntityId: %v, ModifierChange: %v", entry.EntityId, modifierChange) // 处理耐力消耗 g.HandleAbilityStamina(player, entry) + g.handleGadgetEntityAbilityLow(player, entry.EntityId, entry.ArgumentType, modifierChange) case proto.AbilityInvokeArgument_ABILITY_MIXIN_COST_STAMINA: costStamina := new(proto.AbilityMixinCostStamina) err := pb.Unmarshal(entry.AbilityData, costStamina) @@ -526,7 +541,11 @@ func (g *Game) EvtAvatarEnterFocusNotify(player *model.Player, payloadMsg pb.Mes } // logger.Debug("EvtAvatarEnterFocusNotify: %v", req) world := WORLD_MANAGER.GetWorldByID(player.WorldId) - g.SendToWorldA(world, cmd.EvtAvatarEnterFocusNotify, player.ClientSeq, req) + if world == nil { + return + } + scene := world.GetSceneById(player.SceneId) + g.SendToSceneA(scene, cmd.EvtAvatarEnterFocusNotify, player.ClientSeq, req) } func (g *Game) EvtAvatarUpdateFocusNotify(player *model.Player, payloadMsg pb.Message) { @@ -536,7 +555,11 @@ func (g *Game) EvtAvatarUpdateFocusNotify(player *model.Player, payloadMsg pb.Me } // logger.Debug("EvtAvatarUpdateFocusNotify: %v", req) world := WORLD_MANAGER.GetWorldByID(player.WorldId) - g.SendToWorldA(world, cmd.EvtAvatarUpdateFocusNotify, player.ClientSeq, req) + if world == nil { + return + } + scene := world.GetSceneById(player.SceneId) + g.SendToSceneA(scene, cmd.EvtAvatarUpdateFocusNotify, player.ClientSeq, req) } func (g *Game) EvtAvatarExitFocusNotify(player *model.Player, payloadMsg pb.Message) { @@ -546,7 +569,11 @@ func (g *Game) EvtAvatarExitFocusNotify(player *model.Player, payloadMsg pb.Mess } // logger.Debug("EvtAvatarExitFocusNotify: %v", req) world := WORLD_MANAGER.GetWorldByID(player.WorldId) - g.SendToWorldA(world, cmd.EvtAvatarExitFocusNotify, player.ClientSeq, req) + if world == nil { + return + } + scene := world.GetSceneById(player.SceneId) + g.SendToSceneA(scene, cmd.EvtAvatarExitFocusNotify, player.ClientSeq, req) } func (g *Game) EvtEntityRenderersChangedNotify(player *model.Player, payloadMsg pb.Message) { @@ -556,7 +583,11 @@ func (g *Game) EvtEntityRenderersChangedNotify(player *model.Player, payloadMsg } // logger.Debug("EvtEntityRenderersChangedNotify: %v", req) world := WORLD_MANAGER.GetWorldByID(player.WorldId) - g.SendToWorldA(world, cmd.EvtEntityRenderersChangedNotify, player.ClientSeq, req) + if world == nil { + return + } + scene := world.GetSceneById(player.SceneId) + g.SendToSceneA(scene, cmd.EvtEntityRenderersChangedNotify, player.ClientSeq, req) } func (g *Game) EvtCreateGadgetNotify(player *model.Player, payloadMsg pb.Message) { @@ -599,7 +630,7 @@ func (g *Game) EvtDestroyGadgetNotify(player *model.Player, payloadMsg pb.Messag } scene := world.GetSceneById(player.SceneId) scene.DestroyEntity(req.EntityId) - g.RemoveSceneEntityNotifyBroadcast(scene, proto.VisionType_VISION_MISS, []uint32{req.EntityId}, false, nil) + g.RemoveSceneEntityNotifyBroadcast(scene, proto.VisionType_VISION_MISS, []uint32{req.EntityId}, false, 0) } func (g *Game) EvtAiSyncSkillCdNotify(player *model.Player, payloadMsg pb.Message) { @@ -609,7 +640,11 @@ func (g *Game) EvtAiSyncSkillCdNotify(player *model.Player, payloadMsg pb.Messag } // logger.Debug("EvtAiSyncSkillCdNotify: %v", req) world := WORLD_MANAGER.GetWorldByID(player.WorldId) - g.SendToWorldA(world, cmd.EvtAiSyncSkillCdNotify, player.ClientSeq, req) + if world == nil { + return + } + scene := world.GetSceneById(player.SceneId) + g.SendToSceneA(scene, cmd.EvtAiSyncSkillCdNotify, player.ClientSeq, req) } func (g *Game) EvtAiSyncCombatThreatInfoNotify(player *model.Player, payloadMsg pb.Message) { @@ -619,7 +654,11 @@ func (g *Game) EvtAiSyncCombatThreatInfoNotify(player *model.Player, payloadMsg } // logger.Debug("EvtAiSyncCombatThreatInfoNotify: %v", req) world := WORLD_MANAGER.GetWorldByID(player.WorldId) - g.SendToWorldA(world, cmd.EvtAiSyncCombatThreatInfoNotify, player.ClientSeq, req) + if world == nil { + return + } + scene := world.GetSceneById(player.SceneId) + g.SendToSceneA(scene, cmd.EvtAiSyncCombatThreatInfoNotify, player.ClientSeq, req) } func (g *Game) EntityConfigHashNotify(player *model.Player, payloadMsg pb.Message) { @@ -651,3 +690,84 @@ func (g *Game) EntityAiSyncNotify(player *model.Player, payloadMsg pb.Message) { } g.SendMsg(cmd.EntityAiSyncNotify, player.PlayerID, player.ClientSeq, entityAiSyncNotify) } + +// TODO 一些很low的解决方案 我本来是不想写的 有多low?要多low有多low! + +func (g *Game) handleGadgetEntityBeHitLow(player *model.Player, entity *Entity, hitElementType uint32) { + if entity.GetEntityType() != constant.ENTITY_TYPE_GADGET { + return + } + gadgetEntity := entity.GetGadgetEntity() + gadgetId := gadgetEntity.GetGadgetId() + gadgetDataConfig := gdconf.GetGadgetDataById(int32(gadgetId)) + if gadgetDataConfig == nil { + logger.Error("get gadget data config is nil, gadgetId: %v", gadgetEntity.GetGadgetId()) + return + } + if strings.Contains(gadgetDataConfig.Name, "火把") || + strings.Contains(gadgetDataConfig.Name, "火盆") || + strings.Contains(gadgetDataConfig.Name, "篝火") { + // 火把点燃 + if hitElementType != constant.ELEMENT_TYPE_FIRE { + return + } + g.ChangeGadgetState(player, entity.GetId(), constant.GADGET_STATE_GEAR_START) + } else if strings.Contains(gadgetDataConfig.ServerLuaScript, "Controller") { + // 元素方碑点亮 + gadgetElementType := uint32(0) + if strings.Contains(gadgetDataConfig.ServerLuaScript, "Fire") { + gadgetElementType = constant.ELEMENT_TYPE_FIRE + } else if strings.Contains(gadgetDataConfig.ServerLuaScript, "Water") { + gadgetElementType = constant.ELEMENT_TYPE_WATER + } else if strings.Contains(gadgetDataConfig.ServerLuaScript, "Grass") { + gadgetElementType = constant.ELEMENT_TYPE_GRASS + } else if strings.Contains(gadgetDataConfig.ServerLuaScript, "Elec") { + gadgetElementType = constant.ELEMENT_TYPE_ELEC + } else if strings.Contains(gadgetDataConfig.ServerLuaScript, "Ice") { + gadgetElementType = constant.ELEMENT_TYPE_ICE + } else if strings.Contains(gadgetDataConfig.ServerLuaScript, "Wind") { + gadgetElementType = constant.ELEMENT_TYPE_WIND + } else if strings.Contains(gadgetDataConfig.ServerLuaScript, "Rock") { + gadgetElementType = constant.ELEMENT_TYPE_ROCK + } + if hitElementType != gadgetElementType { + return + } + g.ChangeGadgetState(player, entity.GetId(), constant.GADGET_STATE_GEAR_START) + } +} + +func (g *Game) handleGadgetEntityAbilityLow(player *model.Player, entityId uint32, argument proto.AbilityInvokeArgument, entry pb.Message) { + world := WORLD_MANAGER.GetWorldByID(player.WorldId) + if world == nil { + return + } + scene := world.GetSceneById(player.SceneId) + entity := scene.GetEntity(entityId) + switch argument { + case proto.AbilityInvokeArgument_ABILITY_META_MODIFIER_CHANGE: + // 物件破碎 + modifierChange := entry.(*proto.AbilityMetaModifierChange) + if modifierChange.Action != proto.ModifierAction_REMOVED { + return + } + logger.Debug("物件破碎, entityId: %v, modifierChange: %v, uid: %v", entityId, modifierChange, player.PlayerID) + if entity.GetEntityType() != constant.ENTITY_TYPE_GADGET { + return + } + gadgetEntity := entity.GetGadgetEntity() + gadgetId := gadgetEntity.GetGadgetId() + gadgetDataConfig := gdconf.GetGadgetDataById(int32(gadgetId)) + if gadgetDataConfig == nil { + logger.Error("get gadget data config is nil, gadgetId: %v", gadgetEntity.GetGadgetId()) + return + } + if strings.Contains(gadgetDataConfig.Name, "碎石堆") || + strings.Contains(gadgetDataConfig.ServerLuaScript, "SubfieldDrop_WoodenObject_Broken") { + g.KillEntity(player, scene, entity.GetId(), proto.PlayerDieType_PLAYER_DIE_GM) + } else if strings.Contains(gadgetDataConfig.ServerLuaScript, "SubfieldDrop_Ore") { + g.KillEntity(player, scene, entity.GetId(), proto.PlayerDieType_PLAYER_DIE_GM) + g.CreateDropGadget(player, entity.GetPos(), 70900001, 233, 1) + } + } +} diff --git a/gs/game/player_multiplayer.go b/gs/game/player_multiplayer.go index 164606f2..d7bccd5c 100644 --- a/gs/game/player_multiplayer.go +++ b/gs/game/player_multiplayer.go @@ -81,12 +81,8 @@ func (g *Game) JoinOtherWorld(player *model.Player, hostPlayer *model.Player) { player.SceneJump = true player.SceneId = hostPlayer.SceneId player.SceneLoadState = model.SceneNone - player.Pos.X = hostPlayer.Pos.X - player.Pos.Y = hostPlayer.Pos.Y - player.Pos.Z = hostPlayer.Pos.Z - player.Rot.X = hostPlayer.Rot.X - player.Rot.Y = hostPlayer.Rot.Y - player.Rot.Z = hostPlayer.Rot.Z + player.Pos.X, player.Pos.Y, player.Pos.Z = hostPlayer.Pos.X, hostPlayer.Pos.Y, hostPlayer.Pos.Z + player.Rot.X, player.Rot.Y, player.Rot.Z = hostPlayer.Rot.X, hostPlayer.Rot.Y, hostPlayer.Rot.Z g.UserWorldAddPlayer(hostWorld, player) playerEnterSceneNotify := g.PacketPlayerEnterSceneNotifyMp( @@ -415,7 +411,7 @@ func (g *Game) UserWorldRemovePlayer(world *World, player *model.Player) { g.SendMsg(cmd.PlayerQuitFromMpNotify, player.PlayerID, player.ClientSeq, playerQuitFromMpNotify) activeAvatarId := world.GetPlayerActiveAvatarId(player) - g.RemoveSceneEntityNotifyBroadcast(scene, proto.VisionType_VISION_REMOVE, []uint32{world.GetPlayerWorldAvatarEntityId(player, activeAvatarId)}, false, nil) + g.RemoveSceneEntityNotifyBroadcast(scene, proto.VisionType_VISION_REMOVE, []uint32{world.GetPlayerWorldAvatarEntityId(player, activeAvatarId)}, false, 0) } world.RemovePlayer(player) diff --git a/gs/game/player_scene.go b/gs/game/player_scene.go index 76ccd4b1..1c685426 100644 --- a/gs/game/player_scene.go +++ b/gs/game/player_scene.go @@ -217,10 +217,17 @@ func (g *Game) SceneInitFinishReq(player *model.Player, payloadMsg pb.Message) { g.UpdateWorldScenePlayerInfo(player, world) - g.GCGTavernInit(player) // GCG酒馆信息通知 - - g.SendMsg(cmd.DungeonWayPointNotify, player.PlayerID, player.ClientSeq, &proto.DungeonWayPointNotify{}) - g.SendMsg(cmd.DungeonDataNotify, player.PlayerID, player.ClientSeq, &proto.DungeonDataNotify{}) + ctx := world.GetEnterSceneContextByToken(req.EnterSceneToken) + if ctx == nil { + logger.Error("get enter scene context is nil, uid: %v", player.PlayerID) + return + } + // 进入的场景是地牢副本发送相关的包 + if ctx.OldDungeonPointId != 0 { + g.GCGTavernInit(player) // GCG酒馆信息通知 + g.SendMsg(cmd.DungeonWayPointNotify, player.PlayerID, player.ClientSeq, &proto.DungeonWayPointNotify{}) + g.SendMsg(cmd.DungeonDataNotify, player.PlayerID, player.ClientSeq, &proto.DungeonDataNotify{}) + } SceneInitFinishRsp := &proto.SceneInitFinishRsp{ EnterSceneToken: req.EnterSceneToken, @@ -245,9 +252,7 @@ func (g *Game) EnterSceneDoneReq(player *model.Player, payloadMsg pb.Message) { activeAvatarId := world.GetPlayerActiveAvatarId(player) activeWorldAvatar := world.GetPlayerWorldAvatar(player, activeAvatarId) - g.AddSceneEntityNotify(player, visionType, []uint32{ - activeWorldAvatar.GetAvatarEntityId(), - }, true, false) + g.AddSceneEntityNotify(player, visionType, []uint32{activeWorldAvatar.GetAvatarEntityId()}, true, false) // 加载附近的group for _, groupConfig := range g.GetNeighborGroup(scene.GetId(), player.Pos) { @@ -269,7 +274,8 @@ func (g *Game) EnterSceneDoneReq(player *model.Player, payloadMsg pb.Message) { } g.AddSceneEntityNotify(player, visionType, entityIdList, false, false) if WORLD_MANAGER.IsBigWorld(world) { - otherWorldAvatarMap := world.bigWorldAoi.GetObjectListByPos(float32(player.Pos.X), float32(player.Pos.Y), float32(player.Pos.Z)) + bigWorldAoi := world.GetBigWorldAoi() + otherWorldAvatarMap := bigWorldAoi.GetObjectListByPos(float32(player.Pos.X), float32(player.Pos.Y), float32(player.Pos.Z)) entityIdList := make([]uint32, 0) for _, otherWorldAvatarAny := range otherWorldAvatarMap { otherWorldAvatar := otherWorldAvatarAny.(*WorldAvatar) @@ -341,55 +347,53 @@ func (g *Game) SceneEntityDrownReq(player *model.Player, payloadMsg pb.Message) // AddSceneEntityNotifyToPlayer 添加的场景实体同步给玩家 func (g *Game) AddSceneEntityNotifyToPlayer(player *model.Player, visionType proto.VisionType, entityList []*proto.SceneEntityInfo) { - sceneEntityAppearNotify := &proto.SceneEntityAppearNotify{ + ntf := &proto.SceneEntityAppearNotify{ AppearType: visionType, EntityList: entityList, } - g.SendMsg(cmd.SceneEntityAppearNotify, player.PlayerID, player.ClientSeq, sceneEntityAppearNotify) - logger.Debug("SceneEntityAppearNotify, uid: %v, type: %v, len: %v", - player.PlayerID, sceneEntityAppearNotify.AppearType, len(sceneEntityAppearNotify.EntityList)) + logger.Debug("[SceneEntityAppearNotify UC], type: %v, len: %v, uid: %v", ntf.AppearType, len(ntf.EntityList), player.PlayerID) + g.SendMsg(cmd.SceneEntityAppearNotify, player.PlayerID, player.ClientSeq, ntf) } // AddSceneEntityNotifyBroadcast 添加的场景实体广播 -func (g *Game) AddSceneEntityNotifyBroadcast(scene *Scene, visionType proto.VisionType, entityList []*proto.SceneEntityInfo, aec bool, player *model.Player) { - sceneEntityAppearNotify := &proto.SceneEntityAppearNotify{ +func (g *Game) AddSceneEntityNotifyBroadcast(scene *Scene, visionType proto.VisionType, entityList []*proto.SceneEntityInfo, aec bool, aecUid uint32) { + ntf := &proto.SceneEntityAppearNotify{ AppearType: visionType, EntityList: entityList, } - for _, scenePlayer := range scene.GetAllPlayer() { - if aec && scenePlayer.PlayerID == player.PlayerID { - continue - } - g.SendMsg(cmd.SceneEntityAppearNotify, scenePlayer.PlayerID, scenePlayer.ClientSeq, sceneEntityAppearNotify) - logger.Debug("SceneEntityAppearNotify, uid: %v, type: %v, len: %v", - scenePlayer.PlayerID, sceneEntityAppearNotify.AppearType, len(sceneEntityAppearNotify.EntityList)) + world := scene.GetWorld() + owner := world.GetOwner() + logger.Debug("[SceneEntityAppearNotify BC], type: %v, len: %v, uid: %v, aec: %v", ntf.AppearType, len(ntf.EntityList), owner.PlayerID, aec) + if aec { + g.SendToSceneAEC(scene, cmd.SceneEntityAppearNotify, owner.ClientSeq, ntf, aecUid) + } else { + g.SendToSceneA(scene, cmd.SceneEntityAppearNotify, owner.ClientSeq, ntf) } } // RemoveSceneEntityNotifyToPlayer 移除的场景实体同步给玩家 func (g *Game) RemoveSceneEntityNotifyToPlayer(player *model.Player, visionType proto.VisionType, entityIdList []uint32) { - sceneEntityDisappearNotify := &proto.SceneEntityDisappearNotify{ + ntf := &proto.SceneEntityDisappearNotify{ EntityList: entityIdList, DisappearType: visionType, } - g.SendMsg(cmd.SceneEntityDisappearNotify, player.PlayerID, player.ClientSeq, sceneEntityDisappearNotify) - logger.Debug("SceneEntityDisappearNotify, uid: %v, type: %v, len: %v", - player.PlayerID, sceneEntityDisappearNotify.DisappearType, len(sceneEntityDisappearNotify.EntityList)) + logger.Debug("[SceneEntityDisappearNotify UC], type: %v, len: %v, uid: %v", ntf.DisappearType, len(ntf.EntityList), player.PlayerID) + g.SendMsg(cmd.SceneEntityDisappearNotify, player.PlayerID, player.ClientSeq, ntf) } // RemoveSceneEntityNotifyBroadcast 移除的场景实体广播 -func (g *Game) RemoveSceneEntityNotifyBroadcast(scene *Scene, visionType proto.VisionType, entityIdList []uint32, aec bool, player *model.Player) { - sceneEntityDisappearNotify := &proto.SceneEntityDisappearNotify{ +func (g *Game) RemoveSceneEntityNotifyBroadcast(scene *Scene, visionType proto.VisionType, entityIdList []uint32, aec bool, aecUid uint32) { + ntf := &proto.SceneEntityDisappearNotify{ EntityList: entityIdList, DisappearType: visionType, } - for _, scenePlayer := range scene.GetAllPlayer() { - if aec && scenePlayer.PlayerID == player.PlayerID { - continue - } - g.SendMsg(cmd.SceneEntityDisappearNotify, scenePlayer.PlayerID, scenePlayer.ClientSeq, sceneEntityDisappearNotify) - logger.Debug("SceneEntityDisappearNotify, uid: %v, type: %v, len: %v", - scenePlayer.PlayerID, sceneEntityDisappearNotify.DisappearType, len(sceneEntityDisappearNotify.EntityList)) + world := scene.GetWorld() + owner := world.GetOwner() + logger.Debug("[SceneEntityDisappearNotify BC], type: %v, len: %v, uid: %v, aec: %v", ntf.DisappearType, len(ntf.EntityList), owner.PlayerID, aec) + if aec { + g.SendToSceneAEC(scene, cmd.SceneEntityDisappearNotify, owner.ClientSeq, ntf, aecUid) + } else { + g.SendToSceneA(scene, cmd.SceneEntityDisappearNotify, owner.ClientSeq, ntf) } } @@ -445,7 +449,7 @@ func (g *Game) AddSceneEntityNotify(player *model.Player, visionType proto.Visio } } if broadcast { - g.AddSceneEntityNotifyBroadcast(scene, visionType, entityList, aec, player) + g.AddSceneEntityNotifyBroadcast(scene, visionType, entityList, aec, player.PlayerID) } else { g.AddSceneEntityNotifyToPlayer(player, visionType, entityList) } @@ -453,12 +457,12 @@ func (g *Game) AddSceneEntityNotify(player *model.Player, visionType proto.Visio } // EntityFightPropUpdateNotifyBroadcast 场景实体战斗属性变更通知广播 -func (g *Game) EntityFightPropUpdateNotifyBroadcast(world *World, entity *Entity) { +func (g *Game) EntityFightPropUpdateNotifyBroadcast(scene *Scene, entity *Entity) { ntf := &proto.EntityFightPropUpdateNotify{ FightPropMap: entity.GetFightProp(), EntityId: entity.GetId(), } - g.SendToWorldA(world, cmd.EntityFightPropUpdateNotify, 0, ntf) + g.SendToSceneA(scene, cmd.EntityFightPropUpdateNotify, 0, ntf) } // KillPlayerAvatar 杀死玩家活跃角色实体 @@ -514,7 +518,7 @@ func (g *Game) RevivePlayerAvatar(player *model.Player) { avatar.LifeState = constant.LIFE_STATE_ALIVE // 设置血量 avatar.FightPropMap[constant.FIGHT_PROP_CUR_HP] = 110 - g.EntityFightPropUpdateNotifyBroadcast(world, avatarEntity) + g.EntityFightPropUpdateNotifyBroadcast(scene, avatarEntity) avatarEntity.lifeState = constant.LIFE_STATE_REVIVE @@ -536,7 +540,7 @@ func (g *Game) KillEntity(player *model.Player, scene *Scene, entityId uint32, d if entity.GetEntityType() == constant.ENTITY_TYPE_MONSTER { // 设置血量 entity.fightProp[constant.FIGHT_PROP_CUR_HP] = 0 - g.EntityFightPropUpdateNotifyBroadcast(scene.world, entity) + g.EntityFightPropUpdateNotifyBroadcast(scene, entity) // 随机掉落 g.monsterDrop(player, entity) } @@ -547,8 +551,8 @@ func (g *Game) KillEntity(player *model.Player, scene *Scene, entityId uint32, d DieType: dieType, MoveReliableSeq: entity.GetLastMoveReliableSeq(), } - g.SendToWorldA(scene.world, cmd.LifeStateChangeNotify, 0, ntf) - g.RemoveSceneEntityNotifyBroadcast(scene, proto.VisionType_VISION_DIE, []uint32{entity.GetId()}, false, nil) + g.SendToSceneA(scene, cmd.LifeStateChangeNotify, 0, ntf) + g.RemoveSceneEntityNotifyBroadcast(scene, proto.VisionType_VISION_DIE, []uint32{entity.GetId()}, false, 0) // 删除实体 scene.DestroyEntity(entity.GetId()) group := scene.GetGroupById(entity.GetGroupId()) diff --git a/gs/game/player_team.go b/gs/game/player_team.go index 168d4cbc..d3f29141 100644 --- a/gs/game/player_team.go +++ b/gs/game/player_team.go @@ -54,9 +54,7 @@ func (g *Game) ChangeAvatarReq(player *model.Player, payloadMsg pb.Message) { DisappearType: proto.VisionType_VISION_REPLACE, EntityList: []uint32{oldAvatarEntity.GetId()}, } - for _, scenePlayer := range scene.GetAllPlayer() { - g.SendMsg(cmd.SceneEntityDisappearNotify, scenePlayer.PlayerID, scenePlayer.ClientSeq, sceneEntityDisappearNotify) - } + g.SendToSceneA(scene, cmd.SceneEntityDisappearNotify, player.ClientSeq, sceneEntityDisappearNotify) newAvatarId := world.GetPlayerActiveAvatarId(player) newAvatarEntity := g.PacketSceneEntityInfoAvatar(scene, player, newAvatarId) @@ -65,9 +63,7 @@ func (g *Game) ChangeAvatarReq(player *model.Player, payloadMsg pb.Message) { Param: oldAvatarEntity.GetId(), EntityList: []*proto.SceneEntityInfo{newAvatarEntity}, } - for _, scenePlayer := range scene.GetAllPlayer() { - g.SendMsg(cmd.SceneEntityAppearNotify, scenePlayer.PlayerID, scenePlayer.ClientSeq, sceneEntityAppearNotify) - } + g.SendToSceneA(scene, cmd.SceneEntityAppearNotify, player.ClientSeq, sceneEntityAppearNotify) changeAvatarRsp := &proto.ChangeAvatarRsp{ CurGuid: targetAvatarGuid, @@ -214,10 +210,8 @@ func (g *Game) ChangeMpTeamAvatarReq(player *model.Player, payloadMsg pb.Message newAvatarIndex := world.GetPlayerAvatarIndexByAvatarId(player, currAvatarId) world.SetPlayerAvatarIndex(player, newAvatarIndex) - for _, worldPlayer := range world.GetAllPlayer() { - sceneTeamUpdateNotify := g.PacketSceneTeamUpdateNotify(world, player) - g.SendMsg(cmd.SceneTeamUpdateNotify, worldPlayer.PlayerID, worldPlayer.ClientSeq, sceneTeamUpdateNotify) - } + sceneTeamUpdateNotify := g.PacketSceneTeamUpdateNotify(world, player) + g.SendToWorldA(world, cmd.SceneTeamUpdateNotify, player.ClientSeq, sceneTeamUpdateNotify) changeMpTeamAvatarRsp := &proto.ChangeMpTeamAvatarRsp{ CurAvatarGuid: req.CurAvatarGuid, @@ -278,65 +272,47 @@ func (g *Game) PacketSceneTeamUpdateNotify(world *World, player *model.Player) * sceneTeamAvatar.AvatarInfo = g.PacketAvatarInfo(worldPlayerAvatar) sceneTeamAvatar.SceneAvatarInfo = g.PacketSceneAvatarInfo(worldPlayerScene, worldPlayer, worldAvatar.GetAvatarId()) } - // add AbilityControlBlock + // 角色的ability控制块 acb := sceneTeamAvatar.AbilityControlBlock - embryoId := 0 - // add avatar abilities + abilityId := 0 + // 默认ability + for _, abilityHashCode := range constant.DEFAULT_ABILITY_HASH_CODE { + abilityId++ + ae := &proto.AbilityEmbryo{ + AbilityId: uint32(abilityId), + AbilityNameHash: uint32(abilityHashCode), + AbilityOverrideNameHash: uint32(endec.Hk4eAbilityHashCode("Default")), + } + acb.AbilityEmbryoList = append(acb.AbilityEmbryoList, ae) + } + // 角色ability avatarDataConfig := gdconf.GetAvatarDataById(int32(worldAvatar.GetAvatarId())) if avatarDataConfig != nil { - for _, abilityId := range avatarDataConfig.AbilityHashCodeList { - embryoId++ - emb := &proto.AbilityEmbryo{ - AbilityId: uint32(embryoId), - AbilityNameHash: uint32(abilityId), - AbilityOverrideNameHash: uint32(constant.DEFAULT_ABILITY_NAME), + for _, abilityHashCode := range avatarDataConfig.AbilityHashCodeList { + abilityId++ + ae := &proto.AbilityEmbryo{ + AbilityId: uint32(abilityId), + AbilityNameHash: uint32(abilityHashCode), + AbilityOverrideNameHash: uint32(endec.Hk4eAbilityHashCode("Default")), } - acb.AbilityEmbryoList = append(acb.AbilityEmbryoList, emb) + acb.AbilityEmbryoList = append(acb.AbilityEmbryoList, ae) } } - // add default abilities - for _, abilityId := range constant.DEFAULT_ABILITY_HASHES { - embryoId++ - emb := &proto.AbilityEmbryo{ - AbilityId: uint32(embryoId), - AbilityNameHash: uint32(abilityId), - AbilityOverrideNameHash: uint32(constant.DEFAULT_ABILITY_NAME), - } - acb.AbilityEmbryoList = append(acb.AbilityEmbryoList, emb) - } - // // add team resonances - // for id := range worldPlayer.TeamConfig.TeamResonancesConfig { - // embryoId++ - // emb := &proto.AbilityEmbryo{ - // AbilityId: uint32(embryoId), - // AbilityNameHash: uint32(id), - // AbilityOverrideNameHash: uint32(constant.GameConstantConst.DEFAULT_ABILITY_NAME), - // } - // acb.AbilityEmbryoList = append(acb.AbilityEmbryoList, emb) - // } - // add skill depot abilities + // 技能库ability skillDepot := gdconf.GetAvatarSkillDepotDataById(int32(worldPlayerAvatar.SkillDepotId)) if skillDepot != nil && len(skillDepot.AbilityHashCodeList) != 0 { - for _, id := range skillDepot.AbilityHashCodeList { - embryoId++ - emb := &proto.AbilityEmbryo{ - AbilityId: uint32(embryoId), - AbilityNameHash: uint32(id), - AbilityOverrideNameHash: uint32(constant.DEFAULT_ABILITY_NAME), + for _, abilityHashCode := range skillDepot.AbilityHashCodeList { + abilityId++ + ae := &proto.AbilityEmbryo{ + AbilityId: uint32(abilityId), + AbilityNameHash: uint32(abilityHashCode), + AbilityOverrideNameHash: uint32(endec.Hk4eAbilityHashCode("Default")), } - acb.AbilityEmbryoList = append(acb.AbilityEmbryoList, emb) + acb.AbilityEmbryoList = append(acb.AbilityEmbryoList, ae) } } - // add equip abilities - for skill := range worldPlayerAvatar.ExtraAbilityEmbryos { - embryoId++ - emb := &proto.AbilityEmbryo{ - AbilityId: uint32(embryoId), - AbilityNameHash: uint32(endec.Hk4eAbilityHashCode(skill)), - AbilityOverrideNameHash: uint32(constant.DEFAULT_ABILITY_NAME), - } - acb.AbilityEmbryoList = append(acb.AbilityEmbryoList, emb) - } + // TODO 队伍ability + // TODO 装备ability sceneTeamUpdateNotify.SceneTeamAvatarList = append(sceneTeamUpdateNotify.SceneTeamAvatarList, sceneTeamAvatar) } return sceneTeamUpdateNotify diff --git a/gs/game/player_vehicle.go b/gs/game/player_vehicle.go index a35a716e..4f2a280c 100644 --- a/gs/game/player_vehicle.go +++ b/gs/game/player_vehicle.go @@ -120,7 +120,7 @@ func (g *Game) DestroyVehicleEntity(player *model.Player, scene *Scene, vehicleI } // 删除已创建的载具 scene.DestroyEntity(entity.GetId()) - g.RemoveSceneEntityNotifyBroadcast(scene, proto.VisionType_VISION_MISS, []uint32{entity.GetId()}, false, nil) + g.RemoveSceneEntityNotifyBroadcast(scene, proto.VisionType_VISION_MISS, []uint32{entity.GetId()}, false, 0) } // EnterVehicle 进入载具 diff --git a/gs/game/player_world.go b/gs/game/player_world.go index d1b16c53..aa756d0b 100644 --- a/gs/game/player_world.go +++ b/gs/game/player_world.go @@ -501,11 +501,7 @@ func (g *Game) TeleportPlayer( // 传送玩家 newSceneId := sceneId oldSceneId := player.SceneId - oldPos := &model.Vector{ - X: player.Pos.X, - Y: player.Pos.Y, - Z: player.Pos.Z, - } + oldPos := &model.Vector{X: player.Pos.X, Y: player.Pos.Y, Z: player.Pos.Z} jumpScene := false if newSceneId != oldSceneId { jumpScene = true @@ -518,7 +514,7 @@ func (g *Game) TeleportPlayer( return } activeAvatarId := world.GetPlayerActiveAvatarId(player) - g.RemoveSceneEntityNotifyBroadcast(oldScene, proto.VisionType_VISION_REMOVE, []uint32{world.GetPlayerWorldAvatarEntityId(player, activeAvatarId)}, false, nil) + g.RemoveSceneEntityNotifyBroadcast(oldScene, proto.VisionType_VISION_REMOVE, []uint32{world.GetPlayerWorldAvatarEntityId(player, activeAvatarId)}, false, 0) if jumpScene { delTeamEntityNotify := g.PacketDelTeamEntityNotify(oldScene, player) g.SendMsg(cmd.DelTeamEntityNotify, player.PlayerID, player.ClientSeq, delTeamEntityNotify) @@ -533,12 +529,8 @@ func (g *Game) TeleportPlayer( 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 + player.Pos.X, player.Pos.Y, player.Pos.Z = pos.X, pos.Y, pos.Z + player.Rot.X, player.Rot.Y, player.Rot.Z = rot.X, rot.Y, rot.Z var enterType proto.EnterType if jumpScene { diff --git a/gs/model/db_avatar.go b/gs/model/db_avatar.go index 66b07c93..e5f5f335 100644 --- a/gs/model/db_avatar.go +++ b/gs/model/db_avatar.go @@ -23,30 +23,29 @@ func (p *Player) GetDbAvatar() *DbAvatar { } type Avatar struct { - AvatarId uint32 // 角色id - LifeState uint16 // 存活状态 - Level uint8 // 等级 - Exp uint32 // 经验值 - Promote uint8 // 突破等阶 - Satiation uint32 // 饱食度 - SatiationPenalty uint32 // 饱食度溢出 - CurrHP float64 // 当前生命值 - CurrEnergy float64 // 当前元素能量值 - FetterList []uint32 // 资料解锁条目 - SkillLevelMap map[uint32]uint32 // 技能等级数据 - SkillDepotId uint32 // 技能库id - FlyCloak uint32 // 当前风之翼 - Costume uint32 // 当前衣装 - BornTime int64 // 获得时间 - FetterLevel uint8 // 好感度等级 - FetterExp uint32 // 好感度经验 - PromoteRewardMap map[uint32]bool // 突破奖励 map[突破等级]是否已被领取 - Guid uint64 `bson:"-" msgpack:"-"` - EquipGuidMap map[uint64]uint64 `bson:"-" msgpack:"-"` - EquipWeapon *Weapon `bson:"-" msgpack:"-"` - EquipReliquaryMap map[uint8]*Reliquary `bson:"-" msgpack:"-"` - FightPropMap map[uint32]float32 `bson:"-" msgpack:"-"` - ExtraAbilityEmbryos map[string]bool `bson:"-" msgpack:"-"` + AvatarId uint32 // 角色id + LifeState uint16 // 存活状态 + Level uint8 // 等级 + Exp uint32 // 经验值 + Promote uint8 // 突破等阶 + Satiation uint32 // 饱食度 + SatiationPenalty uint32 // 饱食度溢出 + CurrHP float64 // 当前生命值 + CurrEnergy float64 // 当前元素能量值 + FetterList []uint32 // 资料解锁条目 + SkillLevelMap map[uint32]uint32 // 技能等级数据 + SkillDepotId uint32 // 技能库id + FlyCloak uint32 // 当前风之翼 + Costume uint32 // 当前衣装 + BornTime int64 // 获得时间 + FetterLevel uint8 // 好感度等级 + FetterExp uint32 // 好感度经验 + PromoteRewardMap map[uint32]bool // 突破奖励 map[突破等级]是否已被领取 + Guid uint64 `bson:"-" msgpack:"-"` + EquipGuidMap map[uint64]uint64 `bson:"-" msgpack:"-"` + EquipWeapon *Weapon `bson:"-" msgpack:"-"` + EquipReliquaryMap map[uint8]*Reliquary `bson:"-" msgpack:"-"` + FightPropMap map[uint32]float32 `bson:"-" msgpack:"-"` } func (a *DbAvatar) InitAllAvatar(player *Player) { @@ -115,30 +114,29 @@ func (a *DbAvatar) AddAvatar(player *Player, avatarId uint32) { return } avatar := &Avatar{ - AvatarId: avatarId, - LifeState: constant.LIFE_STATE_ALIVE, - Level: 1, - Exp: 0, - Promote: 0, - Satiation: 0, - SatiationPenalty: 0, - CurrHP: 0, - CurrEnergy: 0, - FetterList: make([]uint32, 0), - SkillLevelMap: make(map[uint32]uint32), - SkillDepotId: uint32(skillDepotId), - FlyCloak: 140001, - Costume: 0, - BornTime: time.Now().Unix(), - FetterLevel: 1, - FetterExp: 0, - Guid: 0, - EquipGuidMap: nil, - EquipWeapon: nil, - EquipReliquaryMap: nil, - FightPropMap: nil, - ExtraAbilityEmbryos: make(map[string]bool), - PromoteRewardMap: make(map[uint32]bool, len(avatarDataConfig.PromoteRewardMap)), + AvatarId: avatarId, + LifeState: constant.LIFE_STATE_ALIVE, + Level: 1, + Exp: 0, + Promote: 0, + Satiation: 0, + SatiationPenalty: 0, + CurrHP: 0, + CurrEnergy: 0, + FetterList: make([]uint32, 0), + SkillLevelMap: make(map[uint32]uint32), + SkillDepotId: uint32(skillDepotId), + FlyCloak: 140001, + Costume: 0, + BornTime: time.Now().Unix(), + FetterLevel: 1, + FetterExp: 0, + Guid: 0, + EquipGuidMap: nil, + EquipWeapon: nil, + EquipReliquaryMap: nil, + FightPropMap: nil, + PromoteRewardMap: make(map[uint32]bool, len(avatarDataConfig.PromoteRewardMap)), } // 元素爆发1级 @@ -176,16 +174,12 @@ func (a *DbAvatar) SetCurrEnergy(avatar *Avatar, value float64, max bool) { logger.Error("get avatar energy skill is nil, avatarId: %v", avatar.AvatarId) return } - elementType := constant.ElementTypeConst.VALUE_MAP[uint16(avatarSkillDataConfig.CostElemType)] - if elementType == nil { - logger.Error("get element type const is nil, value: %v", avatarSkillDataConfig.CostElemType) - return - } - avatar.FightPropMap[uint32(elementType.MaxEnergyProp)] = float32(avatarSkillDataConfig.CostElemVal) + fightPropEnergy := constant.ELEMENT_TYPE_FIGHT_PROP_ENERGY_MAP[int(avatarSkillDataConfig.CostElemType)] + avatar.FightPropMap[uint32(fightPropEnergy.MaxEnergy)] = float32(avatarSkillDataConfig.CostElemVal) if max { - avatar.FightPropMap[uint32(elementType.CurrEnergyProp)] = float32(avatarSkillDataConfig.CostElemVal) + avatar.FightPropMap[uint32(fightPropEnergy.CurEnergy)] = float32(avatarSkillDataConfig.CostElemVal) } else { - avatar.FightPropMap[uint32(elementType.CurrEnergyProp)] = float32(value) + avatar.FightPropMap[uint32(fightPropEnergy.CurEnergy)] = float32(value) } } diff --git a/gs/model/db_team.go b/gs/model/db_team.go index a93db526..087fbfb0 100644 --- a/gs/model/db_team.go +++ b/gs/model/db_team.go @@ -1,11 +1,5 @@ package model -import ( - "hk4e/common/constant" - "hk4e/gdconf" - "hk4e/pkg/logger" -) - type Team struct { Name string AvatarIdList []uint32 @@ -61,40 +55,6 @@ func NewDbTeam() (r *DbTeam) { return r } -func (t *DbTeam) UpdateTeam() { - activeTeam := t.GetActiveTeam() - // TODO 队伍元素共鸣 - t.TeamResonances = make(map[uint16]bool) - t.TeamResonancesConfig = make(map[int32]bool) - teamElementTypeCountMap := make(map[uint16]uint8) - for _, avatarId := range activeTeam.GetAvatarIdList() { - avatarSkillDataConfig := gdconf.GetAvatarEnergySkillConfig(avatarId) - if avatarSkillDataConfig == nil { - logger.Error("get avatar energy skill is nil, avatarId: %v", avatarId) - continue - } - elementType := constant.ElementTypeConst.VALUE_MAP[uint16(avatarSkillDataConfig.CostElemType)] - if elementType == nil { - logger.Error("get element type const is nil, value: %v", avatarSkillDataConfig.CostElemType) - continue - } - teamElementTypeCountMap[elementType.Value] += 1 - } - for k, v := range teamElementTypeCountMap { - if v >= 2 { - element := constant.ElementTypeConst.VALUE_MAP[k] - if element.TeamResonanceId != 0 { - t.TeamResonances[element.TeamResonanceId] = true - t.TeamResonancesConfig[element.ConfigHash] = true - } - } - } - if len(t.TeamResonances) == 0 { - t.TeamResonances[constant.ElementTypeConst.Default.TeamResonanceId] = true - t.TeamResonancesConfig[int32(constant.ElementTypeConst.Default.TeamResonanceId)] = true - } -} - func (t *DbTeam) GetActiveTeamId() uint8 { return t.CurrTeamIndex + 1 } diff --git a/pkg/alg/aoi.go b/pkg/alg/aoi.go index ac50d651..3c249286 100644 --- a/pkg/alg/aoi.go +++ b/pkg/alg/aoi.go @@ -244,6 +244,11 @@ func NewGrid(gid uint32, minX, maxX, minY, maxY, minZ, maxZ int16) (r *Grid) { return r } +// GetGid 获取格子id +func (g *Grid) GetGid() uint32 { + return g.gid +} + // AddObject 向格子中添加一个对象 func (g *Grid) AddObject(objectId int64, object any) { g.objectMap[objectId] = object