场景LUA触发器

This commit is contained in:
flswld
2023-03-02 19:32:29 +08:00
parent a7b3f41839
commit 58b98f189d
45 changed files with 1044 additions and 878 deletions

View File

@@ -1,177 +0,0 @@
package constant
const (
ActionReasonNone uint16 = 0
ActionReasonQuestItem uint16 = 1
ActionReasonQuestReward uint16 = 2
ActionReasonTrifle uint16 = 3
ActionReasonShop uint16 = 4
ActionReasonPlayerUpgradeReward uint16 = 5
ActionReasonAddAvatar uint16 = 6
ActionReasonGadgetEnvAnimal uint16 = 7
ActionReasonMonsterEnvAnimal uint16 = 8
ActionReasonCompound uint16 = 9
ActionReasonCook uint16 = 10
ActionReasonGather uint16 = 11
ActionReasonMailAttachment uint16 = 12
ActionReasonCityLevelupReturn uint16 = 15
ActionReasonCityLevelupReward uint16 = 17
ActionReasonAreaExploreReward uint16 = 18
ActionReasonUnlockPointReward uint16 = 19
ActionReasonDungeonFirstPass uint16 = 20
ActionReasonDungeonPass uint16 = 21
ActionReasonChangeElemType uint16 = 23
ActionReasonFetterOpen uint16 = 25
ActionReasonDailyTaskScore uint16 = 26
ActionReasonDailyTaskHost uint16 = 27
ActionReasonRandTaskHost uint16 = 28
ActionReasonExpedition uint16 = 29
ActionReasonGacha uint16 = 30
ActionReasonCombine uint16 = 31
ActionReasonRandTaskGuest uint16 = 32
ActionReasonDailyTaskGuest uint16 = 33
ActionReasonForgeOutput uint16 = 34
ActionReasonForgeReturn uint16 = 35
ActionReasonInitAvatar uint16 = 36
ActionReasonMonsterDie uint16 = 37
ActionReasonGm uint16 = 38
ActionReasonOpenChest uint16 = 39
ActionReasonGadgetDie uint16 = 40
ActionReasonMonsterChangeHp uint16 = 41
ActionReasonSubfieldDrop uint16 = 42
ActionReasonPushTipsReward uint16 = 43
ActionReasonActivityMonsterDrop uint16 = 44
ActionReasonActivityGather uint16 = 45
ActionReasonActivitySubfieldDrop uint16 = 46
ActionReasonTowerScheduleReward uint16 = 47
ActionReasonTowerFloorStarReward uint16 = 48
ActionReasonTowerFirstPassReward uint16 = 49
ActionReasonTowerDailyReward uint16 = 50
ActionReasonHitClientTrivialEntity uint16 = 51
ActionReasonOpenWorldBossChest uint16 = 52
ActionReasonMaterialDeleteReturn uint16 = 53
ActionReasonSignInReward uint16 = 54
ActionReasonOpenBlossomChest uint16 = 55
ActionReasonRecharge uint16 = 56
ActionReasonBonusActivityReward uint16 = 57
ActionReasonTowerCommemorativeReward uint16 = 58
ActionReasonTowerSkipFloorReward uint16 = 59
ActionReasonRechargeBonus uint16 = 60
ActionReasonRechargeCard uint16 = 61
ActionReasonRechargeCardDaily uint16 = 62
ActionReasonRechargeCardReplace uint16 = 63
ActionReasonRechargeCardReplaceFree uint16 = 64
ActionReasonRechargePlayReplace uint16 = 65
ActionReasonMpPlayTakeReward uint16 = 66
ActionReasonActivityWatcher uint16 = 67
ActionReasonSalesmanDeliverItem uint16 = 68
ActionReasonSalesmanReward uint16 = 69
ActionReasonRebate uint16 = 70
ActionReasonMcoinExchangeHcoin uint16 = 71
ActionReasonDailyTaskExchangeLegendaryKey uint16 = 72
ActionReasonUnlockPersonLine uint16 = 73
ActionReasonFetterLevelReward uint16 = 74
ActionReasonBuyResin uint16 = 75
ActionReasonRechargePackage uint16 = 76
ActionReasonDeliveryDailyReward uint16 = 77
ActionReasonCityReputationLevel uint16 = 78
ActionReasonCityReputationQuest uint16 = 79
ActionReasonCityReputationRequest uint16 = 80
ActionReasonCityReputationExplore uint16 = 81
ActionReasonOffergingLevel uint16 = 82
ActionReasonRoutineHost uint16 = 83
ActionReasonRoutineGuest uint16 = 84
ActionReasonTreasureMapSpotToken uint16 = 89
ActionReasonTreasureMapBonusLevelReward uint16 = 90
ActionReasonTreasureMapMpReward uint16 = 91
ActionReasonConvert uint16 = 92
ActionReasonOverflowTransform uint16 = 93
ActionReasonActivityAvatarSelectionReward uint16 = 96
ActionReasonActivityWatcherBatch uint16 = 97
ActionReasonHitTreeDrop uint16 = 98
ActionReasonGetHomeLevelupReward uint16 = 99
ActionReasonHomeDefaultFurniture uint16 = 100
ActionReasonActivityCond uint16 = 101
ActionReasonBattlePassNotify uint16 = 102
ActionReasonPlayerUseItem uint16 = 1001
ActionReasonDropItem uint16 = 1002
ActionReasonWeaponUpgrade uint16 = 1011
ActionReasonWeaponPromote uint16 = 1012
ActionReasonWeaponAwaken uint16 = 1013
ActionReasonRelicUpgrade uint16 = 1014
ActionReasonAbility uint16 = 1015
ActionReasonDungeonStatueDrop uint16 = 1016
ActionReasonOfflineMsg uint16 = 1017
ActionReasonAvatarUpgrade uint16 = 1018
ActionReasonAvatarPromote uint16 = 1019
ActionReasonQuestAction uint16 = 1021
ActionReasonCityLevelup uint16 = 1022
ActionReasonUpgradeSkill uint16 = 1024
ActionReasonUnlockTalent uint16 = 1025
ActionReasonUpgradeProudSkill uint16 = 1026
ActionReasonPlayerLevelLimitUp uint16 = 1027
ActionReasonDungeonDaily uint16 = 1028
ActionReasonItemGiving uint16 = 1030
ActionReasonForgeCost uint16 = 1031
ActionReasonInvestigationReward uint16 = 1032
ActionReasonInvestigationTargetReward uint16 = 1033
ActionReasonGadgetInteract uint16 = 1034
ActionReasonSeaLampCiMaterial uint16 = 1036
ActionReasonSeaLampContributionReward uint16 = 1037
ActionReasonSeaLampPhaseReward uint16 = 1038
ActionReasonSeaLampFlyLamp uint16 = 1039
ActionReasonAutoRecover uint16 = 1040
ActionReasonActivityExpireItem uint16 = 1041
ActionReasonSubCoinNegative uint16 = 1042
ActionReasonBargainDeduct uint16 = 1043
ActionReasonBattlePassPaidReward uint16 = 1044
ActionReasonBattlePassLevelReward uint16 = 1045
ActionReasonTrialAvatarActivityFirstPassReward uint16 = 1046
ActionReasonBuyBattlePassLevel uint16 = 1047
ActionReasonGrantBirthdayBenefit uint16 = 1048
ActionReasonAchievementReward uint16 = 1049
ActionReasonAchievementGoalReward uint16 = 1050
ActionReasonFirstShareToSocialNetwork uint16 = 1051
ActionReasonDestroyMaterial uint16 = 1052
ActionReasonCodexLevelupReward uint16 = 1053
ActionReasonHuntingOfferReward uint16 = 1054
ActionReasonUseWidgetAnchorPoint uint16 = 1055
ActionReasonUseWidgetBonfire uint16 = 1056
ActionReasonUngradeWeaponReturnMaterial uint16 = 1057
ActionReasonUseWidgetOneoffGatherPointDetector uint16 = 1058
ActionReasonUseWidgetClientCollector uint16 = 1059
ActionReasonUseWidgetClientDetector uint16 = 1060
ActionReasonTakeGeneralReward uint16 = 1061
ActionReasonAsterTakeSpecialReward uint16 = 1062
ActionReasonRemoveCodexBook uint16 = 1063
ActionReasonOfferingItem uint16 = 1064
ActionReasonUseWidgetGadgetBuilder uint16 = 1065
ActionReasonEffigyFirstPassReward uint16 = 1066
ActionReasonEffigyReward uint16 = 1067
ActionReasonReunionFirstGiftReward uint16 = 1068
ActionReasonReunionSignInReward uint16 = 1069
ActionReasonReunionWatcherReward uint16 = 1070
ActionReasonSalesmanMpReward uint16 = 1071
ActionReasonActionReasionAvatarPromoteReward uint16 = 1072
ActionReasonBlessingRedeemReward uint16 = 1073
ActionReasonActionMiracleRingReward uint16 = 1074
ActionReasonExpeditionReward uint16 = 1075
ActionReasonTreasureMapRemoveDetector uint16 = 1076
ActionReasonMechanicusDungeonTicket uint16 = 1077
ActionReasonMechanicusLevelupGear uint16 = 1078
ActionReasonMechanicusBattleSettle uint16 = 1079
ActionReasonRegionSearchReward uint16 = 1080
ActionReasonUnlockCoopChapter uint16 = 1081
ActionReasonTakeCoopReward uint16 = 1082
ActionReasonFleurFairDungeonReward uint16 = 1083
ActionReasonActivityScore uint16 = 1084
ActionReasonChannellerSlabOneoffDungeonReward uint16 = 1085
ActionReasonFurnitureMakeStart uint16 = 1086
ActionReasonFurnitureMakeTake uint16 = 1087
ActionReasonFurnitureMakeCancel uint16 = 1088
ActionReasonFurnitureMakeFastFinish uint16 = 1089
ActionReasonChannellerSlabLoopDungeonFirstPassReward uint16 = 1090
ActionReasonChannellerSlabLoopDungeonScoreReward uint16 = 1091
ActionReasonHomeLimitedShopBuy uint16 = 1092
ActionReasonHomeCoinCollect uint16 = 1093
)

View File

@@ -1,11 +1,11 @@
package constant package constant
const ( const (
CLIMATE_TYPE_NONE uint16 = 0 CLIMATE_TYPE_NONE = 0
CLIMATE_TYPE_SUNNY uint16 = 1 CLIMATE_TYPE_SUNNY = 1
CLIMATE_TYPE_CLOUDY uint16 = 2 CLIMATE_TYPE_CLOUDY = 2
CLIMATE_TYPE_RAIN uint16 = 3 CLIMATE_TYPE_RAIN = 3
CLIMATE_TYPE_THUNDERSTORM uint16 = 4 CLIMATE_TYPE_THUNDERSTORM = 4
CLIMATE_TYPE_SNOW uint16 = 5 CLIMATE_TYPE_SNOW = 5
CLIMATE_TYPE_MIST uint16 = 6 CLIMATE_TYPE_MIST = 6
) )

View File

@@ -1,36 +0,0 @@
package constant
const (
EnterReasonNone uint16 = 0
EnterReasonLogin uint16 = 1 // 登录
EnterReasonDungeonReplay uint16 = 11 // 秘境重新挑战
EnterReasonDungeonReviveOnWaypoint uint16 = 12 // 秘境重生
EnterReasonDungeonEnter uint16 = 13 // 秘境进入
EnterReasonDungeonQuit uint16 = 14 // 秘境离开
EnterReasonGm uint16 = 21 // 管理员
EnterReasonQuestRollback uint16 = 31 // 任务回滚
EnterReasonRevival uint16 = 32 // 重生
EnterReasonPersonalScene uint16 = 41 // 个人场景
EnterReasonTransPoint uint16 = 42 // 传送点
EnterReasonClientTransmit uint16 = 43 // 客户端传送
EnterReasonForceDragBack uint16 = 44 // 强制后退
EnterReasonTeamKick uint16 = 51 // 队伍踢出
EnterReasonTeamJoin uint16 = 52 // 队伍加入
EnterReasonTeamBack uint16 = 53 // 队伍返回
EnterReasonMuip uint16 = 54 // 与原神项目组的某个服务器组件相关
EnterReasonDungeonInviteAccept uint16 = 55 // 秘境邀请接受
EnterReasonLua uint16 = 56 // 脚本
EnterReasonActivityLoadTerrain uint16 = 57 // 活动加载地形
EnterReasonHostFromSingleToMp uint16 = 58 // 房主从单人到多人
EnterReasonMpPlay uint16 = 59 // 多人游戏
EnterReasonAnchorPoint uint16 = 60 // 迷你锚点
EnterReasonLuaSkipUi uint16 = 61 // 脚本跳过UI
EnterReasonReloadTerrain uint16 = 62 // 重载地形
EnterReasonDraftTransfer uint16 = 63 // 某个东西传送 ??
EnterReasonEnterHome uint16 = 64 // 进入尘歌壶
EnterReasonExitHome uint16 = 65 // 离开尘歌壶
EnterReasonChangeHomeModule uint16 = 66 // 更改尘歌壶模块
EnterReasonGallery uint16 = 67 // ??
EnterReasonHomeSceneJump uint16 = 68 // 尘歌壶场景跳转
EnterReasonHideAndSeek uint16 = 69 // 捉迷藏也就是风行迷宗
)

View File

@@ -1,11 +0,0 @@
package constant
const (
ENTITY_ID_TYPE_AVATAR uint16 = 0x01
ENTITY_ID_TYPE_MONSTER uint16 = 0x02
ENTITY_ID_TYPE_NPC uint16 = 0x03
ENTITY_ID_TYPE_GADGET uint16 = 0x04
ENTITY_ID_TYPE_WEAPON uint16 = 0x06
ENTITY_ID_TYPE_TEAM uint16 = 0x09
ENTITY_ID_TYPE_MPLEVEL uint16 = 0x0b
)

View File

@@ -1,59 +1,19 @@
package constant package constant
const ( const (
EntityTypeNone uint16 = 0 ENTITY_TYPE_NONE = 0
EntityTypeAvatar uint16 = 1 ENTITY_TYPE_AVATAR = 1
EntityTypeMonster uint16 = 2 ENTITY_TYPE_MONSTER = 2
EntityTypeBullet uint16 = 3 ENTITY_TYPE_NPC = 3
EntityTypeAttackPhyisicalUnit uint16 = 4 ENTITY_TYPE_GADGET = 4
EntityTypeAOE uint16 = 5 ENTITY_TYPE_REGION = 5
EntityTypeCamera uint16 = 6 ENTITY_TYPE_WEAPON = 6
EntityTypeEnviroArea uint16 = 7 ENTITY_TYPE_WEATHER = 7
EntityTypeEquip uint16 = 8 ENTITY_TYPE_SCENE = 8
EntityTypeMonsterEquip uint16 = 9 ENTITY_TYPE_TEAM = 9
EntityTypeGrass uint16 = 10 ENTITY_TYPE_MASSIVE_ENTITY = 10
EntityTypeLevel uint16 = 11 ENTITY_TYPE_MP_LEVEL = 11
EntityTypeNPC uint16 = 12 ENTITY_TYPE_PLAY_TEAM_ENTITY = 12
EntityTypeTransPointFirst uint16 = 13 ENTITY_TYPE_EYE_POINT = 13
EntityTypeTransPointFirstGadget uint16 = 14 ENTITY_TYPE_MAX = 14
EntityTypeTransPointSecond uint16 = 15
EntityTypeTransPointSecondGadget uint16 = 16
EntityTypeDropItem uint16 = 17
EntityTypeField uint16 = 18
EntityTypeGadget uint16 = 19
EntityTypeWater uint16 = 20
EntityTypeGatherPoint uint16 = 21
EntityTypeGatherObject uint16 = 22
EntityTypeAirflowField uint16 = 23
EntityTypeSpeedupField uint16 = 24
EntityTypeGear uint16 = 25
EntityTypeChest uint16 = 26
EntityTypeEnergyBall uint16 = 27
EntityTypeElemCrystal uint16 = 28
EntityTypeTimeline uint16 = 29
EntityTypeWorktop uint16 = 30
EntityTypeTeam uint16 = 31
EntityTypePlatform uint16 = 32
EntityTypeAmberWind uint16 = 33
EntityTypeEnvAnimal uint16 = 34
EntityTypeSealGadget uint16 = 35
EntityTypeTree uint16 = 36
EntityTypeBush uint16 = 37
EntityTypeQuestGadget uint16 = 38
EntityTypeLightning uint16 = 39
EntityTypeRewardPoint uint16 = 40
EntityTypeRewardStatue uint16 = 41
EntityTypeMPLevel uint16 = 42
EntityTypeWindSeed uint16 = 43
EntityTypeMpPlayRewardPoint uint16 = 44
EntityTypeViewPoint uint16 = 45
EntityTypeRemoteAvatar uint16 = 46
EntityTypeGeneralRewardPoint uint16 = 47
EntityTypePlayTeam uint16 = 48
EntityTypeOfferingGadget uint16 = 49
EntityTypeEyePoint uint16 = 50
EntityTypeMiracleRing uint16 = 51
EntityTypeFoundation uint16 = 52
EntityTypeWidgetGadget uint16 = 53
EntityTypePlaceHolder uint16 = 99
) )

View File

@@ -1,11 +1,11 @@
package constant package constant
const ( const (
EQUIP_TYPE_NONE uint16 = 0 EQUIP_TYPE_NONE = 0
EQUIP_TYPE_BRACER uint16 = 1 EQUIP_TYPE_BRACER = 1
EQUIP_TYPE_NECKLACE uint16 = 2 EQUIP_TYPE_NECKLACE = 2
EQUIP_TYPE_SHOES uint16 = 3 EQUIP_TYPE_SHOES = 3
EQUIP_TYPE_RING uint16 = 4 EQUIP_TYPE_RING = 4
EQUIP_TYPE_DRESS uint16 = 5 EQUIP_TYPE_DRESS = 5
EQUIP_TYPE_WEAPON uint16 = 6 EQUIP_TYPE_WEAPON = 6
) )

View File

@@ -1,8 +1,8 @@
package constant package constant
const ( const (
FETTER_STATE_NONE uint16 = 0 FETTER_STATE_NONE = 0
FETTER_STATE_NOT_OPEN uint16 = 1 FETTER_STATE_NOT_OPEN = 1
FETTER_STATE_OPEN uint16 = 1 FETTER_STATE_OPEN = 1
FETTER_STATE_FINISH uint16 = 3 FETTER_STATE_FINISH = 3
) )

View File

@@ -1,100 +1,100 @@
package constant package constant
const ( const (
FIGHT_PROP_NONE uint16 = 0 FIGHT_PROP_NONE = 0
FIGHT_PROP_BASE_HP uint16 = 1 FIGHT_PROP_BASE_HP = 1
FIGHT_PROP_HP uint16 = 2 FIGHT_PROP_HP = 2
FIGHT_PROP_HP_PERCENT uint16 = 3 FIGHT_PROP_HP_PERCENT = 3
FIGHT_PROP_BASE_ATTACK uint16 = 4 FIGHT_PROP_BASE_ATTACK = 4
FIGHT_PROP_ATTACK uint16 = 5 FIGHT_PROP_ATTACK = 5
FIGHT_PROP_ATTACK_PERCENT uint16 = 6 FIGHT_PROP_ATTACK_PERCENT = 6
FIGHT_PROP_BASE_DEFENSE uint16 = 7 FIGHT_PROP_BASE_DEFENSE = 7
FIGHT_PROP_DEFENSE uint16 = 8 FIGHT_PROP_DEFENSE = 8
FIGHT_PROP_DEFENSE_PERCENT uint16 = 9 FIGHT_PROP_DEFENSE_PERCENT = 9
FIGHT_PROP_BASE_SPEED uint16 = 10 FIGHT_PROP_BASE_SPEED = 10
FIGHT_PROP_SPEED_PERCENT uint16 = 11 FIGHT_PROP_SPEED_PERCENT = 11
FIGHT_PROP_HP_MP_PERCENT uint16 = 12 FIGHT_PROP_HP_MP_PERCENT = 12
FIGHT_PROP_ATTACK_MP_PERCENT uint16 = 13 FIGHT_PROP_ATTACK_MP_PERCENT = 13
FIGHT_PROP_CRITICAL uint16 = 20 FIGHT_PROP_CRITICAL = 20
FIGHT_PROP_ANTI_CRITICAL uint16 = 21 FIGHT_PROP_ANTI_CRITICAL = 21
FIGHT_PROP_CRITICAL_HURT uint16 = 22 FIGHT_PROP_CRITICAL_HURT = 22
FIGHT_PROP_CHARGE_EFFICIENCY uint16 = 23 FIGHT_PROP_CHARGE_EFFICIENCY = 23
FIGHT_PROP_ADD_HURT uint16 = 24 FIGHT_PROP_ADD_HURT = 24
FIGHT_PROP_SUB_HURT uint16 = 25 FIGHT_PROP_SUB_HURT = 25
FIGHT_PROP_HEAL_ADD uint16 = 26 FIGHT_PROP_HEAL_ADD = 26
FIGHT_PROP_HEALED_ADD uint16 = 27 FIGHT_PROP_HEALED_ADD = 27
FIGHT_PROP_ELEMENT_MASTERY uint16 = 28 FIGHT_PROP_ELEMENT_MASTERY = 28
FIGHT_PROP_PHYSICAL_SUB_HURT uint16 = 29 FIGHT_PROP_PHYSICAL_SUB_HURT = 29
FIGHT_PROP_PHYSICAL_ADD_HURT uint16 = 30 FIGHT_PROP_PHYSICAL_ADD_HURT = 30
FIGHT_PROP_DEFENCE_IGNORE_RATIO uint16 = 31 FIGHT_PROP_DEFENCE_IGNORE_RATIO = 31
FIGHT_PROP_DEFENCE_IGNORE_DELTA uint16 = 32 FIGHT_PROP_DEFENCE_IGNORE_DELTA = 32
FIGHT_PROP_FIRE_ADD_HURT uint16 = 40 FIGHT_PROP_FIRE_ADD_HURT = 40
FIGHT_PROP_ELEC_ADD_HURT uint16 = 41 FIGHT_PROP_ELEC_ADD_HURT = 41
FIGHT_PROP_WATER_ADD_HURT uint16 = 42 FIGHT_PROP_WATER_ADD_HURT = 42
FIGHT_PROP_GRASS_ADD_HURT uint16 = 43 FIGHT_PROP_GRASS_ADD_HURT = 43
FIGHT_PROP_WIND_ADD_HURT uint16 = 44 FIGHT_PROP_WIND_ADD_HURT = 44
FIGHT_PROP_ROCK_ADD_HURT uint16 = 45 FIGHT_PROP_ROCK_ADD_HURT = 45
FIGHT_PROP_ICE_ADD_HURT uint16 = 46 FIGHT_PROP_ICE_ADD_HURT = 46
FIGHT_PROP_HIT_HEAD_ADD_HURT uint16 = 47 FIGHT_PROP_HIT_HEAD_ADD_HURT = 47
FIGHT_PROP_FIRE_SUB_HURT uint16 = 50 FIGHT_PROP_FIRE_SUB_HURT = 50
FIGHT_PROP_ELEC_SUB_HURT uint16 = 51 FIGHT_PROP_ELEC_SUB_HURT = 51
FIGHT_PROP_WATER_SUB_HURT uint16 = 52 FIGHT_PROP_WATER_SUB_HURT = 52
FIGHT_PROP_GRASS_SUB_HURT uint16 = 53 FIGHT_PROP_GRASS_SUB_HURT = 53
FIGHT_PROP_WIND_SUB_HURT uint16 = 54 FIGHT_PROP_WIND_SUB_HURT = 54
FIGHT_PROP_ROCK_SUB_HURT uint16 = 55 FIGHT_PROP_ROCK_SUB_HURT = 55
FIGHT_PROP_ICE_SUB_HURT uint16 = 56 FIGHT_PROP_ICE_SUB_HURT = 56
FIGHT_PROP_EFFECT_HIT uint16 = 60 FIGHT_PROP_EFFECT_HIT = 60
FIGHT_PROP_EFFECT_RESIST uint16 = 61 FIGHT_PROP_EFFECT_RESIST = 61
FIGHT_PROP_FREEZE_RESIST uint16 = 62 FIGHT_PROP_FREEZE_RESIST = 62
FIGHT_PROP_TORPOR_RESIST uint16 = 63 FIGHT_PROP_TORPOR_RESIST = 63
FIGHT_PROP_DIZZY_RESIST uint16 = 64 FIGHT_PROP_DIZZY_RESIST = 64
FIGHT_PROP_FREEZE_SHORTEN uint16 = 65 FIGHT_PROP_FREEZE_SHORTEN = 65
FIGHT_PROP_TORPOR_SHORTEN uint16 = 66 FIGHT_PROP_TORPOR_SHORTEN = 66
FIGHT_PROP_DIZZY_SHORTEN uint16 = 67 FIGHT_PROP_DIZZY_SHORTEN = 67
FIGHT_PROP_MAX_FIRE_ENERGY uint16 = 70 FIGHT_PROP_MAX_FIRE_ENERGY = 70
FIGHT_PROP_MAX_ELEC_ENERGY uint16 = 71 FIGHT_PROP_MAX_ELEC_ENERGY = 71
FIGHT_PROP_MAX_WATER_ENERGY uint16 = 72 FIGHT_PROP_MAX_WATER_ENERGY = 72
FIGHT_PROP_MAX_GRASS_ENERGY uint16 = 73 FIGHT_PROP_MAX_GRASS_ENERGY = 73
FIGHT_PROP_MAX_WIND_ENERGY uint16 = 74 FIGHT_PROP_MAX_WIND_ENERGY = 74
FIGHT_PROP_MAX_ICE_ENERGY uint16 = 75 FIGHT_PROP_MAX_ICE_ENERGY = 75
FIGHT_PROP_MAX_ROCK_ENERGY uint16 = 76 FIGHT_PROP_MAX_ROCK_ENERGY = 76
FIGHT_PROP_SKILL_CD_MINUS_RATIO uint16 = 80 FIGHT_PROP_SKILL_CD_MINUS_RATIO = 80
FIGHT_PROP_SHIELD_COST_MINUS_RATIO uint16 = 81 FIGHT_PROP_SHIELD_COST_MINUS_RATIO = 81
FIGHT_PROP_CUR_FIRE_ENERGY uint16 = 1000 FIGHT_PROP_CUR_FIRE_ENERGY = 1000
FIGHT_PROP_CUR_ELEC_ENERGY uint16 = 1001 FIGHT_PROP_CUR_ELEC_ENERGY = 1001
FIGHT_PROP_CUR_WATER_ENERGY uint16 = 1002 FIGHT_PROP_CUR_WATER_ENERGY = 1002
FIGHT_PROP_CUR_GRASS_ENERGY uint16 = 1003 FIGHT_PROP_CUR_GRASS_ENERGY = 1003
FIGHT_PROP_CUR_WIND_ENERGY uint16 = 1004 FIGHT_PROP_CUR_WIND_ENERGY = 1004
FIGHT_PROP_CUR_ICE_ENERGY uint16 = 1005 FIGHT_PROP_CUR_ICE_ENERGY = 1005
FIGHT_PROP_CUR_ROCK_ENERGY uint16 = 1006 FIGHT_PROP_CUR_ROCK_ENERGY = 1006
FIGHT_PROP_CUR_HP uint16 = 1010 FIGHT_PROP_CUR_HP = 1010
FIGHT_PROP_MAX_HP uint16 = 2000 FIGHT_PROP_MAX_HP = 2000
FIGHT_PROP_CUR_ATTACK uint16 = 2001 FIGHT_PROP_CUR_ATTACK = 2001
FIGHT_PROP_CUR_DEFENSE uint16 = 2002 FIGHT_PROP_CUR_DEFENSE = 2002
FIGHT_PROP_CUR_SPEED uint16 = 2003 FIGHT_PROP_CUR_SPEED = 2003
FIGHT_PROP_NONEXTRA_ATTACK uint16 = 3000 FIGHT_PROP_NONEXTRA_ATTACK = 3000
FIGHT_PROP_NONEXTRA_DEFENSE uint16 = 3001 FIGHT_PROP_NONEXTRA_DEFENSE = 3001
FIGHT_PROP_NONEXTRA_CRITICAL uint16 = 3002 FIGHT_PROP_NONEXTRA_CRITICAL = 3002
FIGHT_PROP_NONEXTRA_ANTI_CRITICAL uint16 = 3003 FIGHT_PROP_NONEXTRA_ANTI_CRITICAL = 3003
FIGHT_PROP_NONEXTRA_CRITICAL_HURT uint16 = 3004 FIGHT_PROP_NONEXTRA_CRITICAL_HURT = 3004
FIGHT_PROP_NONEXTRA_CHARGE_EFFICIENCY uint16 = 3005 FIGHT_PROP_NONEXTRA_CHARGE_EFFICIENCY = 3005
FIGHT_PROP_NONEXTRA_ELEMENT_MASTERY uint16 = 3006 FIGHT_PROP_NONEXTRA_ELEMENT_MASTERY = 3006
FIGHT_PROP_NONEXTRA_PHYSICAL_SUB_HURT uint16 = 3007 FIGHT_PROP_NONEXTRA_PHYSICAL_SUB_HURT = 3007
FIGHT_PROP_NONEXTRA_FIRE_ADD_HURT uint16 = 3008 FIGHT_PROP_NONEXTRA_FIRE_ADD_HURT = 3008
FIGHT_PROP_NONEXTRA_ELEC_ADD_HURT uint16 = 3009 FIGHT_PROP_NONEXTRA_ELEC_ADD_HURT = 3009
FIGHT_PROP_NONEXTRA_WATER_ADD_HURT uint16 = 3010 FIGHT_PROP_NONEXTRA_WATER_ADD_HURT = 3010
FIGHT_PROP_NONEXTRA_GRASS_ADD_HURT uint16 = 3011 FIGHT_PROP_NONEXTRA_GRASS_ADD_HURT = 3011
FIGHT_PROP_NONEXTRA_WIND_ADD_HURT uint16 = 3012 FIGHT_PROP_NONEXTRA_WIND_ADD_HURT = 3012
FIGHT_PROP_NONEXTRA_ROCK_ADD_HURT uint16 = 3013 FIGHT_PROP_NONEXTRA_ROCK_ADD_HURT = 3013
FIGHT_PROP_NONEXTRA_ICE_ADD_HURT uint16 = 3014 FIGHT_PROP_NONEXTRA_ICE_ADD_HURT = 3014
FIGHT_PROP_NONEXTRA_FIRE_SUB_HURT uint16 = 3015 FIGHT_PROP_NONEXTRA_FIRE_SUB_HURT = 3015
FIGHT_PROP_NONEXTRA_ELEC_SUB_HURT uint16 = 3016 FIGHT_PROP_NONEXTRA_ELEC_SUB_HURT = 3016
FIGHT_PROP_NONEXTRA_WATER_SUB_HURT uint16 = 3017 FIGHT_PROP_NONEXTRA_WATER_SUB_HURT = 3017
FIGHT_PROP_NONEXTRA_GRASS_SUB_HURT uint16 = 3018 FIGHT_PROP_NONEXTRA_GRASS_SUB_HURT = 3018
FIGHT_PROP_NONEXTRA_WIND_SUB_HURT uint16 = 3019 FIGHT_PROP_NONEXTRA_WIND_SUB_HURT = 3019
FIGHT_PROP_NONEXTRA_ROCK_SUB_HURT uint16 = 3020 FIGHT_PROP_NONEXTRA_ROCK_SUB_HURT = 3020
FIGHT_PROP_NONEXTRA_ICE_SUB_HURT uint16 = 3021 FIGHT_PROP_NONEXTRA_ICE_SUB_HURT = 3021
FIGHT_PROP_NONEXTRA_SKILL_CD_MINUS_RATIO uint16 = 3022 FIGHT_PROP_NONEXTRA_SKILL_CD_MINUS_RATIO = 3022
FIGHT_PROP_NONEXTRA_SHIELD_COST_MINUS_RATIO uint16 = 3023 FIGHT_PROP_NONEXTRA_SHIELD_COST_MINUS_RATIO = 3023
FIGHT_PROP_NONEXTRA_PHYSICAL_ADD_HURT uint16 = 3024 FIGHT_PROP_NONEXTRA_PHYSICAL_ADD_HURT = 3024
) )

View File

@@ -1,8 +1,8 @@
package constant package constant
const ( const (
GCG_TOKEN_TYPE_CUR_HEALTH uint32 = 1 // 现行血量 GCG_TOKEN_TYPE_CUR_HEALTH = 1 // 现行血量
GCG_TOKEN_TYPE_MAX_HEALTH uint32 = 2 // 最大血量(不确定) GCG_TOKEN_TYPE_MAX_HEALTH = 2 // 最大血量(不确定)
GCG_TOKEN_TYPE_CUR_ELEM uint32 = 4 // 现行充能 GCG_TOKEN_TYPE_CUR_ELEM = 4 // 现行充能
GCG_TOKEN_TYPE_MAX_ELEM uint32 = 5 // 最大充能(充能条长度) GCG_TOKEN_TYPE_MAX_ELEM = 5 // 最大充能(充能条长度)
) )

View File

@@ -1,64 +1,64 @@
package constant package constant
const ( const (
GROW_CURVE_NONE uint16 = 0 GROW_CURVE_NONE = 0
GROW_CURVE_HP uint16 = 1 GROW_CURVE_HP = 1
GROW_CURVE_ATTACK uint16 = 2 GROW_CURVE_ATTACK = 2
GROW_CURVE_STAMINA uint16 = 3 GROW_CURVE_STAMINA = 3
GROW_CURVE_STRIKE uint16 = 4 GROW_CURVE_STRIKE = 4
GROW_CURVE_ANTI_STRIKE uint16 = 5 GROW_CURVE_ANTI_STRIKE = 5
GROW_CURVE_ANTI_STRIKE1 uint16 = 6 GROW_CURVE_ANTI_STRIKE1 = 6
GROW_CURVE_ANTI_STRIKE2 uint16 = 7 GROW_CURVE_ANTI_STRIKE2 = 7
GROW_CURVE_ANTI_STRIKE3 uint16 = 8 GROW_CURVE_ANTI_STRIKE3 = 8
GROW_CURVE_STRIKE_HURT uint16 = 9 GROW_CURVE_STRIKE_HURT = 9
GROW_CURVE_ELEMENT uint16 = 10 GROW_CURVE_ELEMENT = 10
GROW_CURVE_KILL_EXP uint16 = 11 GROW_CURVE_KILL_EXP = 11
GROW_CURVE_DEFENSE uint16 = 12 GROW_CURVE_DEFENSE = 12
GROW_CURVE_ATTACK_BOMB uint16 = 13 GROW_CURVE_ATTACK_BOMB = 13
GROW_CURVE_HP_LITTLEMONSTER uint16 = 14 GROW_CURVE_HP_LITTLEMONSTER = 14
GROW_CURVE_ELEMENT_MASTERY uint16 = 15 GROW_CURVE_ELEMENT_MASTERY = 15
GROW_CURVE_PROGRESSION uint16 = 16 GROW_CURVE_PROGRESSION = 16
GROW_CURVE_DEFENDING uint16 = 17 GROW_CURVE_DEFENDING = 17
GROW_CURVE_MHP uint16 = 18 GROW_CURVE_MHP = 18
GROW_CURVE_MATK uint16 = 19 GROW_CURVE_MATK = 19
GROW_CURVE_TOWERATK uint16 = 20 GROW_CURVE_TOWERATK = 20
GROW_CURVE_HP_S5 uint16 = 21 GROW_CURVE_HP_S5 = 21
GROW_CURVE_HP_S4 uint16 = 22 GROW_CURVE_HP_S4 = 22
GROW_CURVE_HP_2 uint16 = 23 GROW_CURVE_HP_2 = 23
GROW_CURVE_ATTACK_S5 uint16 = 31 GROW_CURVE_ATTACK_S5 = 31
GROW_CURVE_ATTACK_S4 uint16 = 32 GROW_CURVE_ATTACK_S4 = 32
GROW_CURVE_ATTACK_S3 uint16 = 33 GROW_CURVE_ATTACK_S3 = 33
GROW_CURVE_STRIKE_S5 uint16 = 34 GROW_CURVE_STRIKE_S5 = 34
GROW_CURVE_DEFENSE_S5 uint16 = 41 GROW_CURVE_DEFENSE_S5 = 41
GROW_CURVE_DEFENSE_S4 uint16 = 42 GROW_CURVE_DEFENSE_S4 = 42
GROW_CURVE_ATTACK_101 uint16 = 1101 GROW_CURVE_ATTACK_101 = 1101
GROW_CURVE_ATTACK_102 uint16 = 1102 GROW_CURVE_ATTACK_102 = 1102
GROW_CURVE_ATTACK_103 uint16 = 1103 GROW_CURVE_ATTACK_103 = 1103
GROW_CURVE_ATTACK_104 uint16 = 1104 GROW_CURVE_ATTACK_104 = 1104
GROW_CURVE_ATTACK_105 uint16 = 1105 GROW_CURVE_ATTACK_105 = 1105
GROW_CURVE_ATTACK_201 uint16 = 1201 GROW_CURVE_ATTACK_201 = 1201
GROW_CURVE_ATTACK_202 uint16 = 1202 GROW_CURVE_ATTACK_202 = 1202
GROW_CURVE_ATTACK_203 uint16 = 1203 GROW_CURVE_ATTACK_203 = 1203
GROW_CURVE_ATTACK_204 uint16 = 1204 GROW_CURVE_ATTACK_204 = 1204
GROW_CURVE_ATTACK_205 uint16 = 1205 GROW_CURVE_ATTACK_205 = 1205
GROW_CURVE_ATTACK_301 uint16 = 1301 GROW_CURVE_ATTACK_301 = 1301
GROW_CURVE_ATTACK_302 uint16 = 1302 GROW_CURVE_ATTACK_302 = 1302
GROW_CURVE_ATTACK_303 uint16 = 1303 GROW_CURVE_ATTACK_303 = 1303
GROW_CURVE_ATTACK_304 uint16 = 1304 GROW_CURVE_ATTACK_304 = 1304
GROW_CURVE_ATTACK_305 uint16 = 1305 GROW_CURVE_ATTACK_305 = 1305
GROW_CURVE_CRITICAL_101 uint16 = 2101 GROW_CURVE_CRITICAL_101 = 2101
GROW_CURVE_CRITICAL_102 uint16 = 2102 GROW_CURVE_CRITICAL_102 = 2102
GROW_CURVE_CRITICAL_103 uint16 = 2103 GROW_CURVE_CRITICAL_103 = 2103
GROW_CURVE_CRITICAL_104 uint16 = 2104 GROW_CURVE_CRITICAL_104 = 2104
GROW_CURVE_CRITICAL_105 uint16 = 2105 GROW_CURVE_CRITICAL_105 = 2105
GROW_CURVE_CRITICAL_201 uint16 = 2201 GROW_CURVE_CRITICAL_201 = 2201
GROW_CURVE_CRITICAL_202 uint16 = 2202 GROW_CURVE_CRITICAL_202 = 2202
GROW_CURVE_CRITICAL_203 uint16 = 2203 GROW_CURVE_CRITICAL_203 = 2203
GROW_CURVE_CRITICAL_204 uint16 = 2204 GROW_CURVE_CRITICAL_204 = 2204
GROW_CURVE_CRITICAL_205 uint16 = 2205 GROW_CURVE_CRITICAL_205 = 2205
GROW_CURVE_CRITICAL_301 uint16 = 2301 GROW_CURVE_CRITICAL_301 = 2301
GROW_CURVE_CRITICAL_302 uint16 = 2302 GROW_CURVE_CRITICAL_302 = 2302
GROW_CURVE_CRITICAL_303 uint16 = 2303 GROW_CURVE_CRITICAL_303 = 2303
GROW_CURVE_CRITICAL_304 uint16 = 2304 GROW_CURVE_CRITICAL_304 = 2304
GROW_CURVE_CRITICAL_305 uint16 = 2305 GROW_CURVE_CRITICAL_305 = 2305
) )

View File

@@ -1,11 +1,11 @@
package constant package constant
const ( const (
ITEM_TYPE_NONE uint16 = 0 ITEM_TYPE_NONE = 0
ITEM_TYPE_VIRTUAL uint16 = 1 ITEM_TYPE_VIRTUAL = 1
ITEM_TYPE_MATERIAL uint16 = 2 ITEM_TYPE_MATERIAL = 2
ITEM_TYPE_RELIQUARY uint16 = 3 ITEM_TYPE_RELIQUARY = 3
ITEM_TYPE_WEAPON uint16 = 4 ITEM_TYPE_WEAPON = 4
ITEM_TYPE_DISPLAY uint16 = 5 ITEM_TYPE_DISPLAY = 5
ITEM_TYPE_FURNITURE uint16 = 6 ITEM_TYPE_FURNITURE = 6
) )

View File

@@ -1,8 +1,8 @@
package constant package constant
const ( const (
LIFE_STATE_NONE uint16 = 0 LIFE_STATE_NONE = 0
LIFE_STATE_ALIVE uint16 = 1 LIFE_STATE_ALIVE = 1
LIFE_STATE_DEAD uint16 = 2 LIFE_STATE_DEAD = 2
LIFE_STATE_REVIVE uint16 = 3 LIFE_STATE_REVIVE = 3
) )

132
common/constant/lua_type.go Normal file
View File

@@ -0,0 +1,132 @@
package constant
const (
LUA_EVENT_NONE = 0
LUA_EVENT_ANY_MONSTER_DIE = 1
LUA_EVENT_ANY_GADGET_DIE = 2
LUA_EVENT_VARIABLE_CHANGE = 3
LUA_EVENT_ENTER_REGION = 4
LUA_EVENT_LEAVE_REGION = 5
LUA_EVENT_GADGET_CREATE = 6
LUA_EVENT_GADGET_STATE_CHANGE = 7
LUA_EVENT_DUNGEON_SETTLE = 8
LUA_EVENT_SELECT_OPTION = 9
LUA_EVENT_CLIENT_EXECUTE = 10
LUA_EVENT_ANY_MONSTER_LIVE = 11
LUA_EVENT_SPECIFIC_MONSTER_HP_CHANGE = 12
LUA_EVENT_CITY_LEVELUP_UNLOCK_DUNGEON_ENTRY = 13
LUA_EVENT_DUNGEON_BROADCAST_ONTIMER = 14
LUA_EVENT_TIMER_EVENT = 15
LUA_EVENT_CHALLENGE_SUCCESS = 16
LUA_EVENT_CHALLENGE_FAIL = 17
LUA_EVENT_SEAL_BATTLE_BEGIN = 18
LUA_EVENT_SEAL_BATTLE_END = 19
LUA_EVENT_GATHER = 20
LUA_EVENT_QUEST_FINISH = 21
LUA_EVENT_MONSTER_BATTLE = 22
LUA_EVENT_CITY_LEVELUP = 23
LUA_EVENT_CUTSCENE_END = 24
LUA_EVENT_AVATAR_NEAR_PLATFORM = 25
LUA_EVENT_PLATFORM_REACH_POINT = 26
LUA_EVENT_UNLOCK_TRANS_POINT = 27
LUA_EVENT_QUEST_START = 28
LUA_EVENT_GROUP_LOAD = 29
LUA_EVENT_GROUP_WILL_UNLOAD = 30
LUA_EVENT_GROUP_WILL_REFRESH = 31
LUA_EVENT_GROUP_REFRESH = 32
LUA_EVENT_DUNGEON_REWARD_GET = 33
LUA_EVENT_SPECIFIC_GADGET_HP_CHANGE = 34
LUA_EVENT_MONSTER_TIDE_OVER = 35
LUA_EVENT_MONSTER_TIDE_CREATE = 36
LUA_EVENT_MONSTER_TIDE_DIE = 37
LUA_EVENT_SEALAMP_PHASE_CHANGE = 38
LUA_EVENT_BLOSSOM_PROGRESS_FINISH = 39
LUA_EVENT_BLOSSOM_CHEST_DIE = 40
LUA_EVENT_GADGET_PLAY_START = 41
LUA_EVENT_GADGET_PLAY_START_CD = 42
LUA_EVENT_GADGET_PLAY_STOP = 43
LUA_EVENT_GADGET_LUA_NOTIFY = 44
LUA_EVENT_MP_PLAY_PREPARE = 45
LUA_EVENT_MP_PLAY_BATTLE = 46
LUA_EVENT_MP_PLAY_PREPARE_INTERRUPT = 47
LUA_EVENT_SELECT_DIFFICULTY = 48
LUA_EVENT_SCENE_MP_PLAY_BATTLE_STATE = 49
LUA_EVENT_SCENE_MP_PLAY_BATTLE_STAGE_CHANGE = 50
LUA_EVENT_SCENE_MP_PLAY_BATTLE_RESULT = 51
LUA_EVENT_SEAL_BATTLE_PROGRESS_DECREASE = 52
LUA_EVENT_GENERAL_REWARD_DIE = 53
LUA_EVENT_SCENE_MP_PLAY_BATTLE_INTERRUPT = 54
LUA_EVENT_MONSTER_DIE_BEFORE_LEAVE_SCENE = 55
LUA_EVENT_SCENE_MP_PLAY_OPEN = 56
LUA_EVENT_OFFERING_LEVELUP = 57
LUA_EVENT_DUNGEON_REVIVE = 58
LUA_EVENT_SCENE_MP_PLAY_ALL_AVATAR_DIE = 59
LUA_EVENT_DUNGEON_ALL_AVATAR_DIE = 60
LUA_EVENT_GENERAL_REWARD_TAKEN = 61
LUA_EVENT_PLATFORM_REACH_ARRAYPOINT = 62
LUA_EVENT_SCENE_MULTISTAGE_PLAY_STAGE_END = 63
LUA_EVENT_SCENE_MULTISTAGE_PLAY_END_STAGE_REQ = 64
LUA_EVENT_MECHANICUS_PICKED_CARD = 65
LUA_EVENT_POOL_MONSTER_TIDE_OVER = 66
LUA_EVENT_POOL_MONSTER_TIDE_CREATE = 67
LUA_EVENT_POOL_MONSTER_TIDE_DIE = 68
LUA_EVENT_DUNGEON_AVATAR_SLIP_DIE = 69
LUA_EVENT_GALLERY_START = 70
LUA_EVENT_GALLERY_STOP = 71
LUA_EVENT_TIME_AXIS_PASS = 72
LUA_EVENT_FLEUR_FAIR_DUNGEON_ALL_PLAYER_ENTER = 73
LUA_EVENT_GADGETTALK_DONE = 74
LUA_EVENT_SET_GAME_TIME = 75
LUA_EVENT_HIDE_AND_SEEK_PLAYER_QUIT = 76
LUA_EVENT_AVATAR_DIE = 77
LUA_EVENT_SCENE_MULTISTAGE_PLAY_STAGE_START = 78
LUA_EVENT_GALLERY_PROGRESS_PASS = 79
LUA_EVENT_GALLERY_PROGRESS_EMPTY = 80
LUA_EVENT_GALLERY_PROGRESS_FULL = 81
LUA_EVENT_HUNTING_FINISH_FINAL = 82
LUA_EVENT_USE_WIDGET_TOY_FOX_CAMERA = 83
LUA_EVENT_LUNA_RITE_SACRIFICE = 84
LUA_EVENT_SUMO_SWITCH_TEAM_EVENT = 85
LUA_EVENT_FISHING_START = 86
LUA_EVENT_FISHING_STOP = 87
LUA_EVENT_FISHING_QTE_FINISH = 88
LUA_EVENT_FISHING_TIMEOUT_FLEE = 89
LUA_EVENT_ROGUE_CELL_STATE_CHANGE = 90
LUA_EVENT_ROGUE_CELL_CONSTRUCT = 91
LUA_EVENT_ROGUE_CELL_FINISH_SELECT_CARD = 92
LUA_EVENT_ANY_MONSTER_CAPTURE = 93
LUA_EVENT_ACTIVITY_INTERACT_GADGET = 94
LUA_EVENT_CHALLENGE_PAUSE = 95
LUA_EVENT_LEVEL_TAG_CHANGE = 96
LUA_EVENT_CUSTOM_DUNGEON_START = 97
LUA_EVENT_CUSTOM_DUNGEON_RESTART = 98
LUA_EVENT_CUSTOM_DUNGEON_REACTIVE = 99
LUA_EVENT_CUSTOM_DUNGEON_OUT_STUCK = 100
LUA_EVENT_CUSTOM_DUNGEON_EXIT_TRY = 101
LUA_EVENT_CUSTOM_DUNGEON_OFFICIAL_RESTART = 102
LUA_EVENT_ANY_MONSTER_CAPTURE_AND_DISAPPEAR = 103
LUA_EVENT_MICHIAE_INTERACT = 104
LUA_EVENT_SELECT_UIINTERACT = 105
LUA_EVENT_LUA_NOTIFY = 106
LUA_EVENT_PHOTO_FINISH = 107
LUA_EVENT_IRODORI_MASTER_READY = 108
LUA_EVENT_ROGUE_START_FIGHT = 109
LUA_EVENT_ROGUE_CREAGE_FIGHT_GADGET = 110
LUA_EVENT_ROGUE_CREAGE_REPAIR_GADGET = 111
LUA_EVENT_ROGUE_OPEN_ACCESS = 112
LUA_EVENT_GADGET_GIVING_FINISHED = 113
LUA_EVENT_OBSERVATION_POINT_NOTIFY = 114
LUA_EVENT_GADGET_GIVING_TAKEBACK = 115
LUA_EVENT_ECHO_SHELL_INTERACT = 116
LUA_EVENT_PLATFORM_ARRIVAL = 2701
LUA_EVENT_PLAYER_BACK_GALLERY_REVIVE_POINT = 2800
LUA_EVENT_GALLERY_CANNOT_START_AFTER_COUNTDOWN = 2801
)
const (
REGION_SHAPE_NONE = 0
REGION_SHAPE_SPHERE = 1
REGION_SHAPE_CUBIC = 2
REGION_SHAPE_CYLINDER = 3
REGION_SHAPE_POLYGON = 4
)

View File

@@ -1,33 +1,33 @@
package constant package constant
const ( const (
MATERIAL_TYPE_NONE uint16 = 0 MATERIAL_TYPE_NONE = 0
MATERIAL_TYPE_FOOD uint16 = 1 MATERIAL_TYPE_FOOD = 1
MATERIAL_TYPE_QUEST uint16 = 2 MATERIAL_TYPE_QUEST = 2
MATERIAL_TYPE_EXCHANGE uint16 = 4 MATERIAL_TYPE_EXCHANGE = 4
MATERIAL_TYPE_CONSUME uint16 = 5 MATERIAL_TYPE_CONSUME = 5
MATERIAL_TYPE_EXP_FRUIT uint16 = 6 MATERIAL_TYPE_EXP_FRUIT = 6
MATERIAL_TYPE_AVATAR uint16 = 7 MATERIAL_TYPE_AVATAR = 7
MATERIAL_TYPE_ADSORBATE uint16 = 8 MATERIAL_TYPE_ADSORBATE = 8
MATERIAL_TYPE_CRICKET uint16 = 9 MATERIAL_TYPE_CRICKET = 9
MATERIAL_TYPE_ELEM_CRYSTAL uint16 = 10 MATERIAL_TYPE_ELEM_CRYSTAL = 10
MATERIAL_TYPE_WEAPON_EXP_STONE uint16 = 11 MATERIAL_TYPE_WEAPON_EXP_STONE = 11
MATERIAL_TYPE_CHEST uint16 = 12 MATERIAL_TYPE_CHEST = 12
MATERIAL_TYPE_RELIQUARY_MATERIAL uint16 = 13 MATERIAL_TYPE_RELIQUARY_MATERIAL = 13
MATERIAL_TYPE_AVATAR_MATERIAL uint16 = 14 MATERIAL_TYPE_AVATAR_MATERIAL = 14
MATERIAL_TYPE_NOTICE_ADD_HP uint16 = 15 MATERIAL_TYPE_NOTICE_ADD_HP = 15
MATERIAL_TYPE_SEA_LAMP uint16 = 16 MATERIAL_TYPE_SEA_LAMP = 16
MATERIAL_TYPE_SELECTABLE_CHEST uint16 = 17 MATERIAL_TYPE_SELECTABLE_CHEST = 17
MATERIAL_TYPE_FLYCLOAK uint16 = 18 MATERIAL_TYPE_FLYCLOAK = 18
MATERIAL_TYPE_NAMECARD uint16 = 19 MATERIAL_TYPE_NAMECARD = 19
MATERIAL_TYPE_TALENT uint16 = 20 MATERIAL_TYPE_TALENT = 20
MATERIAL_TYPE_WIDGET uint16 = 21 MATERIAL_TYPE_WIDGET = 21
MATERIAL_TYPE_CHEST_BATCH_USE uint16 = 22 MATERIAL_TYPE_CHEST_BATCH_USE = 22
MATERIAL_TYPE_FAKE_ABSORBATE uint16 = 23 MATERIAL_TYPE_FAKE_ABSORBATE = 23
MATERIAL_TYPE_CONSUME_BATCH_USE uint16 = 24 MATERIAL_TYPE_CONSUME_BATCH_USE = 24
MATERIAL_TYPE_WOOD uint16 = 25 MATERIAL_TYPE_WOOD = 25
MATERIAL_TYPE_FURNITURE_FORMULA uint16 = 27 MATERIAL_TYPE_FURNITURE_FORMULA = 27
MATERIAL_TYPE_CHANNELLER_SLAB_BUFF uint16 = 28 MATERIAL_TYPE_CHANNELLER_SLAB_BUFF = 28
MATERIAL_TYPE_FURNITURE_SUITE_FORMULA uint16 = 29 MATERIAL_TYPE_FURNITURE_SUITE_FORMULA = 29
MATERIAL_TYPE_COSTUME uint16 = 30 MATERIAL_TYPE_COSTUME = 30
) )

View File

@@ -1,15 +1,166 @@
package constant package constant
const ( const (
QUEST_STATE_TYPE_ACCEPT uint32 = 1 QUEST_STATE_NONE = 0
QUEST_STATE_TYPE_EXEC uint32 = 2 QUEST_STATE_UNSTARTED = 1
QUEST_STATE_TYPE_FINISH uint32 = 3 QUEST_STATE_UNFINISHED = 2
QUEST_STATE_FINISHED = 3
QUEST_STATE_FAILED = 4
) )
const ( const (
QUEST_ACCEPT_COND_TYPE_QUEST_STATE_EQ int32 = 1 QUEST_ACCEPT_COND_TYPE_NONE = 0
QUEST_ACCEPT_COND_TYPE_STATE_EQUAL = 1
QUEST_ACCEPT_COND_TYPE_STATE_NOT_EQUAL = 2
QUEST_ACCEPT_COND_TYPE_PACK_HAVE_ITEM = 3
QUEST_ACCEPT_COND_TYPE_AVATAR_ELEMENT_EQUAL = 4
QUEST_ACCEPT_COND_TYPE_AVATAR_ELEMENT_NOT_EQUAL = 5
QUEST_ACCEPT_COND_TYPE_AVATAR_CAN_CHANGE_ELEMENT = 6
QUEST_ACCEPT_COND_TYPE_CITY_LEVEL_EQUAL_GREATER = 7
QUEST_ACCEPT_COND_TYPE_ITEM_NUM_LESS_THAN = 8
QUEST_ACCEPT_COND_TYPE_DAILY_TASK_START = 9
QUEST_ACCEPT_COND_TYPE_OPEN_STATE_EQUAL = 10
QUEST_ACCEPT_COND_TYPE_DAILY_TASK_OPEN = 11
QUEST_ACCEPT_COND_TYPE_DAILY_TASK_REWARD_CAN_GET = 12
QUEST_ACCEPT_COND_TYPE_DAILY_TASK_REWARD_RECEIVED = 13
QUEST_ACCEPT_COND_TYPE_PLAYER_LEVEL_REWARD_CAN_GET = 14
QUEST_ACCEPT_COND_TYPE_EXPLORATION_REWARD_CAN_GET = 15
QUEST_ACCEPT_COND_TYPE_IS_WORLD_OWNER = 16
QUEST_ACCEPT_COND_TYPE_PLAYER_LEVEL_EQUAL_GREATER = 17
QUEST_ACCEPT_COND_TYPE_SCENE_AREA_UNLOCKED = 18
QUEST_ACCEPT_COND_TYPE_ITEM_GIVING_ACTIVED = 19
QUEST_ACCEPT_COND_TYPE_ITEM_GIVING_FINISHED = 20
QUEST_ACCEPT_COND_TYPE_IS_DAYTIME = 21
QUEST_ACCEPT_COND_TYPE_CURRENT_AVATAR = 22
QUEST_ACCEPT_COND_TYPE_CURRENT_AREA = 23
QUEST_ACCEPT_COND_TYPE_QUEST_VAR_EQUAL = 24
QUEST_ACCEPT_COND_TYPE_QUEST_VAR_GREATER = 25
QUEST_ACCEPT_COND_TYPE_QUEST_VAR_LESS = 26
QUEST_ACCEPT_COND_TYPE_FORGE_HAVE_FINISH = 27
QUEST_ACCEPT_COND_TYPE_DAILY_TASK_IN_PROGRESS = 28
QUEST_ACCEPT_COND_TYPE_DAILY_TASK_FINISHED = 29
QUEST_ACCEPT_COND_TYPE_ACTIVITY_COND = 30
QUEST_ACCEPT_COND_TYPE_ACTIVITY_OPEN = 31
QUEST_ACCEPT_COND_TYPE_DAILY_TASK_VAR_GT = 32
QUEST_ACCEPT_COND_TYPE_DAILY_TASK_VAR_EQ = 33
QUEST_ACCEPT_COND_TYPE_DAILY_TASK_VAR_LT = 34
QUEST_ACCEPT_COND_TYPE_BARGAIN_ITEM_GT = 35
QUEST_ACCEPT_COND_TYPE_BARGAIN_ITEM_EQ = 36
QUEST_ACCEPT_COND_TYPE_BARGAIN_ITEM_LT = 37
QUEST_ACCEPT_COND_TYPE_COMPLETE_TALK = 38
QUEST_ACCEPT_COND_TYPE_NOT_HAVE_BLOSSOM_TALK = 39
QUEST_ACCEPT_COND_TYPE_IS_CUR_BLOSSOM_TALK = 40
QUEST_ACCEPT_COND_TYPE_QUEST_NOT_RECEIVE = 41
QUEST_ACCEPT_COND_TYPE_QUEST_SERVER_COND_VALID = 42
QUEST_ACCEPT_COND_TYPE_ACTIVITY_CLIENT_COND = 43
QUEST_ACCEPT_COND_TYPE_QUEST_GLOBAL_VAR_EQUAL = 44
QUEST_ACCEPT_COND_TYPE_QUEST_GLOBAL_VAR_GREATER = 45
QUEST_ACCEPT_COND_TYPE_QUEST_GLOBAL_VAR_LESS = 46
QUEST_ACCEPT_COND_TYPE_PERSONAL_LINE_UNLOCK = 47
QUEST_ACCEPT_COND_TYPE_CITY_REPUTATION_REQUEST = 48
QUEST_ACCEPT_COND_TYPE_MAIN_COOP_START = 49
QUEST_ACCEPT_COND_TYPE_MAIN_COOP_ENTER_SAVE_POINT = 50
QUEST_ACCEPT_COND_TYPE_CITY_REPUTATION_LEVEL = 51
QUEST_ACCEPT_COND_TYPE_CITY_REPUTATION_UNLOCK = 52
QUEST_ACCEPT_COND_TYPE_LUA_NOTIFY = 53
QUEST_ACCEPT_COND_TYPE_CUR_CLIMATE = 54
QUEST_ACCEPT_COND_TYPE_ACTIVITY_END = 55
QUEST_ACCEPT_COND_TYPE_COOP_POINT_RUNNING = 56
QUEST_ACCEPT_COND_TYPE_GADGET_TALK_STATE_EQUAL = 57
QUEST_ACCEPT_COND_TYPE_AVATAR_FETTER_GT = 58
QUEST_ACCEPT_COND_TYPE_AVATAR_FETTER_EQ = 59
QUEST_ACCEPT_COND_TYPE_AVATAR_FETTER_LT = 60
QUEST_ACCEPT_COND_TYPE_NEW_HOMEWORLD_MOUDLE_UNLOCK = 61
QUEST_ACCEPT_COND_TYPE_NEW_HOMEWORLD_LEVEL_REWARD = 62
QUEST_ACCEPT_COND_TYPE_NEW_HOMEWORLD_MAKE_FINISH = 63
QUEST_ACCEPT_COND_TYPE_HOMEWORLD_NPC_EVENT = 64
QUEST_ACCEPT_COND_TYPE_TIME_VAR_GT_EQ = 65
QUEST_ACCEPT_COND_TYPE_TIME_VAR_PASS_DAY = 66
QUEST_ACCEPT_COND_TYPE_HOMEWORLD_NPC_NEW_TALK = 67
QUEST_ACCEPT_COND_TYPE_PLAYER_CHOOSE_MALE = 68
QUEST_ACCEPT_COND_TYPE_HISTORY_GOT_ANY_ITEM = 69
QUEST_ACCEPT_COND_TYPE_LEARNED_RECIPE = 70
QUEST_ACCEPT_COND_TYPE_LUNARITE_REGION_UNLOCKED = 71
QUEST_ACCEPT_COND_TYPE_LUNARITE_HAS_REGION_HINT_COUNT = 72
QUEST_ACCEPT_COND_TYPE_LUNARITE_COLLECT_FINISH = 73
QUEST_ACCEPT_COND_TYPE_LUNARITE_MARK_ALL_FINISH = 74
QUEST_ACCEPT_COND_TYPE_NEW_HOMEWORLD_SHOP_ITEM = 75
QUEST_ACCEPT_COND_TYPE_SCENE_POINT_UNLOCK = 76
QUEST_ACCEPT_COND_TYPE_SCENE_LEVEL_TAG_EQ = 77
) )
const ( const (
QUEST_FINISH_COND_TYPE_SCENE_TRIGGER = 6 QUEST_FINISH_COND_TYPE_NONE = 0
QUEST_FINISH_COND_TYPE_KILL_MONSTER = 1
QUEST_FINISH_COND_TYPE_COMPLETE_TALK = 2
QUEST_FINISH_COND_TYPE_MONSTER_DIE = 3
QUEST_FINISH_COND_TYPE_FINISH_PLOT = 4
QUEST_FINISH_COND_TYPE_OBTAIN_ITEM = 5
QUEST_FINISH_COND_TYPE_TRIGGER_FIRE = 6
QUEST_FINISH_COND_TYPE_CLEAR_GROUP_MONSTER = 7
QUEST_FINISH_COND_TYPE_NOT_FINISH_PLOT = 8
QUEST_FINISH_COND_TYPE_ENTER_DUNGEON = 9
QUEST_FINISH_COND_TYPE_ENTER_MY_WORLD = 10
QUEST_FINISH_COND_TYPE_FINISH_DUNGEON = 11
QUEST_FINISH_COND_TYPE_DESTROY_GADGET = 12
QUEST_FINISH_COND_TYPE_OBTAIN_MATERIAL_WITH_SUBTYPE = 13
QUEST_FINISH_COND_TYPE_NICK_NAME = 14
QUEST_FINISH_COND_TYPE_WORKTOP_SELECT = 15
QUEST_FINISH_COND_TYPE_SEAL_BATTLE_RESULT = 16
QUEST_FINISH_COND_TYPE_ENTER_ROOM = 17
QUEST_FINISH_COND_TYPE_GAME_TIME_TICK = 18
QUEST_FINISH_COND_TYPE_FAIL_DUNGEON = 19
QUEST_FINISH_COND_TYPE_LUA_NOTIFY = 20
QUEST_FINISH_COND_TYPE_TEAM_DEAD = 21
QUEST_FINISH_COND_TYPE_COMPLETE_ANY_TALK = 22
QUEST_FINISH_COND_TYPE_UNLOCK_TRANS_POINT = 23
QUEST_FINISH_COND_TYPE_ADD_QUEST_PROGRESS = 24
QUEST_FINISH_COND_TYPE_INTERACT_GADGET = 25
QUEST_FINISH_COND_TYPE_DAILY_TASK_COMP_FINISH = 26
QUEST_FINISH_COND_TYPE_FINISH_ITEM_GIVING = 27
QUEST_FINISH_COND_TYPE_SKILL = 107
QUEST_FINISH_COND_TYPE_CITY_LEVEL_UP = 109
QUEST_FINISH_COND_TYPE_PATTERN_GROUP_CLEAR_MONSTER = 110
QUEST_FINISH_COND_TYPE_ITEM_LESS_THAN = 111
QUEST_FINISH_COND_TYPE_PLAYER_LEVEL_UP = 112
QUEST_FINISH_COND_TYPE_DUNGEON_OPEN_STATUE = 113
QUEST_FINISH_COND_TYPE_UNLOCK_AREA = 114
QUEST_FINISH_COND_TYPE_OPEN_CHEST_WITH_GADGET_ID = 115
QUEST_FINISH_COND_TYPE_UNLOCK_TRANS_POINT_WITH_TYPE = 116
QUEST_FINISH_COND_TYPE_FINISH_DAILY_DUNGEON = 117
QUEST_FINISH_COND_TYPE_FINISH_WEEKLY_DUNGEON = 118
QUEST_FINISH_COND_TYPE_QUEST_VAR_EQUAL = 119
QUEST_FINISH_COND_TYPE_QUEST_VAR_GREATER = 120
QUEST_FINISH_COND_TYPE_QUEST_VAR_LESS = 121
QUEST_FINISH_COND_TYPE_OBTAIN_VARIOUS_ITEM = 122
QUEST_FINISH_COND_TYPE_FINISH_TOWER_LEVEL = 123
QUEST_FINISH_COND_TYPE_BARGAIN_SUCC = 124
QUEST_FINISH_COND_TYPE_BARGAIN_FAIL = 125
QUEST_FINISH_COND_TYPE_ITEM_LESS_THAN_BARGAIN = 126
QUEST_FINISH_COND_TYPE_ACTIVITY_TRIGGER_FAILED = 127
QUEST_FINISH_COND_TYPE_MAIN_COOP_ENTER_SAVE_POINT = 128
QUEST_FINISH_COND_TYPE_ANY_MANUAL_TRANSPORT = 129
QUEST_FINISH_COND_TYPE_USE_ITEM = 130
QUEST_FINISH_COND_TYPE_MAIN_COOP_ENTER_ANY_SAVE_POINT = 131
QUEST_FINISH_COND_TYPE_ENTER_MY_HOME_WORLD = 132
QUEST_FINISH_COND_TYPE_ENTER_MY_WORLD_SCENE = 133
QUEST_FINISH_COND_TYPE_TIME_VAR_GT_EQ = 134
QUEST_FINISH_COND_TYPE_TIME_VAR_PASS_DAY = 135
QUEST_FINISH_COND_TYPE_QUEST_STATE_EQUAL = 136
QUEST_FINISH_COND_TYPE_QUEST_STATE_NOT_EQUAL = 137
QUEST_FINISH_COND_TYPE_UNLOCKED_RECIPE = 138
QUEST_FINISH_COND_TYPE_NOT_UNLOCKED_RECIPE = 139
QUEST_FINISH_COND_TYPE_FISHING_SUCC = 140
QUEST_FINISH_COND_TYPE_ENTER_ROGUE_DUNGEON = 141
QUEST_FINISH_COND_TYPE_USE_WIDGET = 142
QUEST_FINISH_COND_TYPE_CAPTURE_SUCC = 143
QUEST_FINISH_COND_TYPE_CAPTURE_USE_CAPTURETAG_LIST = 144
QUEST_FINISH_COND_TYPE_CAPTURE_USE_MATERIAL_LIST = 145
QUEST_FINISH_COND_TYPE_ENTER_VEHICLE = 147
QUEST_FINISH_COND_TYPE_SCENE_LEVEL_TAG_EQ = 148
QUEST_FINISH_COND_TYPE_LEAVE_SCENE = 149
QUEST_FINISH_COND_TYPE_LEAVE_SCENE_RANGE = 150
QUEST_FINISH_COND_TYPE_IRODORI_FINISH_FLOWER_COMBINATION = 151
QUEST_FINISH_COND_TYPE_IRODORI_POETRY_REACH_MIN_PROGRESS = 152
QUEST_FINISH_COND_TYPE_IRODORI_POETRY_FINISH_FILL_POETRY = 153
) )

View File

@@ -1,10 +1,10 @@
package constant package constant
const ( const (
RELIQUARY_TYPE_NONE int32 = 0 RELIQUARY_TYPE_NONE = 0
RELIQUARY_TYPE_FLOWER int32 = 1 // 生之花 RELIQUARY_TYPE_FLOWER = 1 // 生之花
RELIQUARY_TYPE_FEATHER int32 = 2 // 死之羽 RELIQUARY_TYPE_FEATHER = 2 // 死之羽
RELIQUARY_TYPE_SAND int32 = 3 // 时之沙 RELIQUARY_TYPE_SAND = 3 // 时之沙
RELIQUARY_TYPE_CUP int32 = 4 // 空之杯 RELIQUARY_TYPE_CUP = 4 // 空之杯
RELIQUARY_TYPE_CROWN int32 = 5 // 理之冠 RELIQUARY_TYPE_CROWN = 5 // 理之冠
) )

View File

@@ -1,11 +1,11 @@
package constant package constant
const ( const (
SCENE_TYPE_NONE uint16 = 0 SCENE_TYPE_NONE = 0
SCENE_TYPE_WORLD uint16 = 1 SCENE_TYPE_WORLD = 1
SCENE_TYPE_DUNGEON uint16 = 2 SCENE_TYPE_DUNGEON = 2
SCENE_TYPE_ROOM uint16 = 3 SCENE_TYPE_ROOM = 3
SCENE_TYPE_HOME_WORLD uint16 = 4 SCENE_TYPE_HOME_WORLD = 4
SCENE_TYPE_HOME_ROOM uint16 = 5 SCENE_TYPE_HOME_ROOM = 5
SCENE_TYPE_ACTIVITY uint16 = 6 SCENE_TYPE_ACTIVITY = 6
) )

View File

@@ -1,18 +1,18 @@
package constant package constant
const ( const (
WEAPON_TYPE_NONE int32 = 0 WEAPON_TYPE_NONE = 0
WEAPON_TYPE_SWORD_ONE_HAND int32 = 1 // 单手剑 WEAPON_TYPE_SWORD_ONE_HAND = 1 // 单手剑
WEAPON_TYPE_CROSSBOW int32 = 2 // 弩 WEAPON_TYPE_CROSSBOW = 2 // 弩
WEAPON_TYPE_STAFF int32 = 3 // 权杖 WEAPON_TYPE_STAFF = 3 // 权杖
WEAPON_TYPE_DOUBLE_DAGGER int32 = 4 // 双刀 WEAPON_TYPE_DOUBLE_DAGGER = 4 // 双刀
WEAPON_TYPE_KATANA int32 = 5 // 武士刀 WEAPON_TYPE_KATANA = 5 // 武士刀
WEAPON_TYPE_SHURIKEN int32 = 6 // 手里剑 WEAPON_TYPE_SHURIKEN = 6 // 手里剑
WEAPON_TYPE_STICK int32 = 7 // 棍 WEAPON_TYPE_STICK = 7 // 棍
WEAPON_TYPE_SPEAR int32 = 8 // 矛 WEAPON_TYPE_SPEAR = 8 // 矛
WEAPON_TYPE_SHIELD_SMALL int32 = 9 // 小盾牌 WEAPON_TYPE_SHIELD_SMALL = 9 // 小盾牌
WEAPON_TYPE_CATALYST int32 = 10 // 法器 WEAPON_TYPE_CATALYST = 10 // 法器
WEAPON_TYPE_CLAYMORE int32 = 11 // 双手剑 WEAPON_TYPE_CLAYMORE = 11 // 双手剑
WEAPON_TYPE_BOW int32 = 12 // 弓 WEAPON_TYPE_BOW = 12 // 弓
WEAPON_TYPE_POLE int32 = 13 // 长枪 WEAPON_TYPE_POLE = 13 // 长枪
) )

View File

@@ -201,8 +201,8 @@ func (f *FightRoutine) onTickSecond(now int64) {
if entity.uid == 0 { if entity.uid == 0 {
continue continue
} }
entity.fightPropMap[uint32(constant.FIGHT_PROP_CUR_ATTACK)] = 1000000 entity.fightPropMap[constant.FIGHT_PROP_CUR_ATTACK] = 1000000
entity.fightPropMap[uint32(constant.FIGHT_PROP_CRITICAL)] = 1.0 entity.fightPropMap[constant.FIGHT_PROP_CRITICAL] = 1.0
avatarFightPropNotify := &proto.AvatarFightPropNotify{ avatarFightPropNotify := &proto.AvatarFightPropNotify{
AvatarGuid: entity.avatarGuid, AvatarGuid: entity.avatarGuid,
FightPropMap: entity.fightPropMap, FightPropMap: entity.fightPropMap,
@@ -262,17 +262,17 @@ func (f *FightRoutine) attackHandle(gameMsg *mq.GameMsg) {
_ = attackerId _ = attackerId
currHp := float32(0) currHp := float32(0)
if target.fightPropMap != nil { if target.fightPropMap != nil {
currHp = target.fightPropMap[uint32(constant.FIGHT_PROP_CUR_HP)] currHp = target.fightPropMap[constant.FIGHT_PROP_CUR_HP]
currHp -= damage currHp -= damage
if currHp < 0 { if currHp < 0 {
currHp = 0 currHp = 0
} }
target.fightPropMap[uint32(constant.FIGHT_PROP_CUR_HP)] = currHp target.fightPropMap[constant.FIGHT_PROP_CUR_HP] = currHp
} }
entityFightPropUpdateNotify := new(proto.EntityFightPropUpdateNotify) entityFightPropUpdateNotify := new(proto.EntityFightPropUpdateNotify)
entityFightPropUpdateNotify.EntityId = target.entityId entityFightPropUpdateNotify.EntityId = target.entityId
entityFightPropUpdateNotify.FightPropMap = make(map[uint32]float32) entityFightPropUpdateNotify.FightPropMap = make(map[uint32]float32)
entityFightPropUpdateNotify.FightPropMap[uint32(constant.FIGHT_PROP_CUR_HP)] = currHp entityFightPropUpdateNotify.FightPropMap[constant.FIGHT_PROP_CUR_HP] = currHp
for _, uid := range f.getAllPlayer(f.entityMap) { for _, uid := range f.getAllPlayer(f.entityMap) {
SendMsg(f.messageQueue, cmd.EntityFightPropUpdateNotify, uid, f.gateAppId, entityFightPropUpdateNotify) SendMsg(f.messageQueue, cmd.EntityFightPropUpdateNotify, uid, f.gateAppId, entityFightPropUpdateNotify)
} }

View File

@@ -16,11 +16,11 @@ import (
// AvatarData 角色配置表 // AvatarData 角色配置表
type AvatarData struct { type AvatarData struct {
AvatarId int32 `csv:"AvatarId"` // ID AvatarId int32 `csv:"AvatarId"` // ID
HpBase float64 `csv:"HpBase,omitempty"` // 基础生命值 HpBase float32 `csv:"HpBase,omitempty"` // 基础生命值
AttackBase float64 `csv:"AttackBase,omitempty"` // 基础攻击力 AttackBase float32 `csv:"AttackBase,omitempty"` // 基础攻击力
DefenseBase float64 `csv:"DefenseBase,omitempty"` // 基础防御力 DefenseBase float32 `csv:"DefenseBase,omitempty"` // 基础防御力
Critical float64 `csv:"Critical,omitempty"` // 暴击率 Critical float32 `csv:"Critical,omitempty"` // 暴击率
CriticalHurt float64 `csv:"CriticalHurt,omitempty"` // 暴击伤害 CriticalHurt float32 `csv:"CriticalHurt,omitempty"` // 暴击伤害
QualityType int32 `csv:"QualityType,omitempty"` // 角色品质 QualityType int32 `csv:"QualityType,omitempty"` // 角色品质
ConfigJson string `csv:"ConfigJson,omitempty"` // 战斗config ConfigJson string `csv:"ConfigJson,omitempty"` // 战斗config
InitialWeapon int32 `csv:"InitialWeapon,omitempty"` // 初始武器 InitialWeapon int32 `csv:"InitialWeapon,omitempty"` // 初始武器
@@ -107,14 +107,14 @@ func GetAvatarDataMap() map[int32]*AvatarData {
// TODO 成长属性要读表 // TODO 成长属性要读表
func (a *AvatarData) GetBaseHpByLevel(level uint8) float64 { func (a *AvatarData) GetBaseHpByLevel(level uint8) float32 {
return a.HpBase * float64(level) return a.HpBase * float32(level)
} }
func (a *AvatarData) GetBaseAttackByLevel(level uint8) float64 { func (a *AvatarData) GetBaseAttackByLevel(level uint8) float32 {
return a.AttackBase * float64(level) return a.AttackBase * float32(level)
} }
func (a *AvatarData) GetBaseDefenseByLevel(level uint8) float64 { func (a *AvatarData) GetBaseDefenseByLevel(level uint8) float32 {
return a.DefenseBase * float64(level) return a.DefenseBase * float32(level)
} }

View File

@@ -8,6 +8,7 @@ import (
"time" "time"
"hk4e/common/config" "hk4e/common/config"
"hk4e/common/constant"
"hk4e/pkg/logger" "hk4e/pkg/logger"
lua "github.com/yuin/gopher-lua" lua "github.com/yuin/gopher-lua"
@@ -172,18 +173,22 @@ func RegScriptLib(fnName string, fn lua.LGFunction) {
func initLuaState(luaState *lua.LState) { func initLuaState(luaState *lua.LState) {
eventType := luaState.NewTable() eventType := luaState.NewTable()
luaState.SetGlobal("EventType", eventType) luaState.SetGlobal("EventType", eventType)
luaState.SetField(eventType, "NONE", lua.LNumber(0)) luaState.SetField(eventType, "EVENT_NONE", lua.LNumber(constant.LUA_EVENT_NONE))
luaState.SetField(eventType, "EVENT_ENTER_REGION", lua.LNumber(1)) luaState.SetField(eventType, "EVENT_ENTER_REGION", lua.LNumber(constant.LUA_EVENT_ENTER_REGION))
luaState.SetField(eventType, "EVENT_LEAVE_REGION", lua.LNumber(constant.LUA_EVENT_LEAVE_REGION))
entityType := luaState.NewTable() entityType := luaState.NewTable()
luaState.SetGlobal("EntityType", entityType) luaState.SetGlobal("EntityType", entityType)
luaState.SetField(entityType, "NONE", lua.LNumber(0)) luaState.SetField(entityType, "NONE", lua.LNumber(constant.ENTITY_TYPE_NONE))
luaState.SetField(entityType, "AVATAR", lua.LNumber(1)) luaState.SetField(entityType, "AVATAR", lua.LNumber(constant.ENTITY_TYPE_AVATAR))
regionShape := luaState.NewTable() regionShape := luaState.NewTable()
luaState.SetGlobal("RegionShape", regionShape) luaState.SetGlobal("RegionShape", regionShape)
luaState.SetField(regionShape, "NONE", lua.LNumber(0)) luaState.SetField(regionShape, "NONE", lua.LNumber(constant.REGION_SHAPE_NONE))
luaState.SetField(regionShape, "SPHERE", lua.LNumber(1)) luaState.SetField(regionShape, "SPHERE", lua.LNumber(constant.REGION_SHAPE_SPHERE))
luaState.SetField(regionShape, "CUBIC", lua.LNumber(constant.REGION_SHAPE_CUBIC))
luaState.SetField(regionShape, "CYLINDER", lua.LNumber(constant.REGION_SHAPE_CYLINDER))
luaState.SetField(regionShape, "POLYGON", lua.LNumber(constant.REGION_SHAPE_POLYGON))
questState := luaState.NewTable() questState := luaState.NewTable()
luaState.SetGlobal("QuestState", questState) luaState.SetGlobal("QuestState", questState)

View File

@@ -62,7 +62,7 @@ func (g *GameDataConfig) loadItemData() {
itemData.SkillAffix = append(itemData.SkillAffix, itemData.SkillAffix2) itemData.SkillAffix = append(itemData.SkillAffix, itemData.SkillAffix2)
} }
// 武器精炼摩拉消耗列表读取转换 // 武器精炼摩拉消耗列表读取转换
if itemData.Type == int32(constant.ITEM_TYPE_WEAPON) && itemData.AwakenCoinCostStr != "" { if itemData.Type == constant.ITEM_TYPE_WEAPON && itemData.AwakenCoinCostStr != "" {
tempCostList := strings.Split(strings.ReplaceAll(itemData.AwakenCoinCostStr, " ", ""), "#") tempCostList := strings.Split(strings.ReplaceAll(itemData.AwakenCoinCostStr, " ", ""), "#")
itemData.AwakenCoinCostList = make([]uint32, 0, len(tempCostList)) itemData.AwakenCoinCostList = make([]uint32, 0, len(tempCostList))
for _, s := range tempCostList { for _, s := range tempCostList {

View File

@@ -4,6 +4,7 @@ import (
"os" "os"
"strconv" "strconv"
"sync" "sync"
"sync/atomic"
"hk4e/pkg/logger" "hk4e/pkg/logger"
@@ -16,6 +17,8 @@ const (
SceneGroupLoaderLimit = 4 // 加载文件的并发数 此操作很耗内存 调大之前请确保你的机器内存足够 SceneGroupLoaderLimit = 4 // 加载文件的并发数 此操作很耗内存 调大之前请确保你的机器内存足够
) )
var OBJECT_ID_COUNTER uint64
type SceneLuaConfig struct { type SceneLuaConfig struct {
Id int32 Id int32
SceneConfig *SceneConfig // 地图配置 SceneConfig *SceneConfig // 地图配置
@@ -54,14 +57,15 @@ type Group struct {
RefreshId int32 `json:"refresh_id"` RefreshId int32 `json:"refresh_id"`
Area int32 `json:"area"` Area int32 `json:"area"`
Pos *Vector `json:"pos"` Pos *Vector `json:"pos"`
DynamicLoad bool `json:"dynamic_load"`
IsReplaceable *Replaceable `json:"is_replaceable"` IsReplaceable *Replaceable `json:"is_replaceable"`
MonsterList []*Monster `json:"monsters"` // 怪物 MonsterList []*Monster `json:"monsters"` // 怪物
NpcList []*Npc `json:"npcs"` // NPC NpcList []*Npc `json:"npcs"` // NPC
GadgetList []*Gadget `json:"gadgets"` // 物件 GadgetList []*Gadget `json:"gadgets"` // 物件
RegionList []*Region `json:"regions"` RegionList []*Region `json:"regions"`
TriggerList []*Trigger `json:"triggers"` TriggerList []*Trigger `json:"triggers"`
LuaStr string LuaStr string `json:"-"`
LuaState *lua.LState LuaState *lua.LState `json:"-"`
} }
type Replaceable struct { type Replaceable struct {
@@ -77,6 +81,7 @@ type Monster struct {
Rot *Vector `json:"rot"` Rot *Vector `json:"rot"`
Level int32 `json:"level"` Level int32 `json:"level"`
AreaId int32 `json:"area_id"` AreaId int32 `json:"area_id"`
ObjectId uint64 `json:"-"`
} }
type Npc struct { type Npc struct {
@@ -85,6 +90,7 @@ type Npc struct {
Pos *Vector `json:"pos"` Pos *Vector `json:"pos"`
Rot *Vector `json:"rot"` Rot *Vector `json:"rot"`
AreaId int32 `json:"area_id"` AreaId int32 `json:"area_id"`
ObjectId uint64 `json:"-"`
} }
type Gadget struct { type Gadget struct {
@@ -95,15 +101,18 @@ type Gadget struct {
Level int32 `json:"level"` Level int32 `json:"level"`
AreaId int32 `json:"area_id"` AreaId int32 `json:"area_id"`
PointType int32 `json:"point_type"` // 关联GatherData表 PointType int32 `json:"point_type"` // 关联GatherData表
ObjectId uint64 `json:"-"`
} }
type Region struct { type Region struct {
ConfigId int32 `json:"config_id"` ConfigId int32 `json:"config_id"`
Shape int32 `json:"shape"` Shape int32 `json:"shape"`
Radius float32 `json:"radius"` Radius float32 `json:"radius"`
Size *Vector `json:"size"` Size *Vector `json:"size"`
Pos *Vector `json:"pos"` Pos *Vector `json:"pos"`
AreaId int32 `json:"area_id"` Height float32 `json:"height"`
PointArray []*Vector `json:"point_array"`
AreaId int32 `json:"area_id"`
} }
type Trigger struct { type Trigger struct {
@@ -136,6 +145,9 @@ func (g *GameDataConfig) loadGroup(group *Group, block *Block, sceneId int32, bl
logger.Error("get monsters object error, sceneId: %v, blockId: %v, groupId: %v", sceneId, blockId, groupId) logger.Error("get monsters object error, sceneId: %v, blockId: %v, groupId: %v", sceneId, blockId, groupId)
return return
} }
for _, monster := range group.MonsterList {
monster.ObjectId = atomic.AddUint64(&OBJECT_ID_COUNTER, 1)
}
// npcs // npcs
group.NpcList = make([]*Npc, 0) group.NpcList = make([]*Npc, 0)
ok = parseLuaTableToObject[*[]*Npc](luaState, "npcs", &group.NpcList) ok = parseLuaTableToObject[*[]*Npc](luaState, "npcs", &group.NpcList)
@@ -143,6 +155,9 @@ func (g *GameDataConfig) loadGroup(group *Group, block *Block, sceneId int32, bl
logger.Error("get npcs object error, sceneId: %v, blockId: %v, groupId: %v", sceneId, blockId, groupId) logger.Error("get npcs object error, sceneId: %v, blockId: %v, groupId: %v", sceneId, blockId, groupId)
return return
} }
for _, npc := range group.NpcList {
npc.ObjectId = atomic.AddUint64(&OBJECT_ID_COUNTER, 1)
}
// gadgets // gadgets
group.GadgetList = make([]*Gadget, 0) group.GadgetList = make([]*Gadget, 0)
ok = parseLuaTableToObject[*[]*Gadget](luaState, "gadgets", &group.GadgetList) ok = parseLuaTableToObject[*[]*Gadget](luaState, "gadgets", &group.GadgetList)
@@ -150,6 +165,9 @@ func (g *GameDataConfig) loadGroup(group *Group, block *Block, sceneId int32, bl
logger.Error("get gadgets object error, sceneId: %v, blockId: %v, groupId: %v", sceneId, blockId, groupId) logger.Error("get gadgets object error, sceneId: %v, blockId: %v, groupId: %v", sceneId, blockId, groupId)
return return
} }
for _, gadget := range group.GadgetList {
gadget.ObjectId = atomic.AddUint64(&OBJECT_ID_COUNTER, 1)
}
// regions // regions
group.RegionList = make([]*Region, 0) group.RegionList = make([]*Region, 0)
ok = parseLuaTableToObject[*[]*Region](luaState, "regions", &group.RegionList) ok = parseLuaTableToObject[*[]*Region](luaState, "regions", &group.RegionList)
@@ -170,6 +188,7 @@ func (g *GameDataConfig) loadGroup(group *Group, block *Block, sceneId int32, bl
} }
func (g *GameDataConfig) loadSceneLuaConfig() { func (g *GameDataConfig) loadSceneLuaConfig() {
OBJECT_ID_COUNTER = 0
g.SceneLuaConfigMap = make(map[int32]*SceneLuaConfig) g.SceneLuaConfigMap = make(map[int32]*SceneLuaConfig)
sceneLuaPrefix := g.luaPrefix + "scene/" sceneLuaPrefix := g.luaPrefix + "scene/"
for _, sceneData := range g.SceneDataMap { for _, sceneData := range g.SceneDataMap {

View File

@@ -1,10 +1,10 @@
package game package game
import ( import (
"hk4e/common/constant"
"hk4e/gdconf" "hk4e/gdconf"
"hk4e/gs/model" "hk4e/gs/model"
"hk4e/pkg/logger" "hk4e/pkg/logger"
"hk4e/protocol/proto"
) )
// GMTeleportPlayer 传送玩家 // GMTeleportPlayer 传送玩家
@@ -14,7 +14,7 @@ func (c *CommandManager) GMTeleportPlayer(userId, sceneId uint32, posX, posY, po
logger.Error("player is nil, uid: %v", userId) logger.Error("player is nil, uid: %v", userId)
return return
} }
GAME_MANAGER.TeleportPlayer(player, constant.EnterReasonGm, sceneId, &model.Vector{ GAME_MANAGER.TeleportPlayer(player, uint16(proto.EnterReason_ENTER_REASON_GM), sceneId, &model.Vector{
X: posX, X: posX,
Y: posY, Y: posY,
Z: posZ, Z: posZ,

View File

@@ -167,5 +167,7 @@ func (l *LocalEventManager) LocalEventHandle(localEvent *LocalEvent) {
}() }()
case ReloadGameDataConfigFinish: case ReloadGameDataConfigFinish:
gdconf.ReplaceGameDataConfig() gdconf.ReplaceGameDataConfig()
// TODO 参考更表一样改成异步加载
WORLD_MANAGER.LoadSceneBlockAoiMap()
} }
} }

View File

@@ -440,14 +440,14 @@ func (g *GameManager) PacketAvatarInfo(avatar *model.Avatar) *proto.AvatarInfo {
for _, v := range avatar.FetterList { for _, v := range avatar.FetterList {
pbAvatar.FetterInfo.FetterList = append(pbAvatar.FetterInfo.FetterList, &proto.FetterData{ pbAvatar.FetterInfo.FetterList = append(pbAvatar.FetterInfo.FetterList, &proto.FetterData{
FetterId: v, FetterId: v,
FetterState: uint32(constant.FETTER_STATE_FINISH), FetterState: constant.FETTER_STATE_FINISH,
}) })
} }
// 解锁全部资料 // 解锁全部资料
for _, v := range gdconf.GetFetterIdListByAvatarId(int32(avatar.AvatarId)) { for _, v := range gdconf.GetFetterIdListByAvatarId(int32(avatar.AvatarId)) {
pbAvatar.FetterInfo.FetterList = append(pbAvatar.FetterInfo.FetterList, &proto.FetterData{ pbAvatar.FetterInfo.FetterList = append(pbAvatar.FetterInfo.FetterList, &proto.FetterData{
FetterId: uint32(v), FetterId: uint32(v),
FetterState: uint32(constant.FETTER_STATE_FINISH), FetterState: constant.FETTER_STATE_FINISH,
}) })
} }
// 突破等级奖励 // 突破等级奖励

View File

@@ -314,7 +314,7 @@ func (g *GameManager) PacketAvatarEquipChangeNotifyByWeapon(avatar *model.Avatar
AvatarGuid: avatar.Guid, AvatarGuid: avatar.Guid,
ItemId: weapon.ItemId, ItemId: weapon.ItemId,
EquipGuid: weapon.Guid, EquipGuid: weapon.Guid,
EquipType: uint32(constant.EQUIP_TYPE_WEAPON), EquipType: constant.EQUIP_TYPE_WEAPON,
Weapon: &proto.SceneWeaponInfo{ Weapon: &proto.SceneWeaponInfo{
EntityId: entityId, EntityId: entityId,
GadgetId: uint32(weaponConfig.GadgetId), GadgetId: uint32(weaponConfig.GadgetId),

View File

@@ -1,10 +1,14 @@
package game package game
import ( import (
"math"
"hk4e/common/config" "hk4e/common/config"
"hk4e/common/constant" "hk4e/common/constant"
"hk4e/common/utils" "hk4e/common/utils"
"hk4e/gdconf"
"hk4e/gs/model" "hk4e/gs/model"
"hk4e/pkg/alg"
"hk4e/pkg/logger" "hk4e/pkg/logger"
"hk4e/pkg/reflection" "hk4e/pkg/reflection"
"hk4e/protocol/cmd" "hk4e/protocol/cmd"
@@ -147,19 +151,19 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p
currHp := float32(0) currHp := float32(0)
fightProp := target.GetFightProp() fightProp := target.GetFightProp()
if fightProp != nil { if fightProp != nil {
currHp = fightProp[uint32(constant.FIGHT_PROP_CUR_HP)] currHp = fightProp[constant.FIGHT_PROP_CUR_HP]
currHp -= damage currHp -= damage
if currHp < 0 { if currHp < 0 {
currHp = 0 currHp = 0
} }
fightProp[uint32(constant.FIGHT_PROP_CUR_HP)] = currHp fightProp[constant.FIGHT_PROP_CUR_HP] = currHp
} }
entityFightPropUpdateNotify := &proto.EntityFightPropUpdateNotify{ entityFightPropUpdateNotify := &proto.EntityFightPropUpdateNotify{
FightPropMap: fightProp, FightPropMap: fightProp,
EntityId: target.GetId(), EntityId: target.GetId(),
} }
g.SendToWorldA(world, cmd.EntityFightPropUpdateNotify, player.ClientSeq, entityFightPropUpdateNotify) g.SendToWorldA(world, cmd.EntityFightPropUpdateNotify, player.ClientSeq, entityFightPropUpdateNotify)
if currHp == 0 && target.GetAvatarEntity() == nil { if currHp == 0 && target.GetEntityType() != constant.ENTITY_TYPE_AVATAR {
scene.SetEntityLifeState(target, constant.LIFE_STATE_DEAD, proto.PlayerDieType_PLAYER_DIE_GM) scene.SetEntityLifeState(target, constant.LIFE_STATE_DEAD, proto.PlayerDieType_PLAYER_DIE_GM)
} }
combatData, err := pb.Marshal(hitInfo) combatData, err := pb.Marshal(hitInfo)
@@ -195,13 +199,13 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p
if sceneEntity == nil { if sceneEntity == nil {
continue continue
} }
if sceneEntity.GetAvatarEntity() != nil { if sceneEntity.GetEntityType() == constant.ENTITY_TYPE_AVATAR {
// 玩家实体在移动 // 玩家实体在移动
g.AoiPlayerMove(player, player.Pos, &model.Vector{ g.AoiPlayerMove(player, player.Pos, &model.Vector{
X: float64(motionInfo.Pos.X), X: float64(motionInfo.Pos.X),
Y: float64(motionInfo.Pos.Y), Y: float64(motionInfo.Pos.Y),
Z: float64(motionInfo.Pos.Z), Z: float64(motionInfo.Pos.Z),
}) }, sceneEntity.GetId())
// 更新玩家的位置信息 // 更新玩家的位置信息
player.Pos.X = float64(motionInfo.Pos.X) player.Pos.X = float64(motionInfo.Pos.X)
player.Pos.Y = float64(motionInfo.Pos.Y) player.Pos.Y = float64(motionInfo.Pos.Y)
@@ -223,13 +227,15 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p
rot.X = float64(motionInfo.Rot.X) rot.X = float64(motionInfo.Rot.X)
rot.Y = float64(motionInfo.Rot.Y) rot.Y = float64(motionInfo.Rot.Y)
rot.Z = float64(motionInfo.Rot.Z) rot.Z = float64(motionInfo.Rot.Z)
// 载具耐力消耗 if sceneEntity.GetEntityType() == constant.ENTITY_TYPE_GADGET {
gadgetEntity := sceneEntity.GetGadgetEntity() // 载具耐力消耗
if gadgetEntity != nil && gadgetEntity.GetGadgetVehicleEntity() != nil { gadgetEntity := sceneEntity.GetGadgetEntity()
// 处理耐力消耗 if gadgetEntity.GetGadgetVehicleEntity() != nil {
g.ImmediateStamina(player, motionInfo.State) // 处理耐力消耗
// 处理载具销毁请求 g.ImmediateStamina(player, motionInfo.State)
g.VehicleDestroyMotion(player, sceneEntity, motionInfo.State) // 处理载具销毁请求
g.VehicleDestroyMotion(player, sceneEntity, motionInfo.State)
}
} }
} }
sceneEntity.SetMoveState(uint16(motionInfo.State)) sceneEntity.SetMoveState(uint16(motionInfo.State))
@@ -278,67 +284,181 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p
} }
} }
func (g *GameManager) AoiPlayerMove(player *model.Player, oldPos *model.Vector, newPos *model.Vector) { func (g *GameManager) AoiPlayerMove(player *model.Player, oldPos *model.Vector, newPos *model.Vector, entityId uint32) {
sceneBlockAoiMap := WORLD_MANAGER.GetSceneBlockAoiMap()
aoiManager, exist := sceneBlockAoiMap[player.SceneId]
world := WORLD_MANAGER.GetWorldByID(player.WorldId) world := WORLD_MANAGER.GetWorldByID(player.WorldId)
scene := world.GetSceneById(player.SceneId) if world == nil {
if scene == nil { logger.Error("get player world is nil, uid: %v", player.PlayerID)
logger.Error("scene is nil, sceneId: %v", player.SceneId)
return return
} }
if exist { scene := world.GetSceneById(player.SceneId)
oldGid := aoiManager.GetGidByPos(float32(oldPos.X), 0.0, float32(oldPos.Z)) sceneBlockAoiMap := WORLD_MANAGER.GetSceneBlockAoiMap()
newGid := aoiManager.GetGidByPos(float32(newPos.X), 0.0, float32(newPos.Z)) aoiManager, exist := sceneBlockAoiMap[player.SceneId]
if oldGid != newGid { if !exist {
// 跨越了格子 logger.Error("get scene block aoi is nil, sceneId: %v, uid: %v", player.SceneId, player.PlayerID)
oldGridList := aoiManager.GetSurrGridListByGid(oldGid) return
oldObjectMap := make(map[int64]any) }
for _, grid := range oldGridList { oldGid := aoiManager.GetGidByPos(float32(oldPos.X), 0.0, float32(oldPos.Z))
tmp := grid.GetObjectList() newGid := aoiManager.GetGidByPos(float32(newPos.X), 0.0, float32(newPos.Z))
for k, v := range tmp { if oldGid != newGid {
oldObjectMap[k] = v // 跨越了block格子
} logger.Debug("player cross grid, oldGid: %v, newGid: %v, uid: %v", oldGid, newGid, player.PlayerID)
}
// 旧位置视野范围内的group
oldVisionGroupMap := make(map[uint32]*gdconf.Group)
oldGroupList := aoiManager.GetObjectListByPos(float32(oldPos.X), 0.0, float32(oldPos.Z))
for groupId, groupAny := range oldGroupList {
group := groupAny.(*gdconf.Group)
distance2D := math.Sqrt(math.Pow(oldPos.X-float64(group.Pos.X), 2.0) + math.Pow(oldPos.Z-float64(group.Pos.Z), 2.0))
if distance2D > ENTITY_LOD {
continue
}
oldVisionGroupMap[uint32(groupId)] = group
}
// 新位置视野范围内的group
newVisionGroupMap := make(map[uint32]*gdconf.Group)
newGroupList := aoiManager.GetObjectListByPos(float32(newPos.X), 0.0, float32(newPos.Z))
for groupId, groupAny := range newGroupList {
group := groupAny.(*gdconf.Group)
distance2D := math.Sqrt(math.Pow(newPos.X-float64(group.Pos.X), 2.0) + math.Pow(newPos.Z-float64(group.Pos.Z), 2.0))
if distance2D > ENTITY_LOD {
continue
}
newVisionGroupMap[uint32(groupId)] = group
}
// 消失的场景实体
delEntityIdList := make([]uint32, 0)
for groupId, group := range oldVisionGroupMap {
_, exist := newVisionGroupMap[groupId]
if exist {
continue
}
// 旧有新没有的group即为消失的
for _, monster := range group.MonsterList {
entity := scene.GetEntityByObjectId(monster.ObjectId)
if entity == nil {
continue
} }
newGridList := aoiManager.GetSurrGridListByGid(newGid) scene.DestroyEntity(entity.GetId())
newObjectMap := make(map[int64]any) delEntityIdList = append(delEntityIdList, entity.GetId())
for _, grid := range newGridList { }
tmp := grid.GetObjectList() for _, npc := range group.NpcList {
for k, v := range tmp { entity := scene.GetEntityByObjectId(npc.ObjectId)
newObjectMap[k] = v if entity == nil {
} continue
} }
delEntityIdList := make([]uint32, 0) scene.DestroyEntity(entity.GetId())
for oldObjectId := range oldObjectMap { delEntityIdList = append(delEntityIdList, entity.GetId())
_, exist := newObjectMap[oldObjectId] }
if exist { for _, gadget := range group.GadgetList {
continue entity := scene.GetEntityByObjectId(gadget.ObjectId)
} if entity == nil {
entity := scene.GetEntityByObjectId(oldObjectId) continue
if entity == nil {
continue
}
scene.DestroyEntity(entity.GetId())
delEntityIdList = append(delEntityIdList, entity.GetId())
} }
addEntityIdList := make([]uint32, 0) scene.DestroyEntity(entity.GetId())
for newObjectId, newObject := range newObjectMap { delEntityIdList = append(delEntityIdList, entity.GetId())
_, exist := oldObjectMap[newObjectId]
if exist {
continue
}
entityId := g.CreateConfigEntity(scene, newObjectId, newObject)
if entityId == 0 {
continue
}
addEntityIdList = append(addEntityIdList, entityId)
}
// 发送已消失格子里的实体消失通知
g.RemoveSceneEntityNotifyToPlayer(player, proto.VisionType_VISION_MISS, delEntityIdList)
// 发送新出现格子里的实体出现通知
g.AddSceneEntityNotify(player, proto.VisionType_VISION_MEET, addEntityIdList, false, false)
} }
} }
// 出现的场景实体
addEntityIdList := make([]uint32, 0)
for groupId, group := range newVisionGroupMap {
_, exist := oldVisionGroupMap[groupId]
if exist {
continue
}
// 新有旧没有的group即为出现的
for _, monster := range group.MonsterList {
entityId := g.CreateConfigEntity(scene, monster.ObjectId, monster)
addEntityIdList = append(addEntityIdList, entityId)
}
for _, npc := range group.NpcList {
entityId := g.CreateConfigEntity(scene, npc.ObjectId, npc)
addEntityIdList = append(addEntityIdList, entityId)
}
for _, gadget := range group.GadgetList {
entityId := g.CreateConfigEntity(scene, gadget.ObjectId, gadget)
addEntityIdList = append(addEntityIdList, entityId)
}
}
// 同步客户端消失和出现的场景实体
g.RemoveSceneEntityNotifyToPlayer(player, proto.VisionType_VISION_MISS, delEntityIdList)
g.AddSceneEntityNotify(player, proto.VisionType_VISION_MEET, addEntityIdList, false, false)
// 场景区域触发器
dbQuest := player.GetDbQuest()
for _, group := range newVisionGroupMap {
for _, region := range group.RegionList {
shape := alg.NewShape()
switch uint8(region.Shape) {
case constant.REGION_SHAPE_SPHERE:
shape.NewSphere(&alg.Vector3{X: region.Pos.X, Y: region.Pos.Y, Z: region.Pos.Z}, region.Radius)
case constant.REGION_SHAPE_CUBIC:
shape.NewCubic(&alg.Vector3{X: region.Pos.X, Y: region.Pos.Y, Z: region.Pos.Z},
&alg.Vector3{X: region.Size.X, Y: region.Size.Y, Z: region.Size.Z})
case constant.REGION_SHAPE_CYLINDER:
shape.NewCylinder(&alg.Vector3{X: region.Pos.X, Y: region.Pos.Y, Z: region.Pos.Z},
region.Radius, region.Height)
case constant.REGION_SHAPE_POLYGON:
vector2PointArray := make([]*alg.Vector2, 0)
for _, vector := range region.PointArray {
// z就是y
vector2PointArray = append(vector2PointArray, &alg.Vector2{X: vector.X, Z: vector.Y})
}
shape.NewPolygon(&alg.Vector3{X: region.Pos.X, Y: region.Pos.Y, Z: region.Pos.Z},
vector2PointArray, region.Height)
}
oldPosInRegion := shape.Contain(&alg.Vector3{
X: float32(oldPos.X),
Y: float32(oldPos.Y),
Z: float32(oldPos.Z),
})
newPosInRegion := shape.Contain(&alg.Vector3{
X: float32(newPos.X),
Y: float32(newPos.Y),
Z: float32(newPos.Z),
})
if !oldPosInRegion && newPosInRegion {
// EVENT_ENTER_REGION
logger.Debug("player enter region: %v, uid: %v", region, player.PlayerID)
for _, trigger := range group.TriggerList {
if trigger.Event != constant.LUA_EVENT_ENTER_REGION {
continue
}
cond := CallLuaFunc(group.LuaState, trigger.Condition, &LuaCtx{
uid: player.PlayerID,
}, &LuaEvt{
param1: region.ConfigId,
targetEntityId: entityId,
})
if !cond {
continue
}
// TODO 这一块写得太炸裂了需要优化
for _, triggerDataConfig := range gdconf.GetTriggerDataMap() {
if triggerDataConfig.TriggerName == trigger.Name {
for _, quest := range dbQuest.GetQuestMap() {
questDataConfig := gdconf.GetQuestDataById(int32(quest.QuestId))
if questDataConfig == nil {
continue
}
for _, questCond := range questDataConfig.FinishCondList {
if questCond.Type != constant.QUEST_FINISH_COND_TYPE_TRIGGER_FIRE {
continue
}
if questCond.Param[0] != triggerDataConfig.TriggerId {
continue
}
dbQuest.ForceFinishQuest(quest.QuestId)
}
}
}
}
}
} else if oldPosInRegion && !newPosInRegion {
// EVENT_LEAVE_REGION
logger.Debug("player leave region: %v, uid: %v", region, player.PlayerID)
}
}
}
g.AcceptQuest(player, true)
} }
func (g *GameManager) AbilityInvocationsNotify(player *model.Player, payloadMsg pb.Message) { func (g *GameManager) AbilityInvocationsNotify(player *model.Player, payloadMsg pb.Message) {

View File

@@ -63,7 +63,7 @@ func (g *GameManager) GCGStartChallenge(player *model.Player) {
g.PacketGCGGameBriefDataNotify(player, proto.GCGGameBusinessType_GCG_GAME_GUIDE_GROUP, game)) g.PacketGCGGameBriefDataNotify(player, proto.GCGGameBusinessType_GCG_GAME_GUIDE_GROUP, game))
// 玩家进入GCG界面 // 玩家进入GCG界面
g.TeleportPlayer(player, constant.EnterReasonDungeonEnter, 79999, new(model.Vector), new(model.Vector), 2162) g.TeleportPlayer(player, uint16(proto.EnterReason_ENTER_REASON_DUNGEON_ENTER), 79999, new(model.Vector), new(model.Vector), 2162)
} }
// GCGAskDuelReq GCG决斗请求 // GCGAskDuelReq GCG决斗请求

View File

@@ -16,11 +16,11 @@ type ChangeItem struct {
func (g *GameManager) GetAllItemDataConfig() map[int32]*gdconf.ItemData { func (g *GameManager) GetAllItemDataConfig() map[int32]*gdconf.ItemData {
allItemDataConfig := make(map[int32]*gdconf.ItemData) allItemDataConfig := make(map[int32]*gdconf.ItemData)
for itemId, itemData := range gdconf.GetItemDataMap() { for itemId, itemData := range gdconf.GetItemDataMap() {
if uint16(itemData.Type) == constant.ITEM_TYPE_WEAPON { if itemData.Type == constant.ITEM_TYPE_WEAPON {
// 排除武器 // 排除武器
continue continue
} }
if uint16(itemData.Type) == constant.ITEM_TYPE_RELIQUARY { if itemData.Type == constant.ITEM_TYPE_RELIQUARY {
// 排除圣遗物 // 排除圣遗物
continue continue
} }
@@ -111,7 +111,7 @@ func (g *GameManager) AddUserItem(userId uint32, itemList []*ChangeItem, isHint
if isHint { if isHint {
if hintReason == 0 { if hintReason == 0 {
hintReason = constant.ActionReasonSubfieldDrop hintReason = uint16(proto.ActionReasonType_ACTION_REASON_SUBFIELD_DROP)
} }
itemAddHintNotify := &proto.ItemAddHintNotify{ itemAddHintNotify := &proto.ItemAddHintNotify{
Reason: uint32(hintReason), Reason: uint32(hintReason),

View File

@@ -215,7 +215,7 @@ func (g *GameManager) PacketPlayerStoreNotify(player *model.Player) *proto.Playe
logger.Error("get item data config is nil, itemId: %v", weapon.ItemId) logger.Error("get item data config is nil, itemId: %v", weapon.ItemId)
continue continue
} }
if uint16(itemDataConfig.Type) != constant.ITEM_TYPE_WEAPON { if itemDataConfig.Type != constant.ITEM_TYPE_WEAPON {
continue continue
} }
affixMap := make(map[uint32]uint32) affixMap := make(map[uint32]uint32)
@@ -247,7 +247,7 @@ func (g *GameManager) PacketPlayerStoreNotify(player *model.Player) *proto.Playe
logger.Error("get item data config is nil, itemId: %v", reliquary.ItemId) logger.Error("get item data config is nil, itemId: %v", reliquary.ItemId)
continue continue
} }
if uint16(itemDataConfig.Type) != constant.ITEM_TYPE_RELIQUARY { if itemDataConfig.Type != constant.ITEM_TYPE_RELIQUARY {
continue continue
} }
pbItem := &proto.Item{ pbItem := &proto.Item{
@@ -281,7 +281,7 @@ func (g *GameManager) PacketPlayerStoreNotify(player *model.Player) *proto.Playe
Guid: item.Guid, Guid: item.Guid,
Detail: nil, Detail: nil,
} }
if itemDataConfig != nil && uint16(itemDataConfig.Type) == constant.ITEM_TYPE_FURNITURE { if itemDataConfig != nil && itemDataConfig.Type == constant.ITEM_TYPE_FURNITURE {
pbItem.Detail = &proto.Item_Furniture{ pbItem.Detail = &proto.Item_Furniture{
Furniture: &proto.Furniture{ Furniture: &proto.Furniture{
Count: item.Count, Count: item.Count,

View File

@@ -3,7 +3,6 @@ package game
import ( import (
"strconv" "strconv"
"hk4e/common/constant"
"hk4e/gdconf" "hk4e/gdconf"
"hk4e/gs/model" "hk4e/gs/model"
"hk4e/pkg/logger" "hk4e/pkg/logger"
@@ -25,7 +24,7 @@ func (g *GameManager) SceneTransToPointReq(player *model.Player, payloadMsg pb.M
// 传送玩家 // 传送玩家
sceneId := req.SceneId sceneId := req.SceneId
g.TeleportPlayer(player, constant.EnterReasonTransPoint, sceneId, &model.Vector{ g.TeleportPlayer(player, uint16(proto.EnterReason_ENTER_REASON_TRANS_POINT), sceneId, &model.Vector{
X: pointDataConfig.TranPos.X, X: pointDataConfig.TranPos.X,
Y: pointDataConfig.TranPos.Y, Y: pointDataConfig.TranPos.Y,
Z: pointDataConfig.TranPos.Z, Z: pointDataConfig.TranPos.Z,
@@ -55,7 +54,7 @@ func (g *GameManager) MarkMapReq(player *model.Player, payloadMsg pb.Message) {
posYInt = 300 posYInt = 300
} }
// 传送玩家 // 传送玩家
g.TeleportPlayer(player, constant.EnterReasonGm, req.Mark.SceneId, &model.Vector{ g.TeleportPlayer(player, uint16(proto.EnterReason_ENTER_REASON_GM), req.Mark.SceneId, &model.Vector{
X: float64(req.Mark.Pos.X), X: float64(req.Mark.Pos.X),
Y: float64(posYInt), Y: float64(posYInt),
Z: float64(req.Mark.Pos.Z), Z: float64(req.Mark.Pos.Z),
@@ -110,8 +109,8 @@ func (g *GameManager) TeleportPlayer(player *model.Player, enterReason uint16, s
var enterType proto.EnterType var enterType proto.EnterType
switch enterReason { switch enterReason {
case constant.EnterReasonDungeonEnter: case uint16(proto.EnterReason_ENTER_REASON_DUNGEON_ENTER):
logger.Debug("player dungeon scene, scene: %v, pos: %v", player.SceneId, player.Pos) logger.Debug("player tp to dungeon scene, sceneId: %v, pos: %v", player.SceneId, player.Pos)
enterType = proto.EnterType_ENTER_DUNGEON enterType = proto.EnterType_ENTER_DUNGEON
default: default:
if jumpScene { if jumpScene {

View File

@@ -340,7 +340,7 @@ func (g *GameManager) HostEnterMpWorld(hostPlayer *model.Player, otherUid uint32
hostPlayer, hostPlayer,
hostPlayer, hostPlayer,
proto.EnterType_ENTER_GOTO, proto.EnterType_ENTER_GOTO,
uint32(constant.EnterReasonHostFromSingleToMp), uint32(proto.EnterReason_ENTER_REASON_HOST_FROM_SINGLE_TO_MP),
hostPlayer.SceneId, hostPlayer.SceneId,
hostPlayer.Pos, hostPlayer.Pos,
0, 0,

View File

@@ -72,7 +72,7 @@ func (g *GameManager) AcceptQuest(player *model.Player, isNtfClient bool) {
canAccept := true canAccept := true
for _, acceptCond := range questData.AcceptCondList { for _, acceptCond := range questData.AcceptCondList {
switch acceptCond.Type { switch acceptCond.Type {
case constant.QUEST_ACCEPT_COND_TYPE_QUEST_STATE_EQ: case constant.QUEST_ACCEPT_COND_TYPE_STATE_EQUAL:
// 某个任务状态等于 参数1:任务id 参数2:任务状态 // 某个任务状态等于 参数1:任务id 参数2:任务状态
if len(acceptCond.Param) != 2 { if len(acceptCond.Param) != 2 {
logger.Error("quest accept cond config format error, questId: %v", questData.QuestId) logger.Error("quest accept cond config format error, questId: %v", questData.QuestId)
@@ -84,7 +84,7 @@ func (g *GameManager) AcceptQuest(player *model.Player, isNtfClient bool) {
canAccept = false canAccept = false
break break
} }
if quest.State != uint32(acceptCond.Param[1]) { if quest.State != uint8(acceptCond.Param[1]) {
canAccept = false canAccept = false
break break
} }
@@ -130,7 +130,7 @@ func (g *GameManager) PacketQuest(player *model.Player, questId uint32) *proto.Q
} }
pbQuest := &proto.Quest{ pbQuest := &proto.Quest{
QuestId: quest.QuestId, QuestId: quest.QuestId,
State: quest.State, State: uint32(quest.State),
StartTime: quest.StartTime, StartTime: quest.StartTime,
ParentQuestId: uint32(questDataConfig.ParentQuestId), ParentQuestId: uint32(questDataConfig.ParentQuestId),
StartGameTime: 0, StartGameTime: 0,

View File

@@ -12,7 +12,7 @@ import (
func (g *GameManager) GetAllReliquaryDataConfig() map[int32]*gdconf.ItemData { func (g *GameManager) GetAllReliquaryDataConfig() map[int32]*gdconf.ItemData {
allReliquaryDataConfig := make(map[int32]*gdconf.ItemData) allReliquaryDataConfig := make(map[int32]*gdconf.ItemData)
for itemId, itemData := range gdconf.GetItemDataMap() { for itemId, itemData := range gdconf.GetItemDataMap() {
if uint16(itemData.Type) != constant.ITEM_TYPE_RELIQUARY { if itemData.Type != constant.ITEM_TYPE_RELIQUARY {
continue continue
} }
if (itemId >= 20002 && itemId <= 20004) || if (itemId >= 20002 && itemId <= 20004) ||

View File

@@ -19,6 +19,7 @@ import (
const ( const (
ENTITY_MAX_BATCH_SEND_NUM = 1000 // 单次同步的最大实体数量 ENTITY_MAX_BATCH_SEND_NUM = 1000 // 单次同步的最大实体数量
ENTITY_LOD = 300 // 实体加载视野距离
) )
func (g *GameManager) EnterSceneReadyReq(player *model.Player, payloadMsg pb.Message) { func (g *GameManager) EnterSceneReadyReq(player *model.Player, payloadMsg pb.Message) {
@@ -172,7 +173,7 @@ func (g *GameManager) SceneInitFinishReq(player *model.Player, payloadMsg pb.Mes
sceneAreaWeatherNotify := &proto.SceneAreaWeatherNotify{ sceneAreaWeatherNotify := &proto.SceneAreaWeatherNotify{
WeatherAreaId: 0, WeatherAreaId: 0,
ClimateType: uint32(constant.CLIMATE_TYPE_SUNNY), ClimateType: constant.CLIMATE_TYPE_SUNNY,
} }
g.SendMsg(cmd.SceneAreaWeatherNotify, player.PlayerID, player.ClientSeq, sceneAreaWeatherNotify) g.SendMsg(cmd.SceneAreaWeatherNotify, player.PlayerID, player.ClientSeq, sceneAreaWeatherNotify)
} }
@@ -272,8 +273,21 @@ func (g *GameManager) EnterSceneDoneReq(player *model.Player, payloadMsg pb.Mess
aoiManager, exist := WORLD_MANAGER.GetSceneBlockAoiMap()[scene.GetId()] aoiManager, exist := WORLD_MANAGER.GetSceneBlockAoiMap()[scene.GetId()]
if exist { if exist {
objectList := aoiManager.GetObjectListByPos(float32(player.Pos.X), 0.0, float32(player.Pos.Z)) objectList := aoiManager.GetObjectListByPos(float32(player.Pos.X), 0.0, float32(player.Pos.Z))
for objectId, entityConfig := range objectList { for _, groupAny := range objectList {
g.CreateConfigEntity(scene, objectId, entityConfig) group := groupAny.(*gdconf.Group)
distance2D := math.Sqrt(math.Pow(player.Pos.X-float64(group.Pos.X), 2.0) + math.Pow(player.Pos.Z-float64(group.Pos.Z), 2.0))
if distance2D > ENTITY_LOD {
continue
}
for _, monster := range group.MonsterList {
g.CreateConfigEntity(scene, monster.ObjectId, monster)
}
for _, npc := range group.NpcList {
g.CreateConfigEntity(scene, npc.ObjectId, npc)
}
for _, gadget := range group.GadgetList {
g.CreateConfigEntity(scene, gadget.ObjectId, gadget)
}
} }
} }
if player.SceneJump { if player.SceneJump {
@@ -293,7 +307,7 @@ func (g *GameManager) EnterSceneDoneReq(player *model.Player, payloadMsg pb.Mess
sceneAreaWeatherNotify := &proto.SceneAreaWeatherNotify{ sceneAreaWeatherNotify := &proto.SceneAreaWeatherNotify{
WeatherAreaId: 0, WeatherAreaId: 0,
ClimateType: uint32(constant.CLIMATE_TYPE_SUNNY), ClimateType: constant.CLIMATE_TYPE_SUNNY,
} }
g.SendMsg(cmd.SceneAreaWeatherNotify, player.PlayerID, player.ClientSeq, sceneAreaWeatherNotify) g.SendMsg(cmd.SceneAreaWeatherNotify, player.PlayerID, player.ClientSeq, sceneAreaWeatherNotify)
@@ -365,7 +379,7 @@ func (g *GameManager) SceneEntityDrownReq(player *model.Player, payloadMsg pb.Me
} }
// CreateConfigEntity 创建配置表里的实体 // CreateConfigEntity 创建配置表里的实体
func (g *GameManager) CreateConfigEntity(scene *Scene, objectId int64, entityConfig any) uint32 { func (g *GameManager) CreateConfigEntity(scene *Scene, objectId uint64, entityConfig any) uint32 {
switch entityConfig.(type) { switch entityConfig.(type) {
case *gdconf.Monster: case *gdconf.Monster:
monster := entityConfig.(*gdconf.Monster) monster := entityConfig.(*gdconf.Monster)
@@ -438,7 +452,7 @@ func (g *GameManager) PacketPlayerEnterSceneNotifyLogin(player *model.Player, en
TargetUid: player.PlayerID, TargetUid: player.PlayerID,
EnterSceneToken: player.EnterSceneToken, EnterSceneToken: player.EnterSceneToken,
WorldLevel: player.PropertiesMap[constant.PLAYER_PROP_PLAYER_WORLD_LEVEL], WorldLevel: player.PropertiesMap[constant.PLAYER_PROP_PLAYER_WORLD_LEVEL],
EnterReason: uint32(constant.EnterReasonLogin), EnterReason: uint32(proto.EnterReason_ENTER_REASON_LOGIN),
IsFirstLoginEnterScene: true, IsFirstLoginEnterScene: true,
WorldType: 1, WorldType: 1,
SceneTagIdList: make([]uint32, 0), SceneTagIdList: make([]uint32, 0),
@@ -580,7 +594,7 @@ func (g *GameManager) AddSceneEntityNotify(player *model.Player, visionType prot
continue continue
} }
switch entity.GetEntityType() { switch entity.GetEntityType() {
case uint32(proto.ProtEntityType_PROT_ENTITY_AVATAR): case constant.ENTITY_TYPE_AVATAR:
if visionType == proto.VisionType_VISION_MEET && entity.GetAvatarEntity().GetUid() == player.PlayerID { if visionType == proto.VisionType_VISION_MEET && entity.GetAvatarEntity().GetUid() == player.PlayerID {
continue continue
} }
@@ -594,14 +608,14 @@ func (g *GameManager) AddSceneEntityNotify(player *model.Player, visionType prot
} }
sceneEntityInfoAvatar := g.PacketSceneEntityInfoAvatar(scene, scenePlayer, world.GetPlayerActiveAvatarId(scenePlayer)) sceneEntityInfoAvatar := g.PacketSceneEntityInfoAvatar(scene, scenePlayer, world.GetPlayerActiveAvatarId(scenePlayer))
entityList = append(entityList, sceneEntityInfoAvatar) entityList = append(entityList, sceneEntityInfoAvatar)
case uint32(proto.ProtEntityType_PROT_ENTITY_WEAPON): case constant.ENTITY_TYPE_WEAPON:
case uint32(proto.ProtEntityType_PROT_ENTITY_MONSTER): case constant.ENTITY_TYPE_MONSTER:
sceneEntityInfoMonster := g.PacketSceneEntityInfoMonster(scene, entity.GetId()) sceneEntityInfoMonster := g.PacketSceneEntityInfoMonster(scene, entity.GetId())
entityList = append(entityList, sceneEntityInfoMonster) entityList = append(entityList, sceneEntityInfoMonster)
case uint32(proto.ProtEntityType_PROT_ENTITY_NPC): case constant.ENTITY_TYPE_NPC:
sceneEntityInfoNpc := g.PacketSceneEntityInfoNpc(scene, entity.GetId()) sceneEntityInfoNpc := g.PacketSceneEntityInfoNpc(scene, entity.GetId())
entityList = append(entityList, sceneEntityInfoNpc) entityList = append(entityList, sceneEntityInfoNpc)
case uint32(proto.ProtEntityType_PROT_ENTITY_GADGET): case constant.ENTITY_TYPE_GADGET:
sceneEntityInfoGadget := g.PacketSceneEntityInfoGadget(scene, entity.GetId()) sceneEntityInfoGadget := g.PacketSceneEntityInfoGadget(scene, entity.GetId())
entityList = append(entityList, sceneEntityInfoGadget) entityList = append(entityList, sceneEntityInfoGadget)
} }
@@ -628,16 +642,16 @@ func (g *GameManager) EntityFightPropUpdateNotifyBroadcast(scene *Scene, entity
func (g *GameManager) PacketFightPropMapToPbFightPropList(fightPropMap map[uint32]float32) []*proto.FightPropPair { func (g *GameManager) PacketFightPropMapToPbFightPropList(fightPropMap map[uint32]float32) []*proto.FightPropPair {
fightPropList := []*proto.FightPropPair{ fightPropList := []*proto.FightPropPair{
{PropType: uint32(constant.FIGHT_PROP_BASE_HP), PropValue: fightPropMap[uint32(constant.FIGHT_PROP_BASE_HP)]}, {PropType: constant.FIGHT_PROP_BASE_HP, PropValue: fightPropMap[constant.FIGHT_PROP_BASE_HP]},
{PropType: uint32(constant.FIGHT_PROP_BASE_ATTACK), PropValue: fightPropMap[uint32(constant.FIGHT_PROP_BASE_ATTACK)]}, {PropType: constant.FIGHT_PROP_BASE_ATTACK, PropValue: fightPropMap[constant.FIGHT_PROP_BASE_ATTACK]},
{PropType: uint32(constant.FIGHT_PROP_BASE_DEFENSE), PropValue: fightPropMap[uint32(constant.FIGHT_PROP_BASE_DEFENSE)]}, {PropType: constant.FIGHT_PROP_BASE_DEFENSE, PropValue: fightPropMap[constant.FIGHT_PROP_BASE_DEFENSE]},
{PropType: uint32(constant.FIGHT_PROP_CRITICAL), PropValue: fightPropMap[uint32(constant.FIGHT_PROP_CRITICAL)]}, {PropType: constant.FIGHT_PROP_CRITICAL, PropValue: fightPropMap[constant.FIGHT_PROP_CRITICAL]},
{PropType: uint32(constant.FIGHT_PROP_CRITICAL_HURT), PropValue: fightPropMap[uint32(constant.FIGHT_PROP_CRITICAL_HURT)]}, {PropType: constant.FIGHT_PROP_CRITICAL_HURT, PropValue: fightPropMap[constant.FIGHT_PROP_CRITICAL_HURT]},
{PropType: uint32(constant.FIGHT_PROP_CHARGE_EFFICIENCY), PropValue: fightPropMap[uint32(constant.FIGHT_PROP_CHARGE_EFFICIENCY)]}, {PropType: constant.FIGHT_PROP_CHARGE_EFFICIENCY, PropValue: fightPropMap[constant.FIGHT_PROP_CHARGE_EFFICIENCY]},
{PropType: uint32(constant.FIGHT_PROP_CUR_HP), PropValue: fightPropMap[uint32(constant.FIGHT_PROP_CUR_HP)]}, {PropType: constant.FIGHT_PROP_CUR_HP, PropValue: fightPropMap[constant.FIGHT_PROP_CUR_HP]},
{PropType: uint32(constant.FIGHT_PROP_MAX_HP), PropValue: fightPropMap[uint32(constant.FIGHT_PROP_MAX_HP)]}, {PropType: constant.FIGHT_PROP_MAX_HP, PropValue: fightPropMap[constant.FIGHT_PROP_MAX_HP]},
{PropType: uint32(constant.FIGHT_PROP_CUR_ATTACK), PropValue: fightPropMap[uint32(constant.FIGHT_PROP_CUR_ATTACK)]}, {PropType: constant.FIGHT_PROP_CUR_ATTACK, PropValue: fightPropMap[constant.FIGHT_PROP_CUR_ATTACK]},
{PropType: uint32(constant.FIGHT_PROP_CUR_DEFENSE), PropValue: fightPropMap[uint32(constant.FIGHT_PROP_CUR_DEFENSE)]}, {PropType: constant.FIGHT_PROP_CUR_DEFENSE, PropValue: fightPropMap[constant.FIGHT_PROP_CUR_DEFENSE]},
} }
return fightPropList return fightPropList
} }
@@ -1053,21 +1067,21 @@ func (g *GameManager) PacketDelTeamEntityNotify(scene *Scene, player *model.Play
func (g *GameManager) GetTempFightPropMap() map[uint32]float32 { func (g *GameManager) GetTempFightPropMap() map[uint32]float32 {
fpm := map[uint32]float32{ fpm := map[uint32]float32{
uint32(constant.FIGHT_PROP_CUR_HP): float32(72.91699), constant.FIGHT_PROP_CUR_HP: float32(72.91699),
uint32(constant.FIGHT_PROP_PHYSICAL_SUB_HURT): float32(0.1), constant.FIGHT_PROP_PHYSICAL_SUB_HURT: float32(0.1),
uint32(constant.FIGHT_PROP_CUR_DEFENSE): float32(505.0), constant.FIGHT_PROP_CUR_DEFENSE: float32(505.0),
uint32(constant.FIGHT_PROP_CUR_ATTACK): float32(45.679916), constant.FIGHT_PROP_CUR_ATTACK: float32(45.679916),
uint32(constant.FIGHT_PROP_ICE_SUB_HURT): float32(0.1), constant.FIGHT_PROP_ICE_SUB_HURT: float32(0.1),
uint32(constant.FIGHT_PROP_BASE_ATTACK): float32(45.679916), constant.FIGHT_PROP_BASE_ATTACK: float32(45.679916),
uint32(constant.FIGHT_PROP_MAX_HP): float32(72.91699), constant.FIGHT_PROP_MAX_HP: float32(72.91699),
uint32(constant.FIGHT_PROP_FIRE_SUB_HURT): float32(0.1), constant.FIGHT_PROP_FIRE_SUB_HURT: float32(0.1),
uint32(constant.FIGHT_PROP_ELEC_SUB_HURT): float32(0.1), constant.FIGHT_PROP_ELEC_SUB_HURT: float32(0.1),
uint32(constant.FIGHT_PROP_WIND_SUB_HURT): float32(0.1), constant.FIGHT_PROP_WIND_SUB_HURT: float32(0.1),
uint32(constant.FIGHT_PROP_ROCK_SUB_HURT): float32(0.1), constant.FIGHT_PROP_ROCK_SUB_HURT: float32(0.1),
uint32(constant.FIGHT_PROP_GRASS_SUB_HURT): float32(0.1), constant.FIGHT_PROP_GRASS_SUB_HURT: float32(0.1),
uint32(constant.FIGHT_PROP_WATER_SUB_HURT): float32(0.1), constant.FIGHT_PROP_WATER_SUB_HURT: float32(0.1),
uint32(constant.FIGHT_PROP_BASE_HP): float32(72.91699), constant.FIGHT_PROP_BASE_HP: float32(72.91699),
uint32(constant.FIGHT_PROP_BASE_DEFENSE): float32(505.0), constant.FIGHT_PROP_BASE_DEFENSE: float32(505.0),
} }
return fpm return fpm
} }

View File

@@ -3,7 +3,6 @@ package game
import ( import (
"time" "time"
"hk4e/common/constant"
"hk4e/gs/model" "hk4e/gs/model"
"hk4e/pkg/logger" "hk4e/pkg/logger"
"hk4e/protocol/cmd" "hk4e/protocol/cmd"
@@ -92,7 +91,7 @@ func (g *GameManager) BuyGoodsReq(player *model.Player, payloadMsg pb.Message) {
g.AddUserItem(player.PlayerID, []*ChangeItem{{ g.AddUserItem(player.PlayerID, []*ChangeItem{{
ItemId: buyItemId, ItemId: buyItemId,
ChangeCount: buyItemCount, ChangeCount: buyItemCount,
}}, true, constant.ActionReasonShop) }}, true, uint16(proto.ActionReasonType_ACTION_REASON_SHOP))
req.Goods.BoughtNum = dbItem.GetItemCount(player, buyItemId) req.Goods.BoughtNum = dbItem.GetItemCount(player, buyItemId)
buyGoodsRsp := &proto.BuyGoodsRsp{ buyGoodsRsp := &proto.BuyGoodsRsp{

View File

@@ -520,7 +520,7 @@ func (g *GameManager) DrownBackHandler(player *model.Player) {
// } // }
// } // }
// 传送玩家至安全位置 // 传送玩家至安全位置
g.TeleportPlayer(player, constant.EnterReasonRevival, player.SceneId, pos, new(model.Vector), 0) g.TeleportPlayer(player, uint16(proto.EnterReason_ENTER_REASON_REVIVAL), player.SceneId, pos, new(model.Vector), 0)
} }
// 防止重置后又被修改 // 防止重置后又被修改
if player.StaminaInfo.DrownBackDelay != 0 { if player.StaminaInfo.DrownBackDelay != 0 {

View File

@@ -17,7 +17,7 @@ import (
func (g *GameManager) GetAllWeaponDataConfig() map[int32]*gdconf.ItemData { func (g *GameManager) GetAllWeaponDataConfig() map[int32]*gdconf.ItemData {
allWeaponDataConfig := make(map[int32]*gdconf.ItemData) allWeaponDataConfig := make(map[int32]*gdconf.ItemData)
for itemId, itemData := range gdconf.GetItemDataMap() { for itemId, itemData := range gdconf.GetItemDataMap() {
if uint16(itemData.Type) != constant.ITEM_TYPE_WEAPON { if itemData.Type != constant.ITEM_TYPE_WEAPON {
continue continue
} }
if (itemId >= 10000 && itemId <= 10008) || if (itemId >= 10000 && itemId <= 10008) ||
@@ -188,7 +188,7 @@ func (g *GameManager) WeaponAwakenReq(player *model.Player, payloadMsg pb.Messag
} }
// 根据精炼材料的类型做不同操作 // 根据精炼材料的类型做不同操作
switch itemDataConfig.Type { switch itemDataConfig.Type {
case int32(constant.ITEM_TYPE_WEAPON): case constant.ITEM_TYPE_WEAPON:
// 精炼材料为武器 // 精炼材料为武器
// 是否拥有将被用于精炼的武器 // 是否拥有将被用于精炼的武器
foodWeapon, ok := player.GameObjectGuidMap[req.ItemGuid].(*model.Weapon) foodWeapon, ok := player.GameObjectGuidMap[req.ItemGuid].(*model.Weapon)
@@ -211,7 +211,7 @@ func (g *GameManager) WeaponAwakenReq(player *model.Player, payloadMsg pb.Messag
} }
// 消耗作为精炼材料的武器 // 消耗作为精炼材料的武器
g.CostUserWeapon(player.PlayerID, []uint64{foodWeapon.WeaponId}) g.CostUserWeapon(player.PlayerID, []uint64{foodWeapon.WeaponId})
case int32(constant.ITEM_TYPE_MATERIAL): case constant.ITEM_TYPE_MATERIAL:
// 精炼材料为道具 // 精炼材料为道具
// 是否拥有将被用于精炼的道具 // 是否拥有将被用于精炼的道具
item, ok := player.GameObjectGuidMap[req.ItemGuid].(*model.Item) item, ok := player.GameObjectGuidMap[req.ItemGuid].(*model.Item)

View File

@@ -292,7 +292,7 @@ func (t *TickManager) onTick5Second(now int64) {
for _, entityId := range scenePlayer.VehicleInfo.LastCreateEntityIdMap { for _, entityId := range scenePlayer.VehicleInfo.LastCreateEntityIdMap {
entity := scene.GetEntity(entityId) entity := scene.GetEntity(entityId)
// 确保实体类型是否为载具 // 确保实体类型是否为载具
if entity != nil && entity.gadgetEntity != nil && entity.gadgetEntity.gadgetVehicleEntity != nil { if entity != nil && entity.GetEntityType() == constant.ENTITY_TYPE_GADGET && entity.gadgetEntity.gadgetVehicleEntity != nil {
vehicleLocationInfo := &proto.VehicleLocationInfo{ vehicleLocationInfo := &proto.VehicleLocationInfo{
Rot: &proto.Vector{ Rot: &proto.Vector{
X: float32(entity.rot.X), X: float32(entity.rot.X),
@@ -300,7 +300,7 @@ func (t *TickManager) onTick5Second(now int64) {
Z: float32(entity.rot.Z), Z: float32(entity.rot.Z),
}, },
EntityId: entity.id, EntityId: entity.id,
CurHp: entity.fightProp[uint32(constant.FIGHT_PROP_CUR_HP)], CurHp: entity.fightProp[constant.FIGHT_PROP_CUR_HP],
OwnerUid: entity.gadgetEntity.gadgetVehicleEntity.owner.PlayerID, OwnerUid: entity.gadgetEntity.gadgetVehicleEntity.owner.PlayerID,
Pos: &proto.Vector{ Pos: &proto.Vector{
X: float32(entity.pos.X), X: float32(entity.pos.X),
@@ -309,7 +309,7 @@ func (t *TickManager) onTick5Second(now int64) {
}, },
UidList: make([]uint32, 0, len(entity.gadgetEntity.gadgetVehicleEntity.memberMap)), UidList: make([]uint32, 0, len(entity.gadgetEntity.gadgetVehicleEntity.memberMap)),
GadgetId: entity.gadgetEntity.gadgetVehicleEntity.vehicleId, GadgetId: entity.gadgetEntity.gadgetVehicleEntity.vehicleId,
MaxHp: entity.fightProp[uint32(constant.FIGHT_PROP_MAX_HP)], MaxHp: entity.fightProp[constant.FIGHT_PROP_MAX_HP],
} }
for _, p := range entity.gadgetEntity.gadgetVehicleEntity.memberMap { for _, p := range entity.gadgetEntity.gadgetVehicleEntity.memberMap {
vehicleLocationInfo.UidList = append(vehicleLocationInfo.UidList, p.PlayerID) vehicleLocationInfo.UidList = append(vehicleLocationInfo.UidList, p.PlayerID)

View File

@@ -1,7 +1,6 @@
package game package game
import ( import (
"hk4e/pkg/logger"
"image" "image"
"image/color" "image/color"
"image/jpeg" "image/jpeg"
@@ -10,6 +9,8 @@ import (
"sort" "sort"
"strconv" "strconv"
"hk4e/pkg/logger"
"hk4e/gs/model" "hk4e/gs/model"
"hk4e/protocol/proto" "hk4e/protocol/proto"
@@ -215,7 +216,7 @@ func LoadVideoPlayerFile() error {
return nil return nil
} }
var OBJECT_ID_COUNTER int64 = math.MaxUint32 var OBJECT_ID_COUNTER uint64 = math.MaxUint64
func (g *GameManager) VideoPlayerUpdate(rgb bool) { func (g *GameManager) VideoPlayerUpdate(rgb bool) {
err := LoadVideoPlayerFile() err := LoadVideoPlayerFile()

View File

@@ -31,8 +31,85 @@ func NewWorldManager(snowflake *alg.SnowflakeWorker) (r *WorldManager) {
r = new(WorldManager) r = new(WorldManager)
r.worldMap = make(map[uint32]*World) r.worldMap = make(map[uint32]*World)
r.snowflake = snowflake r.snowflake = snowflake
r.sceneBlockAoiMap = make(map[uint32]*alg.AoiManager) r.LoadSceneBlockAoiMap()
r.multiplayerWorldNum = 0
return r
}
func (w *WorldManager) GetWorldByID(worldId uint32) *World {
return w.worldMap[worldId]
}
func (w *WorldManager) GetAllWorld() map[uint32]*World {
return w.worldMap
}
func (w *WorldManager) CreateWorld(owner *model.Player) *World {
worldId := uint32(w.snowflake.GenId())
world := &World{
id: worldId,
owner: owner,
playerMap: make(map[uint32]*model.Player),
sceneMap: make(map[uint32]*Scene),
entityIdCounter: 0,
worldLevel: 0,
multiplayer: false,
mpLevelEntityId: 0,
chatMsgList: make([]*proto.ChatInfo, 0),
playerFirstEnterMap: make(map[uint32]int64),
waitEnterPlayerMap: make(map[uint32]int64),
multiplayerTeam: CreateMultiplayerTeam(),
peerList: make([]*model.Player, 0),
}
world.mpLevelEntityId = world.GetNextWorldEntityId(constant.ENTITY_TYPE_MP_LEVEL)
w.worldMap[worldId] = world
return world
}
func (w *WorldManager) DestroyWorld(worldId uint32) {
world := w.GetWorldByID(worldId)
for _, player := range world.playerMap {
world.RemovePlayer(player)
player.WorldId = 0
}
delete(w.worldMap, worldId)
if world.multiplayer {
w.multiplayerWorldNum--
}
}
// GetAiWorld 获取本服务器的Ai世界
func (w *WorldManager) GetAiWorld() *World {
return w.aiWorld
}
// InitAiWorld 初始化Ai世界
func (w *WorldManager) InitAiWorld(owner *model.Player) {
w.aiWorld = w.GetWorldByID(owner.WorldId)
w.aiWorld.ChangeToMultiplayer()
go RunPlayAudio()
}
func (w *WorldManager) IsAiWorld(world *World) bool {
return world.id == w.aiWorld.id
}
func (w *WorldManager) IsRobotWorld(world *World) bool {
return world.owner.PlayerID < PlayerBaseUid
}
func (w *WorldManager) IsBigWorld(world *World) bool {
return (world.id == w.aiWorld.id) && (w.aiWorld.owner.PlayerID == BigWorldAiUid)
}
func (w *WorldManager) GetSceneBlockAoiMap() map[uint32]*alg.AoiManager {
return w.sceneBlockAoiMap
}
func (w *WorldManager) LoadSceneBlockAoiMap() {
w.sceneBlockAoiMap = make(map[uint32]*alg.AoiManager)
for _, sceneLuaConfig := range gdconf.GetSceneLuaConfigMap() { for _, sceneLuaConfig := range gdconf.GetSceneLuaConfigMap() {
// 检查各block大小是否相同 并提取出block大小
minX := int16(0) minX := int16(0)
maxX := int16(0) maxX := int16(0)
minZ := int16(0) minZ := int16(0)
@@ -83,13 +160,11 @@ func NewWorldManager(snowflake *alg.SnowflakeWorker) (r *WorldManager) {
} }
} }
if !ok { if !ok {
logger.Error("config scene block size not same, scene id: %v", sceneLuaConfig.Id)
continue continue
} }
numX := int16(0) numX := int16(0)
if blockXLen != 0 { if blockXLen != 0 {
if blockXLen > 32 {
blockXLen = 32
}
numX = (maxX - minX) / blockXLen numX = (maxX - minX) / blockXLen
} else { } else {
numX = 1 numX = 1
@@ -99,9 +174,6 @@ func NewWorldManager(snowflake *alg.SnowflakeWorker) (r *WorldManager) {
} }
numZ := int16(0) numZ := int16(0)
if blockZLen != 0 { if blockZLen != 0 {
if blockZLen > 32 {
blockZLen = 32
}
numZ = (maxZ - minZ) / blockZLen numZ = (maxZ - minZ) / blockZLen
} else { } else {
numZ = 1 numZ = 1
@@ -109,105 +181,20 @@ func NewWorldManager(snowflake *alg.SnowflakeWorker) (r *WorldManager) {
if numZ == 0 { if numZ == 0 {
numZ = 1 numZ = 1
} }
// 将每个block作为aoi格子 并在格子中放入block拥有的所有group
aoiManager := alg.NewAoiManager() aoiManager := alg.NewAoiManager()
aoiManager.SetAoiRange(minX, maxX, -1.0, 1.0, minZ, maxZ) aoiManager.SetAoiRange(minX, maxX, -1.0, 1.0, minZ, maxZ)
aoiManager.Init3DRectAoiManager(numX, 1, numZ) aoiManager.Init3DRectAoiManager(numX, 1, numZ)
for _, blockConfig := range sceneLuaConfig.BlockMap { for _, block := range sceneLuaConfig.BlockMap {
for _, groupConfig := range blockConfig.GroupMap { for _, group := range block.GroupMap {
for _, monsterConfig := range groupConfig.MonsterList { aoiManager.AddObjectToGridByPos(int64(group.Id), group,
aoiManager.AddObjectToGridByPos(r.snowflake.GenId(), monsterConfig, group.Pos.X,
float32(monsterConfig.Pos.X), 0.0,
float32(0.0), group.Pos.Z)
float32(monsterConfig.Pos.Z))
}
for _, npcConfig := range groupConfig.NpcList {
aoiManager.AddObjectToGridByPos(r.snowflake.GenId(), npcConfig,
float32(npcConfig.Pos.X),
float32(0.0),
float32(npcConfig.Pos.Z))
}
for _, gadgetConfig := range groupConfig.GadgetList {
aoiManager.AddObjectToGridByPos(r.snowflake.GenId(), gadgetConfig,
float32(gadgetConfig.Pos.X),
float32(0.0),
float32(gadgetConfig.Pos.Z))
}
} }
} }
r.sceneBlockAoiMap[uint32(sceneLuaConfig.Id)] = aoiManager w.sceneBlockAoiMap[uint32(sceneLuaConfig.Id)] = aoiManager
} }
r.multiplayerWorldNum = 0
return r
}
func (w *WorldManager) GetWorldByID(worldId uint32) *World {
return w.worldMap[worldId]
}
func (w *WorldManager) GetAllWorld() map[uint32]*World {
return w.worldMap
}
func (w *WorldManager) CreateWorld(owner *model.Player) *World {
worldId := uint32(w.snowflake.GenId())
world := &World{
id: worldId,
owner: owner,
playerMap: make(map[uint32]*model.Player),
sceneMap: make(map[uint32]*Scene),
entityIdCounter: 0,
worldLevel: 0,
multiplayer: false,
mpLevelEntityId: 0,
chatMsgList: make([]*proto.ChatInfo, 0),
playerFirstEnterMap: make(map[uint32]int64),
waitEnterPlayerMap: make(map[uint32]int64),
multiplayerTeam: CreateMultiplayerTeam(),
peerList: make([]*model.Player, 0),
}
world.mpLevelEntityId = world.GetNextWorldEntityId(constant.ENTITY_ID_TYPE_MPLEVEL)
w.worldMap[worldId] = world
return world
}
func (w *WorldManager) DestroyWorld(worldId uint32) {
world := w.GetWorldByID(worldId)
for _, player := range world.playerMap {
world.RemovePlayer(player)
player.WorldId = 0
}
delete(w.worldMap, worldId)
if world.multiplayer {
w.multiplayerWorldNum--
}
}
// GetAiWorld 获取本服务器的Ai世界
func (w *WorldManager) GetAiWorld() *World {
return w.aiWorld
}
// InitAiWorld 初始化Ai世界
func (w *WorldManager) InitAiWorld(owner *model.Player) {
w.aiWorld = w.GetWorldByID(owner.WorldId)
w.aiWorld.ChangeToMultiplayer()
go RunPlayAudio()
}
func (w *WorldManager) IsAiWorld(world *World) bool {
return world.id == w.aiWorld.id
}
func (w *WorldManager) IsRobotWorld(world *World) bool {
return world.owner.PlayerID < PlayerBaseUid
}
func (w *WorldManager) IsBigWorld(world *World) bool {
return (world.id == w.aiWorld.id) && (w.aiWorld.owner.PlayerID == BigWorldAiUid)
}
func (w *WorldManager) GetSceneBlockAoiMap() map[uint32]*alg.AoiManager {
return w.sceneBlockAoiMap
} }
func (w *WorldManager) GetMultiplayerWorldNum() uint32 { func (w *WorldManager) GetMultiplayerWorldNum() uint32 {
@@ -259,7 +246,7 @@ func (w *World) GetMpLevelEntityId() uint32 {
return w.mpLevelEntityId return w.mpLevelEntityId
} }
func (w *World) GetNextWorldEntityId(entityType uint16) uint32 { func (w *World) GetNextWorldEntityId(entityType uint8) uint32 {
for { for {
w.entityIdCounter++ w.entityIdCounter++
ret := (uint32(entityType) << 24) + w.entityIdCounter ret := (uint32(entityType) << 24) + w.entityIdCounter
@@ -484,7 +471,7 @@ func (w *World) GetPlayerTeamEntityId(player *model.Player) uint32 {
// InitPlayerTeamEntityId 初始化某玩家的本地队伍实体id // InitPlayerTeamEntityId 初始化某玩家的本地队伍实体id
func (w *World) InitPlayerTeamEntityId(player *model.Player) { func (w *World) InitPlayerTeamEntityId(player *model.Player) {
w.multiplayerTeam.localTeamEntityMap[player.PlayerID] = w.GetNextWorldEntityId(constant.ENTITY_ID_TYPE_TEAM) w.multiplayerTeam.localTeamEntityMap[player.PlayerID] = w.GetNextWorldEntityId(constant.ENTITY_TYPE_TEAM)
} }
// GetPlayerWorldAvatarEntityId 获取某玩家在世界队伍中的某角色的实体id // GetPlayerWorldAvatarEntityId 获取某玩家在世界队伍中的某角色的实体id
@@ -735,7 +722,7 @@ func (w *World) CreateScene(sceneId uint32) *Scene {
world: w, world: w,
playerMap: make(map[uint32]*model.Player), playerMap: make(map[uint32]*model.Player),
entityMap: make(map[uint32]*Entity), entityMap: make(map[uint32]*Entity),
objectIdEntityMap: make(map[int64]*Entity), objectIdEntityMap: make(map[uint64]*Entity),
gameTime: 18 * 60, gameTime: 18 * 60,
createTime: time.Now().UnixMilli(), createTime: time.Now().UnixMilli(),
meeoIndex: 0, meeoIndex: 0,
@@ -745,6 +732,7 @@ func (w *World) CreateScene(sceneId uint32) *Scene {
} }
func (w *World) GetSceneById(sceneId uint32) *Scene { func (w *World) GetSceneById(sceneId uint32) *Scene {
// 场景是取时创建 可以简化代码不判空
scene, exist := w.sceneMap[sceneId] scene, exist := w.sceneMap[sceneId]
if !exist { if !exist {
scene = w.CreateScene(sceneId) scene = w.CreateScene(sceneId)

View File

@@ -18,10 +18,10 @@ type Scene struct {
world *World world *World
playerMap map[uint32]*model.Player playerMap map[uint32]*model.Player
entityMap map[uint32]*Entity entityMap map[uint32]*Entity
objectIdEntityMap map[int64]*Entity // 用于标识配置档里的唯一实体是否已被创建 objectIdEntityMap map[uint64]*Entity // 用于标识配置档里的唯一实体是否已被创建
gameTime uint32 // 游戏内提瓦特大陆的时间 gameTime uint32 // 游戏内提瓦特大陆的时间
createTime int64 // 场景创建时间 createTime int64 // 场景创建时间
meeoIndex uint32 // 客户端风元素染色同步协议的计数器 meeoIndex uint32 // 客户端风元素染色同步协议的计数器
} }
func (s *Scene) GetId() uint32 { func (s *Scene) GetId() uint32 {
@@ -80,7 +80,7 @@ func (s *Scene) RemovePlayer(player *model.Player) {
} }
func (s *Scene) SetEntityLifeState(entity *Entity, lifeState uint16, dieType proto.PlayerDieType) { func (s *Scene) SetEntityLifeState(entity *Entity, lifeState uint16, dieType proto.PlayerDieType) {
if entity.avatarEntity != nil { if entity.GetEntityType() == constant.ENTITY_TYPE_AVATAR {
// 获取玩家对象 // 获取玩家对象
player := USER_MANAGER.GetOnlineUser(entity.avatarEntity.uid) player := USER_MANAGER.GetOnlineUser(entity.avatarEntity.uid)
if player == nil { if player == nil {
@@ -98,8 +98,8 @@ func (s *Scene) SetEntityLifeState(entity *Entity, lifeState uint16, dieType pro
if lifeState == constant.LIFE_STATE_REVIVE { if lifeState == constant.LIFE_STATE_REVIVE {
avatar.LifeState = constant.LIFE_STATE_ALIVE avatar.LifeState = constant.LIFE_STATE_ALIVE
// 设置血量 // 设置血量
entity.fightProp[uint32(constant.FIGHT_PROP_CUR_HP)] = 110 entity.fightProp[constant.FIGHT_PROP_CUR_HP] = 110
GAME_MANAGER.EntityFightPropUpdateNotifyBroadcast(s, entity, uint32(constant.FIGHT_PROP_CUR_HP)) GAME_MANAGER.EntityFightPropUpdateNotifyBroadcast(s, entity, constant.FIGHT_PROP_CUR_HP)
} }
avatarLifeStateChangeNotify := &proto.AvatarLifeStateChangeNotify{ avatarLifeStateChangeNotify := &proto.AvatarLifeStateChangeNotify{
@@ -118,8 +118,8 @@ func (s *Scene) SetEntityLifeState(entity *Entity, lifeState uint16, dieType pro
if lifeState == constant.LIFE_STATE_DEAD { if lifeState == constant.LIFE_STATE_DEAD {
// 设置血量 // 设置血量
entity.fightProp[uint32(constant.FIGHT_PROP_CUR_HP)] = 0 entity.fightProp[constant.FIGHT_PROP_CUR_HP] = 0
GAME_MANAGER.EntityFightPropUpdateNotifyBroadcast(s, entity, uint32(constant.FIGHT_PROP_CUR_HP)) GAME_MANAGER.EntityFightPropUpdateNotifyBroadcast(s, entity, constant.FIGHT_PROP_CUR_HP)
} }
lifeStateChangeNotify := &proto.LifeStateChangeNotify{ lifeStateChangeNotify := &proto.LifeStateChangeNotify{
@@ -139,7 +139,7 @@ func (s *Scene) SetEntityLifeState(entity *Entity, lifeState uint16, dieType pro
} }
func (s *Scene) CreateEntityAvatar(player *model.Player, avatarId uint32) uint32 { func (s *Scene) CreateEntityAvatar(player *model.Player, avatarId uint32) uint32 {
entityId := s.world.GetNextWorldEntityId(constant.ENTITY_ID_TYPE_AVATAR) entityId := s.world.GetNextWorldEntityId(constant.ENTITY_TYPE_AVATAR)
dbAvatar := player.GetDbAvatar() dbAvatar := player.GetDbAvatar()
avatar, ok := dbAvatar.AvatarMap[avatarId] avatar, ok := dbAvatar.AvatarMap[avatarId]
if !ok { if !ok {
@@ -156,7 +156,7 @@ func (s *Scene) CreateEntityAvatar(player *model.Player, avatarId uint32) uint32
lastMoveSceneTimeMs: 0, lastMoveSceneTimeMs: 0,
lastMoveReliableSeq: 0, lastMoveReliableSeq: 0,
fightProp: dbAvatar.AvatarMap[avatarId].FightPropMap, // 使用角色结构的数据 fightProp: dbAvatar.AvatarMap[avatarId].FightPropMap, // 使用角色结构的数据
entityType: uint32(proto.ProtEntityType_PROT_ENTITY_AVATAR), entityType: constant.ENTITY_TYPE_AVATAR,
avatarEntity: &AvatarEntity{ avatarEntity: &AvatarEntity{
uid: player.PlayerID, uid: player.PlayerID,
avatarId: avatarId, avatarId: avatarId,
@@ -178,7 +178,7 @@ func (s *Scene) CreateEntityAvatar(player *model.Player, avatarId uint32) uint32
} }
func (s *Scene) CreateEntityWeapon() uint32 { func (s *Scene) CreateEntityWeapon() uint32 {
entityId := s.world.GetNextWorldEntityId(constant.ENTITY_ID_TYPE_WEAPON) entityId := s.world.GetNextWorldEntityId(constant.ENTITY_TYPE_WEAPON)
entity := &Entity{ entity := &Entity{
id: entityId, id: entityId,
scene: s, scene: s,
@@ -189,18 +189,18 @@ func (s *Scene) CreateEntityWeapon() uint32 {
lastMoveSceneTimeMs: 0, lastMoveSceneTimeMs: 0,
lastMoveReliableSeq: 0, lastMoveReliableSeq: 0,
fightProp: nil, fightProp: nil,
entityType: uint32(proto.ProtEntityType_PROT_ENTITY_WEAPON), entityType: constant.ENTITY_TYPE_WEAPON,
} }
s.CreateEntity(entity, 0) s.CreateEntity(entity, 0)
return entity.id return entity.id
} }
func (s *Scene) CreateEntityMonster(pos, rot *model.Vector, monsterId uint32, level uint8, fightProp map[uint32]float32, configId uint32, objectId int64) uint32 { func (s *Scene) CreateEntityMonster(pos, rot *model.Vector, monsterId uint32, level uint8, fightProp map[uint32]float32, configId uint32, objectId uint64) uint32 {
_, exist := s.objectIdEntityMap[objectId] _, exist := s.objectIdEntityMap[objectId]
if exist { if exist {
return 0 return 0
} }
entityId := s.world.GetNextWorldEntityId(constant.ENTITY_ID_TYPE_MONSTER) entityId := s.world.GetNextWorldEntityId(constant.ENTITY_TYPE_MONSTER)
entity := &Entity{ entity := &Entity{
id: entityId, id: entityId,
scene: s, scene: s,
@@ -211,7 +211,7 @@ func (s *Scene) CreateEntityMonster(pos, rot *model.Vector, monsterId uint32, le
lastMoveSceneTimeMs: 0, lastMoveSceneTimeMs: 0,
lastMoveReliableSeq: 0, lastMoveReliableSeq: 0,
fightProp: fightProp, fightProp: fightProp,
entityType: uint32(proto.ProtEntityType_PROT_ENTITY_MONSTER), entityType: constant.ENTITY_TYPE_MONSTER,
level: level, level: level,
monsterEntity: &MonsterEntity{ monsterEntity: &MonsterEntity{
monsterId: monsterId, monsterId: monsterId,
@@ -232,12 +232,12 @@ func (s *Scene) CreateEntityMonster(pos, rot *model.Vector, monsterId uint32, le
return entity.id return entity.id
} }
func (s *Scene) CreateEntityNpc(pos, rot *model.Vector, npcId, roomId, parentQuestId, blockId, configId uint32, objectId int64) uint32 { func (s *Scene) CreateEntityNpc(pos, rot *model.Vector, npcId, roomId, parentQuestId, blockId, configId uint32, objectId uint64) uint32 {
_, exist := s.objectIdEntityMap[objectId] _, exist := s.objectIdEntityMap[objectId]
if exist { if exist {
return 0 return 0
} }
entityId := s.world.GetNextWorldEntityId(constant.ENTITY_ID_TYPE_NPC) entityId := s.world.GetNextWorldEntityId(constant.ENTITY_TYPE_NPC)
entity := &Entity{ entity := &Entity{
id: entityId, id: entityId,
scene: s, scene: s,
@@ -248,11 +248,11 @@ func (s *Scene) CreateEntityNpc(pos, rot *model.Vector, npcId, roomId, parentQue
lastMoveSceneTimeMs: 0, lastMoveSceneTimeMs: 0,
lastMoveReliableSeq: 0, lastMoveReliableSeq: 0,
fightProp: map[uint32]float32{ fightProp: map[uint32]float32{
uint32(constant.FIGHT_PROP_CUR_HP): math.MaxFloat32, constant.FIGHT_PROP_CUR_HP: math.MaxFloat32,
uint32(constant.FIGHT_PROP_MAX_HP): math.MaxFloat32, constant.FIGHT_PROP_MAX_HP: math.MaxFloat32,
uint32(constant.FIGHT_PROP_BASE_HP): float32(1), constant.FIGHT_PROP_BASE_HP: float32(1),
}, },
entityType: uint32(proto.ProtEntityType_PROT_ENTITY_NPC), entityType: constant.ENTITY_TYPE_NPC,
npcEntity: &NpcEntity{ npcEntity: &NpcEntity{
NpcId: npcId, NpcId: npcId,
RoomId: roomId, RoomId: roomId,
@@ -266,12 +266,12 @@ func (s *Scene) CreateEntityNpc(pos, rot *model.Vector, npcId, roomId, parentQue
return entity.id return entity.id
} }
func (s *Scene) CreateEntityGadgetNormal(pos, rot *model.Vector, gadgetId uint32, configId uint32, objectId int64) uint32 { func (s *Scene) CreateEntityGadgetNormal(pos, rot *model.Vector, gadgetId uint32, configId uint32, objectId uint64) uint32 {
_, exist := s.objectIdEntityMap[objectId] _, exist := s.objectIdEntityMap[objectId]
if exist { if exist {
return 0 return 0
} }
entityId := s.world.GetNextWorldEntityId(constant.ENTITY_ID_TYPE_GADGET) entityId := s.world.GetNextWorldEntityId(constant.ENTITY_TYPE_GADGET)
entity := &Entity{ entity := &Entity{
id: entityId, id: entityId,
scene: s, scene: s,
@@ -282,11 +282,11 @@ func (s *Scene) CreateEntityGadgetNormal(pos, rot *model.Vector, gadgetId uint32
lastMoveSceneTimeMs: 0, lastMoveSceneTimeMs: 0,
lastMoveReliableSeq: 0, lastMoveReliableSeq: 0,
fightProp: map[uint32]float32{ fightProp: map[uint32]float32{
uint32(constant.FIGHT_PROP_CUR_HP): math.MaxFloat32, constant.FIGHT_PROP_CUR_HP: math.MaxFloat32,
uint32(constant.FIGHT_PROP_MAX_HP): math.MaxFloat32, constant.FIGHT_PROP_MAX_HP: math.MaxFloat32,
uint32(constant.FIGHT_PROP_BASE_HP): float32(1), constant.FIGHT_PROP_BASE_HP: float32(1),
}, },
entityType: uint32(proto.ProtEntityType_PROT_ENTITY_GADGET), entityType: constant.ENTITY_TYPE_GADGET,
gadgetEntity: &GadgetEntity{ gadgetEntity: &GadgetEntity{
gadgetId: gadgetId, gadgetId: gadgetId,
gadgetType: GADGET_TYPE_NORMAL, gadgetType: GADGET_TYPE_NORMAL,
@@ -298,12 +298,12 @@ func (s *Scene) CreateEntityGadgetNormal(pos, rot *model.Vector, gadgetId uint32
return entity.id return entity.id
} }
func (s *Scene) CreateEntityGadgetGather(pos, rot *model.Vector, gadgetId uint32, gatherId uint32, configId uint32, objectId int64) uint32 { func (s *Scene) CreateEntityGadgetGather(pos, rot *model.Vector, gadgetId uint32, gatherId uint32, configId uint32, objectId uint64) uint32 {
_, exist := s.objectIdEntityMap[objectId] _, exist := s.objectIdEntityMap[objectId]
if exist { if exist {
return 0 return 0
} }
entityId := s.world.GetNextWorldEntityId(constant.ENTITY_ID_TYPE_GADGET) entityId := s.world.GetNextWorldEntityId(constant.ENTITY_TYPE_GADGET)
entity := &Entity{ entity := &Entity{
id: entityId, id: entityId,
scene: s, scene: s,
@@ -314,11 +314,11 @@ func (s *Scene) CreateEntityGadgetGather(pos, rot *model.Vector, gadgetId uint32
lastMoveSceneTimeMs: 0, lastMoveSceneTimeMs: 0,
lastMoveReliableSeq: 0, lastMoveReliableSeq: 0,
fightProp: map[uint32]float32{ fightProp: map[uint32]float32{
uint32(constant.FIGHT_PROP_CUR_HP): math.MaxFloat32, constant.FIGHT_PROP_CUR_HP: math.MaxFloat32,
uint32(constant.FIGHT_PROP_MAX_HP): math.MaxFloat32, constant.FIGHT_PROP_MAX_HP: math.MaxFloat32,
uint32(constant.FIGHT_PROP_BASE_HP): float32(1), constant.FIGHT_PROP_BASE_HP: float32(1),
}, },
entityType: uint32(proto.ProtEntityType_PROT_ENTITY_GADGET), entityType: constant.ENTITY_TYPE_GADGET,
gadgetEntity: &GadgetEntity{ gadgetEntity: &GadgetEntity{
gadgetId: gadgetId, gadgetId: gadgetId,
gadgetType: GADGET_TYPE_GATHER, gadgetType: GADGET_TYPE_GATHER,
@@ -344,11 +344,11 @@ func (s *Scene) CreateEntityGadgetClient(pos, rot *model.Vector, entityId uint32
lastMoveSceneTimeMs: 0, lastMoveSceneTimeMs: 0,
lastMoveReliableSeq: 0, lastMoveReliableSeq: 0,
fightProp: map[uint32]float32{ fightProp: map[uint32]float32{
uint32(constant.FIGHT_PROP_CUR_HP): math.MaxFloat32, constant.FIGHT_PROP_CUR_HP: math.MaxFloat32,
uint32(constant.FIGHT_PROP_MAX_HP): math.MaxFloat32, constant.FIGHT_PROP_MAX_HP: math.MaxFloat32,
uint32(constant.FIGHT_PROP_BASE_HP): float32(1), constant.FIGHT_PROP_BASE_HP: float32(1),
}, },
entityType: uint32(proto.ProtEntityType_PROT_ENTITY_GADGET), entityType: constant.ENTITY_TYPE_GADGET,
gadgetEntity: &GadgetEntity{ gadgetEntity: &GadgetEntity{
gadgetType: GADGET_TYPE_CLIENT, gadgetType: GADGET_TYPE_CLIENT,
gadgetClientEntity: &GadgetClientEntity{ gadgetClientEntity: &GadgetClientEntity{
@@ -370,7 +370,7 @@ func (s *Scene) CreateEntityGadgetVehicle(uid uint32, pos, rot *model.Vector, ve
logger.Error("player is nil, uid: %v", uid) logger.Error("player is nil, uid: %v", uid)
return 0 return 0
} }
entityId := s.world.GetNextWorldEntityId(constant.ENTITY_ID_TYPE_GADGET) entityId := s.world.GetNextWorldEntityId(constant.ENTITY_TYPE_GADGET)
entity := &Entity{ entity := &Entity{
id: entityId, id: entityId,
scene: s, scene: s,
@@ -382,11 +382,11 @@ func (s *Scene) CreateEntityGadgetVehicle(uid uint32, pos, rot *model.Vector, ve
lastMoveReliableSeq: 0, lastMoveReliableSeq: 0,
fightProp: map[uint32]float32{ fightProp: map[uint32]float32{
// TODO 以后使用配置表 // TODO 以后使用配置表
uint32(constant.FIGHT_PROP_CUR_HP): 114514, constant.FIGHT_PROP_CUR_HP: 114514,
uint32(constant.FIGHT_PROP_MAX_HP): 114514, constant.FIGHT_PROP_MAX_HP: 114514,
uint32(constant.FIGHT_PROP_BASE_HP): float32(1), constant.FIGHT_PROP_BASE_HP: float32(1),
}, },
entityType: uint32(proto.ProtEntityType_PROT_ENTITY_GADGET), entityType: constant.ENTITY_TYPE_GADGET,
gadgetEntity: &GadgetEntity{ gadgetEntity: &GadgetEntity{
gadgetType: GADGET_TYPE_VEHICLE, gadgetType: GADGET_TYPE_VEHICLE,
gadgetVehicleEntity: &GadgetVehicleEntity{ gadgetVehicleEntity: &GadgetVehicleEntity{
@@ -402,7 +402,7 @@ func (s *Scene) CreateEntityGadgetVehicle(uid uint32, pos, rot *model.Vector, ve
return entity.id return entity.id
} }
func (s *Scene) CreateEntity(entity *Entity, objectId int64) { func (s *Scene) CreateEntity(entity *Entity, objectId uint64) {
if len(s.entityMap) >= ENTITY_MAX_SEND_NUM && !ENTITY_NUM_UNLIMIT { if len(s.entityMap) >= ENTITY_MAX_SEND_NUM && !ENTITY_NUM_UNLIMIT {
logger.Error("above max scene entity num limit: %v, id: %v, pos: %v", ENTITY_MAX_SEND_NUM, entity.id, entity.pos) logger.Error("above max scene entity num limit: %v, id: %v, pos: %v", ENTITY_MAX_SEND_NUM, entity.id, entity.pos)
return return
@@ -434,29 +434,29 @@ func (s *Scene) GetEntity(entityId uint32) *Entity {
return s.entityMap[entityId] return s.entityMap[entityId]
} }
func (s *Scene) GetEntityByObjectId(objectId int64) *Entity { func (s *Scene) GetEntityByObjectId(objectId uint64) *Entity {
return s.objectIdEntityMap[objectId] return s.objectIdEntityMap[objectId]
} }
// Entity 场景实体数据结构 // Entity 场景实体数据结构
type Entity struct { type Entity struct {
id uint32 id uint32 // 实体id
scene *Scene scene *Scene // 实体归属上级场景的访问指针
lifeState uint16 lifeState uint16 // 存活状态
pos *model.Vector pos *model.Vector // 位置
rot *model.Vector rot *model.Vector // 朝向
moveState uint16 moveState uint16 // 运动状态
lastMoveSceneTimeMs uint32 lastMoveSceneTimeMs uint32
lastMoveReliableSeq uint32 lastMoveReliableSeq uint32
fightProp map[uint32]float32 fightProp map[uint32]float32 // 战斗属性
entityType uint32 level uint8 // 等级
level uint8 entityType uint8 // 实体类型
avatarEntity *AvatarEntity avatarEntity *AvatarEntity
monsterEntity *MonsterEntity monsterEntity *MonsterEntity
npcEntity *NpcEntity npcEntity *NpcEntity
gadgetEntity *GadgetEntity gadgetEntity *GadgetEntity
configId uint32 configId uint32 // 配置表相关
objectId int64 objectId uint64
} }
func (e *Entity) GetId() uint32 { func (e *Entity) GetId() uint32 {
@@ -503,14 +503,14 @@ func (e *Entity) GetFightProp() map[uint32]float32 {
return e.fightProp return e.fightProp
} }
func (e *Entity) GetEntityType() uint32 {
return e.entityType
}
func (e *Entity) GetLevel() uint8 { func (e *Entity) GetLevel() uint8 {
return e.level return e.level
} }
func (e *Entity) GetEntityType() uint8 {
return e.entityType
}
func (e *Entity) GetAvatarEntity() *AvatarEntity { func (e *Entity) GetAvatarEntity() *AvatarEntity {
return e.avatarEntity return e.avatarEntity
} }

View File

@@ -30,8 +30,8 @@ type Avatar struct {
Promote uint8 // 突破等阶 Promote uint8 // 突破等阶
Satiation uint32 // 饱食度 Satiation uint32 // 饱食度
SatiationPenalty uint32 // 饱食度溢出 SatiationPenalty uint32 // 饱食度溢出
CurrHP float64 // 当前生命值 CurrHP float32 // 当前生命值
CurrEnergy float64 // 当前元素能量值 CurrEnergy float32 // 当前元素能量值
FetterList []uint32 // 资料解锁条目 FetterList []uint32 // 资料解锁条目
SkillLevelMap map[uint32]uint32 // 技能等级数据 SkillLevelMap map[uint32]uint32 // 技能等级数据
SkillDepotId uint32 // 技能库id SkillDepotId uint32 // 技能库id
@@ -75,22 +75,22 @@ func (a *DbAvatar) InitAvatarFightProp(avatar *Avatar) {
return return
} }
avatar.FightPropMap = make(map[uint32]float32) avatar.FightPropMap = make(map[uint32]float32)
avatar.FightPropMap[uint32(constant.FIGHT_PROP_NONE)] = 0.0 avatar.FightPropMap[constant.FIGHT_PROP_NONE] = 0.0
// 白字攻防血 // 白字攻防血
avatar.FightPropMap[uint32(constant.FIGHT_PROP_BASE_ATTACK)] = float32(avatarDataConfig.GetBaseAttackByLevel(avatar.Level)) avatar.FightPropMap[constant.FIGHT_PROP_BASE_ATTACK] = avatarDataConfig.GetBaseAttackByLevel(avatar.Level)
avatar.FightPropMap[uint32(constant.FIGHT_PROP_BASE_DEFENSE)] = float32(avatarDataConfig.GetBaseDefenseByLevel(avatar.Level)) avatar.FightPropMap[constant.FIGHT_PROP_BASE_DEFENSE] = avatarDataConfig.GetBaseDefenseByLevel(avatar.Level)
avatar.FightPropMap[uint32(constant.FIGHT_PROP_BASE_HP)] = float32(avatarDataConfig.GetBaseHpByLevel(avatar.Level)) avatar.FightPropMap[constant.FIGHT_PROP_BASE_HP] = avatarDataConfig.GetBaseHpByLevel(avatar.Level)
// 白字+绿字攻防血 // 白字+绿字攻防血
avatar.FightPropMap[uint32(constant.FIGHT_PROP_CUR_ATTACK)] = float32(avatarDataConfig.GetBaseAttackByLevel(avatar.Level)) avatar.FightPropMap[constant.FIGHT_PROP_CUR_ATTACK] = avatarDataConfig.GetBaseAttackByLevel(avatar.Level)
avatar.FightPropMap[uint32(constant.FIGHT_PROP_CUR_DEFENSE)] = float32(avatarDataConfig.GetBaseDefenseByLevel(avatar.Level)) avatar.FightPropMap[constant.FIGHT_PROP_CUR_DEFENSE] = avatarDataConfig.GetBaseDefenseByLevel(avatar.Level)
avatar.FightPropMap[uint32(constant.FIGHT_PROP_MAX_HP)] = float32(avatarDataConfig.GetBaseHpByLevel(avatar.Level)) avatar.FightPropMap[constant.FIGHT_PROP_MAX_HP] = avatarDataConfig.GetBaseHpByLevel(avatar.Level)
// 当前血量 // 当前血量
avatar.FightPropMap[uint32(constant.FIGHT_PROP_CUR_HP)] = float32(avatar.CurrHP) avatar.FightPropMap[constant.FIGHT_PROP_CUR_HP] = avatar.CurrHP
// 双暴 // 双暴
avatar.FightPropMap[uint32(constant.FIGHT_PROP_CRITICAL)] = float32(avatarDataConfig.Critical) avatar.FightPropMap[constant.FIGHT_PROP_CRITICAL] = avatarDataConfig.Critical
avatar.FightPropMap[uint32(constant.FIGHT_PROP_CRITICAL_HURT)] = float32(avatarDataConfig.CriticalHurt) avatar.FightPropMap[constant.FIGHT_PROP_CRITICAL_HURT] = avatarDataConfig.CriticalHurt
// 元素充能 // 元素充能
avatar.FightPropMap[uint32(constant.FIGHT_PROP_CHARGE_EFFICIENCY)] = 1.0 avatar.FightPropMap[constant.FIGHT_PROP_CHARGE_EFFICIENCY] = 1.0
a.SetCurrEnergy(avatar, avatar.CurrEnergy, true) a.SetCurrEnergy(avatar, avatar.CurrEnergy, true)
} }
@@ -158,7 +158,7 @@ func (a *DbAvatar) AddAvatar(player *Player, avatarId uint32) {
a.AvatarMap[avatarId] = avatar a.AvatarMap[avatarId] = avatar
} }
func (a *DbAvatar) SetCurrEnergy(avatar *Avatar, value float64, max bool) { func (a *DbAvatar) SetCurrEnergy(avatar *Avatar, value float32, max bool) {
var avatarSkillDataConfig *gdconf.AvatarSkillData = nil var avatarSkillDataConfig *gdconf.AvatarSkillData = nil
if avatar.AvatarId == 10000005 || avatar.AvatarId == 10000007 { if avatar.AvatarId == 10000005 || avatar.AvatarId == 10000007 {
avatarSkillDepotDataConfig := gdconf.GetAvatarSkillDepotDataById(int32(avatar.SkillDepotId)) avatarSkillDepotDataConfig := gdconf.GetAvatarSkillDepotDataById(int32(avatar.SkillDepotId))
@@ -185,7 +185,7 @@ func (a *DbAvatar) SetCurrEnergy(avatar *Avatar, value float64, max bool) {
if max { if max {
avatar.FightPropMap[uint32(elementType.CurrEnergyProp)] = float32(avatarSkillDataConfig.CostElemVal) avatar.FightPropMap[uint32(elementType.CurrEnergyProp)] = float32(avatarSkillDataConfig.CostElemVal)
} else { } else {
avatar.FightPropMap[uint32(elementType.CurrEnergyProp)] = float32(value) avatar.FightPropMap[uint32(elementType.CurrEnergyProp)] = value
} }
} }

View File

@@ -16,7 +16,7 @@ type DbQuest struct {
// Quest 任务 // Quest 任务
type Quest struct { type Quest struct {
QuestId uint32 // 任务id QuestId uint32 // 任务id
State uint32 // 任务状态 State uint8 // 任务状态
AcceptTime uint32 // 接取时间 AcceptTime uint32 // 接取时间
StartTime uint32 // 开始执行时间 StartTime uint32 // 开始执行时间
FinishProgressList []uint32 // 任务进度 FinishProgressList []uint32 // 任务进度
@@ -55,7 +55,7 @@ func (q *DbQuest) AddQuest(questId uint32) {
} }
q.QuestMap[questId] = &Quest{ q.QuestMap[questId] = &Quest{
QuestId: uint32(questDataConfig.QuestId), QuestId: uint32(questDataConfig.QuestId),
State: constant.QUEST_STATE_TYPE_ACCEPT, State: constant.QUEST_STATE_UNSTARTED,
AcceptTime: uint32(time.Now().Unix()), AcceptTime: uint32(time.Now().Unix()),
StartTime: 0, StartTime: 0,
FinishProgressList: nil, FinishProgressList: nil,
@@ -69,7 +69,7 @@ func (q *DbQuest) ExecQuest(questId uint32) {
logger.Error("get quest is nil, questId: %v", questId) logger.Error("get quest is nil, questId: %v", questId)
return return
} }
if quest.State != constant.QUEST_STATE_TYPE_ACCEPT { if quest.State != constant.QUEST_STATE_UNSTARTED {
logger.Error("invalid quest state, questId: %v, state: %v", questId, quest.State) logger.Error("invalid quest state, questId: %v, state: %v", questId, quest.State)
return return
} }
@@ -78,7 +78,7 @@ func (q *DbQuest) ExecQuest(questId uint32) {
logger.Error("get quest data config is nil, questId: %v", questId) logger.Error("get quest data config is nil, questId: %v", questId)
return return
} }
quest.State = constant.QUEST_STATE_TYPE_EXEC quest.State = constant.QUEST_STATE_UNFINISHED
quest.StartTime = uint32(time.Now().Unix()) quest.StartTime = uint32(time.Now().Unix())
quest.FinishProgressList = make([]uint32, len(questDataConfig.FinishCondList)) quest.FinishProgressList = make([]uint32, len(questDataConfig.FinishCondList))
} }
@@ -100,7 +100,7 @@ func (q *DbQuest) AddQuestProgress(questId uint32, index int, progress uint32) {
logger.Error("get quest is nil, questId: %v", questId) logger.Error("get quest is nil, questId: %v", questId)
return return
} }
if quest.State != constant.QUEST_STATE_TYPE_EXEC { if quest.State != constant.QUEST_STATE_UNFINISHED {
logger.Error("invalid quest state, questId: %v, state: %v", questId, quest.State) logger.Error("invalid quest state, questId: %v, state: %v", questId, quest.State)
return return
} }
@@ -115,7 +115,7 @@ func (q *DbQuest) AddQuestProgress(questId uint32, index int, progress uint32) {
} }
quest.FinishProgressList[index] += progress quest.FinishProgressList[index] += progress
if quest.FinishProgressList[index] >= uint32(questDataConfig.FinishCondList[index].Count) { if quest.FinishProgressList[index] >= uint32(questDataConfig.FinishCondList[index].Count) {
quest.State = constant.QUEST_STATE_TYPE_FINISH quest.State = constant.QUEST_STATE_FINISHED
} }
} }