From f1728a045b9fa080bba74fb6992e3ed2237153b0 Mon Sep 17 00:00:00 2001 From: Ggafrik <906823881@qq.com> Date: Wed, 9 Jul 2025 02:01:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- excel/level.xlsx | Bin 9395 -> 9405 bytes src/ReplicatedStorage/Json/Level.json | 2 +- src/ServerStorage/Base/Behaviour.luau | 11 +++++------ src/ServerStorage/Base/Character.luau | 18 +++++++++++------- .../Modules/Behaviours/Move.luau | 4 ++-- src/ServerStorage/Proxy/DamageProxy.luau | 2 +- src/ServerStorage/Proxy/MobsProxy/AI.luau | 4 ++-- src/ServerStorage/Proxy/MobsProxy/init.luau | 10 ++++++---- .../Proxy/PlayerFightProxy/PlayerAI.luau | 3 ++- .../Proxy/PlayerFightProxy/init.luau | 14 +++++++++++--- 10 files changed, 41 insertions(+), 27 deletions(-) diff --git a/excel/level.xlsx b/excel/level.xlsx index 2186fd1f1b99df5a962f8490d1fa19e8e5ef360d..ab519cbc3f9f3d9b5f7bbfb0fd1289e79b7d5438 100644 GIT binary patch delta 2218 zcmV;b2vzs9Nxez1$_51a1>WeB&IT!e`3R5%l~hScv`F0)bzS=ssd9`HyaHynlTcOt z@4JSOG|fxb4uQ?}HOJ@Pdu%SRsys8cR7l2)2ssxvGH5|~!isf-e%(&Z9x|lDMS?S4 z&kPcu5QJthmUr0#mFlSqh4O6PZ$~ z^2~B=JFs%h3e+Hk;yoCAwPJ+EoNRJhs0KvP3@e~7Q&!3rEhq1R%dvRelqTVM2@p$` zG4)h~A|of^Y+Z1Hml=dzIlfT|xC3|`8ydG=30!AO<%|d}`AS^?wAGM4i{G&=$2mzs zb)JLwA$gXdTc&GxU?qYNvI-7=Siup@u|JLGfV66@gpj-sqWK4IE*e~}SVr#}=^D5! zf8bnKDnmwwrJ5v6(Ii4$F!_!i2Oui3DMuTYf!FQzT_0J4gPi9A45epF3;vsb5+xU6Sy{Q|Rqn_`X!)`q7#J%Cr4g41fMg$?@c%#yN zSv7QoJgDKB>pQMmk7I{_8L^}XnT^#OLr=uRF5piQH?XGOwy5i%Vu z+ow}=S3B=nqEb+h-*aI~Gxm+Lbqb7~PT$sY7p`U&p%X@N!)OYZshbl<)+_Pma3j=k8O_}xi78P(;{Cw=%o&bwOdVfzcwEK@Aht-$0FempmH zHNq0~)C2^4L5?kJtNm*57n6|#6tmX}GXe#f&O-kYlMf6re+jm8Xk*1$t-4CPcU4b& zjqx}};ot(!K~>+q18I_#aucm(1BUVU&zPU(!$B*u1LvhR70t&PC18YYq}f#T=a2R1 zBPBj?({N=CRP+d*KCIrqTkfsf`VJrvBp6@OE`+{h%!>{*_hZ|G!IjoJ%>%x=4fDMN z-lUJTVnvqCf0^de&=a9__b_bRN&!z+3>r*0K^!O^Fn{04-k)h&+=J8HZHIm&tnLv} zOC`fGK`GIqeBK!Ac&)JRLq6q#930*SK9jRdn!i!fQaI~v8^%axr<`xgU$6z^;zGKu z|1L~EWe#>SZr~MFye*}Cc3~A)*yN3{`2`k#mn#R^e^m5O_Wv4TpT{Pg=_#yRs*@Uj5v&FcW#lv=te!~iC@L??@mJ%`eVD-x>GEYe+ z;6DJf>?@{x3VA$J@N4e&JO3hlpIwfg!K4fSr2g zZf-qnWGY&~I)N;e@mZ7dn=;3RN=$~m@*CL0ITAkse}biMHDXatTH}~3|1>C(*;xa7 zM3o0PqFjqul#|vzCdc}K>?E?ca}!`ubI*?S3M~*hS(KAlb7opU-&x%C<#8N6!H=u) zuuvZ0NX@l~g{@LY)~s{-eC^vp+_5|^E><2Ea|_SJ?uw+OMJ(z}9NipSHNg_Ou@cU2 zf~vLB34%x;Ma)%s>6^3h4@wIP_Ri4!b^!nYBn6X28!CSjhe+Fj13~cMK~JTJ*k)^R zO=^=(cN>UbhoOj`hk6hNK^VwD!KZ1bZ()YJ=+QWG$v?^O^AM+YkhF{r$pq!h1va#R zL0HHm%9<|N-dbB&28NKBMYzQoaY2^|Q1i+qM+j*sEE6t>rA${45@AddEFez_Q#TEs zC0MF4Ya)M2zi@H7c5qR(Pnh7P3qqV_7dN<};n%_2uz0%5N27A70(ZC& zI$Zm>qvb`?gly1+Y84WvtDLp9a$vcu&5`#H^V4GEy!WP4Xnr)z`!~h#wzz)w{qfbH zIK9YUUq0Rka~8D6_m}f#(R&=9JnQ4c>)&LM<>=?8(1w(r}PX-}4AR!m#*{hVh? z{#$GY;+Cc2=~YCT^aKB2iukJ$q<%T?3zLxp6a^G}oy$hE<{Tyge_v07Fcih#P5cg| z?@-Fz9~)qanmxJ1M2yC_roCfCTAH@X_U$dOA!f$Md(Y|bo_o`DeUNqV1;$p5$`FZS z6oBH5s8pGumtqsHP+%QXg4K}9AJ!(7aWBB|8zil6%`&GkAb+_Vx@>Foj z4KUZ3yyUwSPwMV=HM4H(&%CQZ+#LtYW!qEw&;trY;A7As^jUeG-9Ho?lqWHnhw&ne z=LK0&a!Y47@7>g2@4Hw-L!M^;OH4d*8OE!EEGe1OvppYb0|fa6-sqF7B7p^&&O-kY zlQAP(0Yj6GBR~Q8lg=X`8}`o7{B{8V03-zf02BZK00000000000000qlL;gz8x(t; s%SHhJ09OJ401*HH00000000000002olS?E%0a=rZBqIhVA^-pY0E2oGk^lez delta 2224 zcmV;h2v7IDNwZ0?$_4~L2^yx8&IT!e!6f7Zl~m1_7O9(}u4`W+RgQ6j7r@Lm302kq zzH10c)4X);5ZGK_bA0Z-$L8{?OcQI%q~anA5x#Jd#WE@)o~=Xl>uzfIkfk)qB9e%V zh3JVXbT#<;<#H$FW+}wR0)R|~DAqa;97oZZr9@qboMqry37HZNrd&HJmyASzDrQWl ziQ~C$$4Lp#P>m4C_h5+Cic>Zgv`AT|YY@p2qJh4Od9E6?l)eWpC2~{bHWg_O5KEqL z{ZxS>E2Y6~oe4>n34~o@-zp{C9eA({jn}LMuCt|5PNh&{r7r;5sY##3k6j1jlN6Na zId~sZ+mUR`O$`sMWaopdItQ$O&Jhf|pGLzVtx78aB=3W0{(+l^2A3i4%v0FE+fls4DWg7?|@2D1H=Y$5kh;b^}# zXOLXndd#Q{@Z)oL*!3r^mTM1t)2`hfO^0@W>Q3xVZ#40z-gt;z_XUEHoq!5b=y+dN z10A9^)bPypos^9SyFtN!qa%%HcYoQYf73L+7Zb2K!0tKQsiOdlX_XH=i^MKOHa4<- zIyHBd^MOY?1_k*&52n;(-xy!Vz!!JwPBxFutaJ2t&n~7d>e1GdqC6mCicN1HQT~^MeE4 zrjN8@Wu7mXf9BHAGof;iFl^UJ0nb*98caAt94Hz#FQ3TS~?J$|`TL=^J5-D=hvlSBEn7Z@z&75dcLBN}@kE*6w293r^*T^eG@Bxd?I( zpFpXaHqqk0lL!t`fL#?{k1uLXa`YERTIl$w!dH9v4078Cl$~Ln(I{1WdIm4hp(vb9 zBUD(0F9d9fmUz+@XfS?E{Xw>&ujzc5mGgMmPSI~z!3KP2WW-V;Mjx#Hb&f1jk_q?^ zv+oT80e_@%?W8?nB9o_ci<;TIH6CS|v;mcxwSaX>nC5ZQiRN8~<{fHgebRW8YYwQ? ztOcx7l2&Kv?c_S|QS$~6a6YSseQDM_pIAw%;4HM2Ku<5B*G_UM*%bL(Lv zQ_%v}31q2^&ziK1DRW$?#AMhjzkxlRBk>a;SbyqPBNpYPHIB*hPlFPfoi(sWRC$0S z%C(3^Ice=W9>>uW{J0tq3*`Zh z)Le^L*eZ2o%{r&g*S;;p9n0h5V&!2mxA08tu1HE+#G=l`(ao_{6D*M%E8+Yms9Gy6 zhz0afy1AOO_zy}83J1wHdvpN+0Nw;=9g+&lnG0-a0fVrBhm^Hk zu)DLdv#Uje7WXb^#%5n0}+7qwV{)W!lqanHAGke81 zczP94CjEy0&mxfepS*7XlaT`y1(aV#;6=0V93}yOQBQ*~6oubS{12q>P&&3b8(@i= zJ-Nh0jK;U7y<R&*^v1y=l5W$U67}W2;7Gh(s|8K=DRYs?5+! zu?bfwu#PFg>PA6^j$qL`zrISjro1umWEu^|RbT^8QkHU^p}ljOVr=;yB(srsC@=0B zBboCIr75vy{DYN%XK}p5lb{|wf1C6%e13x8wvW&Ks$r$NTX8^nDmdi^m}^X4@?DB2 zb$7d(S-16P-c=y(j)Ud0?J0fe0R@vt1ul0|Y<` z8m5!AB7p_6V`st&lRG0@0z46uUlA3Pts^P{@srpiARGtDHhXjd007*0002zHy>&M diff --git a/src/ReplicatedStorage/Json/Level.json b/src/ReplicatedStorage/Json/Level.json index 162b75c..bc036d9 100644 --- a/src/ReplicatedStorage/Json/Level.json +++ b/src/ReplicatedStorage/Json/Level.json @@ -1,5 +1,5 @@ [ -{"id":1,"type":1,"timeLimit":null,"atkBonus":1000,"hpBonus":1000,"wave":[[10,1,1,10,2,1],[10,1,1,10,2,1]]}, +{"id":1,"type":1,"timeLimit":null,"atkBonus":1000,"hpBonus":1000,"wave":[[10,1,1]]}, {"id":2,"type":1,"timeLimit":null,"atkBonus":1000,"hpBonus":1000,"wave":[[10,1,1,10,2,1],[10,1,1,10,2,1],[10,1,1,10,2,1],[10,1,1,10,2,1]]}, {"id":3,"type":1,"timeLimit":null,"atkBonus":1000,"hpBonus":1000,"wave":[[10,1,1,10,2,1],[10,1,1,10,2,1]]}, {"id":4,"type":1,"timeLimit":null,"atkBonus":1000,"hpBonus":1000,"wave":[[10,1,1,10,2,1],[10,1,1,10,2,1],[10,1,1,10,2,1],[10,1,1,10,2,1]]}, diff --git a/src/ServerStorage/Base/Behaviour.luau b/src/ServerStorage/Base/Behaviour.luau index fa4d8e1..509c7c7 100644 --- a/src/ServerStorage/Base/Behaviour.luau +++ b/src/ServerStorage/Base/Behaviour.luau @@ -9,8 +9,9 @@ local TypeList = require(script.Parent.TypeList) -- 刷新时,重新载入,暂时不考虑性能 -- 初始化内容 -function Behaviour:Init(Character: TypeList.Character) +function Behaviour:Init(PlayerAI, Character: TypeList.Character) local self = {} + self.PlayerAI = PlayerAI self.Character = Character self.CheckData = nil self.ExeTask = nil @@ -44,18 +45,16 @@ function Behaviour:CheckStat() if self.Character:GetState("Died") then return false end -- 执行状态中检查 - local FightingFolder = self.Character:FindFirstChild("Fighting") - local ExecutingState = FightingFolder:FindFirstChild("ExecutingState") + local ExecutingState = self.PlayerAI.ExecutingState -- 其他内容执行中,就false - if ExecutingState.Value == true then return false end + if ExecutingState == true then return false end return true end -- 改变当前执行状态标记 function Behaviour:ChangeExecutingState(State: boolean) if not self.Character then warn("Behaviour Character not found") return end - local FightingFolder = self.Character:FindFirstChild("Fighting") - local ExecutingState = FightingFolder:FindFirstChild("ExecutingState") + local ExecutingState = self.PlayerAI.ExecutingState ExecutingState.Value = State end diff --git a/src/ServerStorage/Base/Character.luau b/src/ServerStorage/Base/Character.luau index b8394df..f474012 100644 --- a/src/ServerStorage/Base/Character.luau +++ b/src/ServerStorage/Base/Character.luau @@ -5,7 +5,7 @@ Character.__index = Character local TypeList = require(script.Parent.TypeList) local LIMIT_ATTRIBUTE = { - "health" + "hp" } function Character.new(Player: Player, CharacterModel: Model, CharacterData: table): TypeList.Character @@ -36,10 +36,12 @@ function Character.new(Player: Player, CharacterModel: Model, CharacterData: tab Attributes:SetAttribute("max" .. attributeKey, attributeValue) end end - local conAttribute = Attributes.AttributeChanged:Connect(function(attributeKey: string, attributeValue: number) - self:ChangeAttribute(attributeKey, attributeValue) - end) - table.insert(self.Connections, conAttribute) + + -- 通过函数调用了,不绑定事件了 + -- local conAttribute = Attributes.AttributeChanged:Connect(function(attributeKey: string, attributeValue: number) + -- self:ChangeAttributeValue(attributeKey, attributeValue) + -- end) + -- table.insert(self.Connections, conAttribute) -- 配置角色状态数据 local statsData = { @@ -71,7 +73,9 @@ function Character:GetAttributeValue(attributeKey: string) return self.Config[attributeKey], self.Instance.Attributes:GetAttribute(attributeKey) end -function Character:ChangeAttribute(attributeKey: string, value: any) +function Character:ChangeAttributeValue(attributeKey: string, value: any) + if not attributeKey then warn("attributeKey is nil", attributeKey) return end + if not value then warn("value is nil", value) return end local newValue = value -- 限制最大值 if table.find(LIMIT_ATTRIBUTE, attributeKey) then @@ -84,7 +88,7 @@ function Character:ChangeAttribute(attributeKey: string, value: any) self.Instance.Attributes:SetAttribute(attributeKey, newValue) -- 死亡判断 - if attributeKey == "health" and self.Stats.Died == false then + if attributeKey == "hp" and self.Stats.Died == false then if self.Config[attributeKey] <= 0 then self:Died() end diff --git a/src/ServerStorage/Modules/Behaviours/Move.luau b/src/ServerStorage/Modules/Behaviours/Move.luau index dbff437..8e67214 100644 --- a/src/ServerStorage/Modules/Behaviours/Move.luau +++ b/src/ServerStorage/Modules/Behaviours/Move.luau @@ -13,8 +13,8 @@ local MobsProxy = require(ServerStorage.Proxy.MobsProxy) local Move = {} Move.__index = Move -function Move:Init(Character: TypeList.Character, Player: Player) - local self = Behaviour:Init(Character) +function Move:Init(PlayerAI, Character: TypeList.Character, Player: Player) + local self = Behaviour:Init(PlayerAI, Character) self.Player = Player setmetatable(self, Move) return self diff --git a/src/ServerStorage/Proxy/DamageProxy.luau b/src/ServerStorage/Proxy/DamageProxy.luau index c0669ac..7c8bf0e 100644 --- a/src/ServerStorage/Proxy/DamageProxy.luau +++ b/src/ServerStorage/Proxy/DamageProxy.luau @@ -56,7 +56,7 @@ function DamageProxy:TakeDamage(Caster: TypeList.Character, Victim: TypeList.Cha -- 伤害计算 local VictimHealth = Victim:GetAttributeValue("hp") - Victim:ChangeAttribute("hp", math.max(0, VictimHealth - Damage)) + Victim:ChangeAttributeValue("hp", math.max(0, VictimHealth - Damage)) end end diff --git a/src/ServerStorage/Proxy/MobsProxy/AI.luau b/src/ServerStorage/Proxy/MobsProxy/AI.luau index 92b946f..35e4c1a 100644 --- a/src/ServerStorage/Proxy/MobsProxy/AI.luau +++ b/src/ServerStorage/Proxy/MobsProxy/AI.luau @@ -91,9 +91,9 @@ task.defer(function() if not Player then return end if AI:GetModelDistance(MobInstance, Player.Character) <= 5 then -- 调用伤害模块 - DamageProxy:TakeDamage(MobInstance, Player.Character, { + DamageProxy:TakeDamage(Mob, Mob.PlayerRole, { { - Damage = 10, + Damage = Mob.Config.attack, DamageType = DamageProxy.DamageType.PHYSICAL, DamageTag = DamageProxy.DamageTag.NORMAL } diff --git a/src/ServerStorage/Proxy/MobsProxy/init.luau b/src/ServerStorage/Proxy/MobsProxy/init.luau index 4e23130..37d2899 100644 --- a/src/ServerStorage/Proxy/MobsProxy/init.luau +++ b/src/ServerStorage/Proxy/MobsProxy/init.luau @@ -8,7 +8,6 @@ local Players = game:GetService("Players") --> Variables local Utils = require(ReplicatedStorage.Tools.Utils) -local PlayerInfoProxy = require(ServerStorage.Proxy.PlayerInfoProxy) local AI = require(script.AI) local Character = require(ServerStorage.Base.Character) local TypeList = require(ServerStorage.Base.TypeList) @@ -39,7 +38,8 @@ end -------------------------------------------------------------------------------- local Mob = {} -Mob.__index = Character +Mob.__index = Mob +setmetatable(Mob, {__index = Character}) function Mob.new(Player: Player, MobId: number, OnMobDied: ((Player: Player, Mob: TypeList.Character) -> ())?) -- 获取玩家怪物目录 @@ -60,6 +60,8 @@ function Mob.new(Player: Player, MobId: number, OnMobDied: ((Player: Player, Mob -- 调用父类Character的new方法,初始化通用属性 local self = Character.new(Player, newMobModel, MobData) setmetatable(self, Mob) -- 继承Mob方法 + local PlayerFightProxy = require(ServerStorage.Proxy.PlayerFightProxy) + self.PlayerRole = PlayerFightProxy:GetPlayerRole(Player) -- 放入关卡中 newMobModel.Parent = playerMobsFolder @@ -91,8 +93,8 @@ function MobsProxy:CreateMob(Player: Player, MobId: number, AtkBonus: number?, H local Mob = Mob.new(Player, MobId, OnMobDied) AI:StartTracking(Mob) -- 关卡系数 - if AtkBonus then Mob:ChangeAttribute("attack", math.floor(Mob.Config.attack * (AtkBonus / 1000))) end - if HpBonus then Mob:ChangeAttribute("hp", math.floor(Mob.Config.hp * (HpBonus / 1000))) end + -- if AtkBonus then Mob:ChangeAttributeValue("attack", math.floor(Mob.Config.attack * (AtkBonus / 1000))) end + -- if HpBonus then Mob:ChangeAttributeValue("hp", math.floor(Mob.Config.hp * (HpBonus / 1000))) end MobsProxy.pData[Player.UserId][Mob.Instance] = Mob return Mob end diff --git a/src/ServerStorage/Proxy/PlayerFightProxy/PlayerAI.luau b/src/ServerStorage/Proxy/PlayerFightProxy/PlayerAI.luau index 02cb310..ba08f4c 100644 --- a/src/ServerStorage/Proxy/PlayerFightProxy/PlayerAI.luau +++ b/src/ServerStorage/Proxy/PlayerFightProxy/PlayerAI.luau @@ -41,6 +41,7 @@ function PlayerAI.new(Player: Player, PlayerRole: TypeList.Character) setmetatable(self, PlayerAI) self.Character = PlayerRole self.Player = Player + self.ExecutingState = false self.BehaviourList = {} self.LoopTask = task.spawn(function() @@ -75,7 +76,7 @@ end -- 动态添加行为 function PlayerAI:AddBehaviour(BehaviourName: string) if not Behaviours[BehaviourName] then warn("Behaviour not found") return end - local newBehaviour = Behaviours[BehaviourName]:Init(self.Character, self.Player) + local newBehaviour = Behaviours[BehaviourName]:Init(self, self.Character, self.Player) self.BehaviourList[BehaviourName] = newBehaviour end diff --git a/src/ServerStorage/Proxy/PlayerFightProxy/init.luau b/src/ServerStorage/Proxy/PlayerFightProxy/init.luau index 15c679d..87a78aa 100644 --- a/src/ServerStorage/Proxy/PlayerFightProxy/init.luau +++ b/src/ServerStorage/Proxy/PlayerFightProxy/init.luau @@ -30,12 +30,13 @@ end -------------------------------------------------------------------------------- local PlayerRole = {} -PlayerRole.__index = Character +PlayerRole.__index = PlayerRole +setmetatable(PlayerRole, {__index = Character}) function PlayerRole.new(Player: Player, CharacterId: number) local playerCharacter = WaitForCharacter(Player) - -- 获取怪物数据 + -- 获取玩家初始数据 local CharacterData = Utils:GetIdDataFromJson(JsonCharacter, CharacterId) if not CharacterData then warn("CharacterId Data not found", CharacterId) return end @@ -52,7 +53,7 @@ end function PlayerRole:Respawn() self:ChangeState("Died", false) - self:ChangeAttribute("hp", self.Config.maxhp) + self:ChangeAttributeValue("hp", self.Config.maxhp) -- 重置玩家位置 end @@ -79,6 +80,13 @@ function PlayerFightProxy:InitPlayer(Player: Player) PlayerAI:AddBehaviour("Move") end +function PlayerFightProxy:GetPlayerRole(Player: Player) + return PlayerFightProxy.pData[Player.UserId].PlayerRole +end + +function PlayerFightProxy:GetPlayerAI(Player: Player) + return PlayerFightProxy.pData[Player.UserId].PlayerAI +end -- 重置玩家状态,但是不删除 function PlayerFightProxy:CleanPlayer(Player: Player)