From 170d8d28b2787f8d6c661071fc78d3d1354fd8d4 Mon Sep 17 00:00:00 2001 From: gechangfu Date: Tue, 12 Aug 2025 15:09:58 +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/ability.xlsx | Bin 17195 -> 17374 bytes excel/cha.xlsx | Bin 15315 -> 15314 bytes excel/equipment.xlsx | Bin 11095 -> 11458 bytes excel/level.xlsx | Bin 11486 -> 11437 bytes src/ReplicatedStorage/Json/Ability.json | 4 +- src/ReplicatedStorage/Json/Character.json | 2 +- src/ReplicatedStorage/Json/Equipment.json | 32 ++++---- src/ReplicatedStorage/Json/Level.json | 38 ++++----- src/ReplicatedStorage/Tools/Utils.luau | 4 +- src/ServerStorage/Proxy/AbilityProxy.luau | 40 ++++++---- src/ServerStorage/Proxy/ArchiveProxy.luau | 2 +- src/ServerStorage/Proxy/BookProxy.luau | 2 +- src/ServerStorage/Proxy/EquipmentProxy.luau | 42 ++++++++-- src/ServerStorage/Proxy/GemProxy.luau | 2 +- src/ServerStorage/Proxy/MobsProxy/init.luau | 6 +- src/ServerStorage/Proxy/PlayerInfoProxy.luau | 5 +- .../ClientMain/Camera.client.luau | 74 +++++++++--------- 17 files changed, 149 insertions(+), 104 deletions(-) diff --git a/excel/ability.xlsx b/excel/ability.xlsx index 032866438e68b9f1b2a74e9eb3b2d9b3d540220f..daf3b440aa9dfe0ba5a0d346a29d108e6b14ff8b 100644 GIT binary patch delta 4065 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 BDYyUt diff --git a/excel/cha.xlsx b/excel/cha.xlsx index e3f569b5e302650d61ab673a3b2d8af474fd3b57..c6b70c7a697d7d71b469679181024aa837a53899 100644 GIT binary patch delta 3158 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 delta 3190 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 Hf0_LgB~9K` diff --git a/excel/equipment.xlsx b/excel/equipment.xlsx index 3fc0f11ebfbec6bdbd817c43d96d5c4cef554637..3f3c0b8a2f7a71c448cc527a8bff0c2b2c0d1b9d 100644 GIT binary patch delta 5157 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 delta 4734 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 B&=~*# diff --git a/excel/level.xlsx b/excel/level.xlsx index a60ddb8739270d852718214ce93040c62a5d00b4..a22c35d83503b336c1bc72615a7be89325f5b845 100644 GIT binary patch delta 4258 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 aEx08=_FxQ$@XO)eh1c@46VCAdN%%h|nN`vN delta 4309 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 CA37NT diff --git a/src/ReplicatedStorage/Json/Ability.json b/src/ReplicatedStorage/Json/Ability.json index d0bac1e..1660d97 100644 --- a/src/ReplicatedStorage/Json/Ability.json +++ b/src/ReplicatedStorage/Json/Ability.json @@ -1,4 +1,4 @@ [ -{"id":20000,"type":1,"icon":1,"behaviourName":"Attack","upgradeCost":[30000,5,0],"upgradeValue":[10,0],"recycle":[30000,0]}, -{"id":20001,"type":1,"icon":1,"behaviourName":"SwordWave","upgradeCost":[30000,5,10],"upgradeValue":[10,200],"recycle":[30000,100]} +{"id":20000,"type":1,"icon":1,"behaviourName":"Attack","upgradeCost":[30000,5,0],"upgradeValue":[10,0],"recycle":[30000,0],"isInPool":null}, +{"id":20001,"type":1,"icon":1,"behaviourName":"SwordWave","upgradeCost":[30000,5,10],"upgradeValue":[10,200],"recycle":[30000,100],"isInPool":1} ] \ No newline at end of file diff --git a/src/ReplicatedStorage/Json/Character.json b/src/ReplicatedStorage/Json/Character.json index f74367b..a7fefaf 100644 --- a/src/ReplicatedStorage/Json/Character.json +++ b/src/ReplicatedStorage/Json/Character.json @@ -1,3 +1,3 @@ [ -{"id":1,"name":1,"attack":40,"hp":600,"walkSpeed":10,"atkSpeed":100} +{"id":1,"name":1,"attack":40,"hp":600,"walkSpeed":15,"atkSpeed":100} ] \ No newline at end of file diff --git a/src/ReplicatedStorage/Json/Equipment.json b/src/ReplicatedStorage/Json/Equipment.json index 39c49f6..d096c0b 100644 --- a/src/ReplicatedStorage/Json/Equipment.json +++ b/src/ReplicatedStorage/Json/Equipment.json @@ -1,18 +1,18 @@ [ -{"id":40000,"type":1,"name":40000,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"MCSword","recycle":100}, -{"id":40001,"type":1,"name":40001,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","recycle":100}, -{"id":40002,"type":1,"name":40002,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","recycle":100}, -{"id":40003,"type":1,"name":40003,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","recycle":100}, -{"id":40004,"type":1,"name":40004,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","recycle":100}, -{"id":40005,"type":1,"name":40005,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","recycle":100}, -{"id":40006,"type":1,"name":40006,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","recycle":100}, -{"id":40007,"type":1,"name":40007,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","recycle":100}, -{"id":40008,"type":1,"name":40008,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","recycle":100}, -{"id":40009,"type":1,"name":40009,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","recycle":100}, -{"id":40010,"type":1,"name":40010,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","recycle":100}, -{"id":40011,"type":1,"name":40011,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","recycle":100}, -{"id":40012,"type":1,"name":40012,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","recycle":100}, -{"id":40013,"type":1,"name":40013,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","recycle":100}, -{"id":40014,"type":1,"name":40014,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","recycle":100}, -{"id":40015,"type":1,"name":40015,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","recycle":100} +{"id":40000,"type":1,"name":40000,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"MCSword","specialType":2,"specialRequire":20001,"specialActive":[14,25],"recycle":100}, +{"id":40001,"type":1,"name":40001,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","specialType":1,"specialRequire":7,"specialActive":[14,25],"recycle":100}, +{"id":40002,"type":1,"name":40002,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","specialType":1,"specialRequire":8,"specialActive":[14,25],"recycle":100}, +{"id":40003,"type":1,"name":40003,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","specialType":1,"specialRequire":9,"specialActive":[14,25],"recycle":100}, +{"id":40004,"type":1,"name":40004,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","specialType":1,"specialRequire":10,"specialActive":[14,25],"recycle":100}, +{"id":40005,"type":1,"name":40005,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","specialType":1,"specialRequire":11,"specialActive":[14,25],"recycle":100}, +{"id":40006,"type":1,"name":40006,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","specialType":1,"specialRequire":12,"specialActive":[14,25],"recycle":100}, +{"id":40007,"type":1,"name":40007,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","specialType":1,"specialRequire":13,"specialActive":[14,25],"recycle":100}, +{"id":40008,"type":1,"name":40008,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","specialType":1,"specialRequire":6,"specialActive":[14,25],"recycle":100}, +{"id":40009,"type":1,"name":40009,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","specialType":1,"specialRequire":7,"specialActive":[14,25],"recycle":100}, +{"id":40010,"type":1,"name":40010,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","specialType":1,"specialRequire":8,"specialActive":[14,25],"recycle":100}, +{"id":40011,"type":1,"name":40011,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","specialType":1,"specialRequire":9,"specialActive":[14,25],"recycle":100}, +{"id":40012,"type":1,"name":40012,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","specialType":1,"specialRequire":10,"specialActive":[14,25],"recycle":100}, +{"id":40013,"type":1,"name":40013,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","specialType":1,"specialRequire":11,"specialActive":[14,25],"recycle":100}, +{"id":40014,"type":1,"name":40014,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","specialType":1,"specialRequire":12,"specialActive":[14,25],"recycle":100}, +{"id":40015,"type":1,"name":40015,"attributes":[14,100,0,15,100,0,16,100,0],"modelName":"Zeus","specialType":1,"specialRequire":13,"specialActive":[14,25],"recycle":100} ] \ No newline at end of file diff --git a/src/ReplicatedStorage/Json/Level.json b/src/ReplicatedStorage/Json/Level.json index 2d35e32..37ab94a 100644 --- a/src/ReplicatedStorage/Json/Level.json +++ b/src/ReplicatedStorage/Json/Level.json @@ -2,51 +2,51 @@ {"id":1,"type":1,"timeLimit":null,"atkBonus":100,"hpBonus":100,"wave":[[30,1,1],[10,1,1],[10,1,1],[10,1,1]],"finishRewards":[50001,1]}, {"id":2,"type":1,"timeLimit":null,"atkBonus":100,"hpBonus":100,"wave":[[30,1,1],[10,1,1],[10,1,1],[10,1,1]],"finishRewards":[50002,1]}, {"id":3,"type":1,"timeLimit":null,"atkBonus":100,"hpBonus":100,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[50003,1]}, -{"id":4,"type":1,"timeLimit":null,"atkBonus":100,"hpBonus":100,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[50004,1]}, -{"id":5,"type":2,"timeLimit":60,"atkBonus":121,"hpBonus":121,"wave":[[30,1000,1]],"finishRewards":[50005,1]}, -{"id":6,"type":1,"timeLimit":null,"atkBonus":127,"hpBonus":127,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[50006,1]}, -{"id":7,"type":1,"timeLimit":null,"atkBonus":134,"hpBonus":134,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[50007,1]}, -{"id":8,"type":1,"timeLimit":null,"atkBonus":140,"hpBonus":140,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[50008,1]}, -{"id":9,"type":1,"timeLimit":null,"atkBonus":147,"hpBonus":147,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[50009,1]}, -{"id":10,"type":2,"timeLimit":60,"atkBonus":155,"hpBonus":155,"wave":[[30,1000,1]],"finishRewards":[50010,1]}, -{"id":11,"type":1,"timeLimit":null,"atkBonus":162,"hpBonus":162,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[50011,1]}, -{"id":12,"type":1,"timeLimit":null,"atkBonus":171,"hpBonus":171,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[50012,1]}, -{"id":13,"type":1,"timeLimit":null,"atkBonus":179,"hpBonus":179,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[50013,1]}, -{"id":14,"type":1,"timeLimit":null,"atkBonus":188,"hpBonus":188,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[50014,1]}, -{"id":15,"type":2,"timeLimit":60,"atkBonus":197,"hpBonus":197,"wave":[[30,1000,1]],"finishRewards":[50015,1]}, +{"id":4,"type":1,"timeLimit":null,"atkBonus":100,"hpBonus":100,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, +{"id":5,"type":2,"timeLimit":60,"atkBonus":121,"hpBonus":121,"wave":[[30,1000,1]],"finishRewards":[50004,1]}, +{"id":6,"type":1,"timeLimit":null,"atkBonus":127,"hpBonus":127,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, +{"id":7,"type":1,"timeLimit":null,"atkBonus":134,"hpBonus":134,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, +{"id":8,"type":1,"timeLimit":null,"atkBonus":140,"hpBonus":140,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, +{"id":9,"type":1,"timeLimit":null,"atkBonus":147,"hpBonus":147,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, +{"id":10,"type":2,"timeLimit":60,"atkBonus":155,"hpBonus":155,"wave":[[30,1000,1]],"finishRewards":[50005,1]}, +{"id":11,"type":1,"timeLimit":null,"atkBonus":162,"hpBonus":162,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, +{"id":12,"type":1,"timeLimit":null,"atkBonus":171,"hpBonus":171,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, +{"id":13,"type":1,"timeLimit":null,"atkBonus":179,"hpBonus":179,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, +{"id":14,"type":1,"timeLimit":null,"atkBonus":188,"hpBonus":188,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, +{"id":15,"type":2,"timeLimit":60,"atkBonus":197,"hpBonus":197,"wave":[[30,1000,1]],"finishRewards":[50006,1]}, {"id":16,"type":1,"timeLimit":null,"atkBonus":207,"hpBonus":207,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":17,"type":1,"timeLimit":null,"atkBonus":218,"hpBonus":218,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":18,"type":1,"timeLimit":null,"atkBonus":229,"hpBonus":229,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":19,"type":1,"timeLimit":null,"atkBonus":240,"hpBonus":240,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, -{"id":20,"type":2,"timeLimit":60,"atkBonus":252,"hpBonus":252,"wave":[[30,1000,1]],"finishRewards":[]}, +{"id":20,"type":2,"timeLimit":60,"atkBonus":252,"hpBonus":252,"wave":[[30,1000,1]],"finishRewards":[50007,1]}, {"id":21,"type":1,"timeLimit":null,"atkBonus":265,"hpBonus":265,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":22,"type":1,"timeLimit":null,"atkBonus":278,"hpBonus":278,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":23,"type":1,"timeLimit":null,"atkBonus":292,"hpBonus":292,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":24,"type":1,"timeLimit":null,"atkBonus":307,"hpBonus":307,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, -{"id":25,"type":2,"timeLimit":60,"atkBonus":322,"hpBonus":322,"wave":[[30,1000,1]],"finishRewards":[]}, +{"id":25,"type":2,"timeLimit":60,"atkBonus":322,"hpBonus":322,"wave":[[30,1000,1]],"finishRewards":[50008,1]}, {"id":26,"type":1,"timeLimit":null,"atkBonus":338,"hpBonus":338,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":27,"type":1,"timeLimit":null,"atkBonus":355,"hpBonus":355,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":28,"type":1,"timeLimit":null,"atkBonus":373,"hpBonus":373,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":29,"type":1,"timeLimit":null,"atkBonus":392,"hpBonus":392,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, -{"id":30,"type":2,"timeLimit":60,"atkBonus":411,"hpBonus":411,"wave":[[30,1000,1]],"finishRewards":[]}, +{"id":30,"type":2,"timeLimit":60,"atkBonus":411,"hpBonus":411,"wave":[[30,1000,1]],"finishRewards":[50009,1]}, {"id":31,"type":1,"timeLimit":null,"atkBonus":432,"hpBonus":432,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":32,"type":1,"timeLimit":null,"atkBonus":453,"hpBonus":453,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":33,"type":1,"timeLimit":null,"atkBonus":476,"hpBonus":476,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":34,"type":1,"timeLimit":null,"atkBonus":500,"hpBonus":500,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, -{"id":35,"type":2,"timeLimit":60,"atkBonus":525,"hpBonus":525,"wave":[[30,1000,1]],"finishRewards":[]}, +{"id":35,"type":2,"timeLimit":60,"atkBonus":525,"hpBonus":525,"wave":[[30,1000,1]],"finishRewards":[50010,1]}, {"id":36,"type":1,"timeLimit":null,"atkBonus":551,"hpBonus":551,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":37,"type":1,"timeLimit":null,"atkBonus":579,"hpBonus":579,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":38,"type":1,"timeLimit":null,"atkBonus":608,"hpBonus":608,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":39,"type":1,"timeLimit":null,"atkBonus":638,"hpBonus":638,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, -{"id":40,"type":2,"timeLimit":60,"atkBonus":670,"hpBonus":670,"wave":[[30,1000,1]],"finishRewards":[]}, +{"id":40,"type":2,"timeLimit":60,"atkBonus":670,"hpBonus":670,"wave":[[30,1000,1]],"finishRewards":[50011,1]}, {"id":41,"type":1,"timeLimit":null,"atkBonus":703,"hpBonus":703,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":42,"type":1,"timeLimit":null,"atkBonus":739,"hpBonus":739,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":43,"type":1,"timeLimit":null,"atkBonus":776,"hpBonus":776,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":44,"type":1,"timeLimit":null,"atkBonus":814,"hpBonus":814,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, -{"id":45,"type":2,"timeLimit":60,"atkBonus":855,"hpBonus":855,"wave":[[30,1000,1]],"finishRewards":[]}, +{"id":45,"type":2,"timeLimit":60,"atkBonus":855,"hpBonus":855,"wave":[[30,1000,1]],"finishRewards":[50012,1]}, {"id":46,"type":1,"timeLimit":null,"atkBonus":898,"hpBonus":898,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":47,"type":1,"timeLimit":null,"atkBonus":943,"hpBonus":943,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":48,"type":1,"timeLimit":null,"atkBonus":990,"hpBonus":990,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, {"id":49,"type":1,"timeLimit":null,"atkBonus":1040,"hpBonus":1040,"wave":[[30,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1],[10,1,1,50,1,1]],"finishRewards":[]}, -{"id":50,"type":2,"timeLimit":60,"atkBonus":1092,"hpBonus":1092,"wave":[[30,1000,1]],"finishRewards":[]} +{"id":50,"type":2,"timeLimit":60,"atkBonus":1092,"hpBonus":1092,"wave":[[30,1000,1]],"finishRewards":[50013,1]} ] \ No newline at end of file diff --git a/src/ReplicatedStorage/Tools/Utils.luau b/src/ReplicatedStorage/Tools/Utils.luau index 4966c66..053a295 100644 --- a/src/ReplicatedStorage/Tools/Utils.luau +++ b/src/ReplicatedStorage/Tools/Utils.luau @@ -21,6 +21,8 @@ end function Utils:GetPlayerDataFolder(Player: Player) local pData = PlayerDataFolder:FindFirstChild(Player.UserId) if pData then return pData end + --打印堆栈 + print(debug.traceback()) warn("玩家数据不存在: " .. Player.Name) return nil end @@ -71,7 +73,7 @@ end function Utils:GetIdDataFromJson(JsonData: table, id: number) -- 遍历JsonData,查找id字段等于目标id的项 for _, item in ipairs(JsonData) do - if item.id == id then + if item.id == tonumber(id) then return Utils:DeepCopyTable(item) end end diff --git a/src/ServerStorage/Proxy/AbilityProxy.luau b/src/ServerStorage/Proxy/AbilityProxy.luau index 6598ec5..41acb4e 100644 --- a/src/ServerStorage/Proxy/AbilityProxy.luau +++ b/src/ServerStorage/Proxy/AbilityProxy.luau @@ -33,7 +33,7 @@ end -- 初始化玩家 function AbilityProxy:InitPlayer(Player: Player) - local pData = Utils:GetPlayerDataFolder(Player) + local pData = Utils:WaitPlayerDataFolder(Player) if not pData then return end local AbilityFolder = Utils:CreateFolder("Ability", pData) @@ -60,7 +60,7 @@ function AbilityProxy:AddAbility(Player: Player, AbilityId: number) local AbilityData = Utils:GetIdDataFromJson(JsonAbility, AbilityId) if not AbilityData then return end - local UniqueId = Utils:GenUniqueId(ArchiveProxy.pData[Player.UserId]) + local UniqueId = Utils:GenUniqueId(ArchiveProxy.pData[Player.UserId][STORE_NAME]["Ability"]) -- 配置表内容 local ResultData = {} for key, value in pairs(AbilityData) do @@ -75,7 +75,7 @@ function AbilityProxy:AddAbility(Player: Player, AbilityId: number) -- 记录穿戴的装备UniqueId ResultData.wearing = 0 - ArchiveProxy.pData[Player.UserId][UniqueId] = ResultData + ArchiveProxy.pData[Player.UserId][STORE_NAME]["Ability"][UniqueId] = ResultData local AbilityInstance = Utils:CreateDataInstance(Player, UniqueId, ResultData, GetPlayerAbilityFolder(Player)) return Utils:DeepCopyTable(ResultData), AbilityInstance end @@ -142,15 +142,11 @@ end -- 穿戴技能 function AbilityProxy:WearAbility(Player: Player, AbilityUniqueId: number, EquipmentUniqueId: number) local pData = Utils:GetPlayerDataFolder(Player) - if not pData then return end + if not pData then print("pData不存在", Player.Name) return end -- 获取技能实例存储数据 - local UniqueData = ArchiveProxy.pData[Player.UserId][AbilityUniqueId] - if not UniqueData then return end - - -- 获取装备实例存储数据 - local EquipmentData = ArchiveProxy.pData[Player.UserId][EquipmentUniqueId] - if not EquipmentData then return end + local UniqueData = ArchiveProxy.pData[Player.UserId][STORE_NAME]["Ability"][AbilityUniqueId] + if not UniqueData then print("UniqueData不存在", Player.Name, AbilityUniqueId) return end -- 检查是否有技能实例 local AbilityInstance = GetPlayerAbilityFolder(Player):FindFirstChild(AbilityUniqueId) @@ -162,26 +158,26 @@ function AbilityProxy:WearAbility(Player: Player, AbilityUniqueId: number, Equip -- 遍历技能查看现在穿了几个 local wearingCount = 0 - for _, AbilityData in ArchiveProxy.pData[Player.UserId] do + for _, AbilityData in ArchiveProxy.pData[Player.UserId][STORE_NAME]["Ability"] do if AbilityData.wearing == EquipmentUniqueId then wearingCount = wearingCount + 1 end end - if EquipmentData.abilitySlotNumber <= 0 then + if EquipmentData.maxAbilityNumber <= 0 then RE_PlayerTip:FireClient(Player, "装备没有技能槽位") return end -- 检查槽位数量是否充足 - if wearingCount >= EquipmentData.abilitySlotNumber then + if wearingCount >= EquipmentData.maxAbilityNumber then RE_PlayerTip:FireClient(Player, "装备已满技能槽位") return end -- 穿戴技能 UniqueData.wearing = EquipmentUniqueId - AbilityInstance:SetAttribute("Wearing", EquipmentUniqueId) + AbilityInstance:SetAttribute("wearing", EquipmentUniqueId) end -- 获取技能等级数值(对应技能调用这个函数获取数值) @@ -208,7 +204,7 @@ function AbilityProxy:GetRandomAbilityId(ExceptIdList: table) local candidateIds = {} for _, ability in ipairs(JsonAbility) do local id = ability.id - if not table.find(ExceptIdList, id) then + if not table.find(ExceptIdList, id) and ability.isInPool then table.insert(candidateIds, id) end end @@ -236,6 +232,20 @@ function AbilityProxy:GetPlayerWearingAbilityData(Player: Player) end return wearingAbilityUniqueId, behaviourNames end + +-- 获取对应装备槽位上的技能 +function AbilityProxy:GetPlayerAbilityByEquipmentUniqueId(Player: Player, EquipmentUniqueId: number) + local wearingUniqueId, wearingOrgId = {}, {} + local abilityFolder = GetPlayerAbilityFolder(Player) + for _, AbilityInstance in abilityFolder:GetChildren() do + if AbilityInstance:GetAttribute("wearing") == EquipmentUniqueId then + table.insert(wearingUniqueId, AbilityInstance:GetAttribute("uniqueId")) + table.insert(wearingOrgId, AbilityInstance:GetAttribute("orgId")) + end + end + return wearingUniqueId, wearingOrgId +end + -------------------------------------------------------------------------------- -- 获取技能属性 diff --git a/src/ServerStorage/Proxy/ArchiveProxy.luau b/src/ServerStorage/Proxy/ArchiveProxy.luau index 687dbb0..2f7e832 100644 --- a/src/ServerStorage/Proxy/ArchiveProxy.luau +++ b/src/ServerStorage/Proxy/ArchiveProxy.luau @@ -70,7 +70,7 @@ local function SaveData(Player: Player): boolean end if Success then - print(("DataManager: User %s's data saved successfully."):format(Player.Name)) + print(("DataManager: User %s's data saved successfully."):format(Player.Name), DataToSave) else warn(("DataManager: User %s's data failed to save."):format(Player.Name)) end diff --git a/src/ServerStorage/Proxy/BookProxy.luau b/src/ServerStorage/Proxy/BookProxy.luau index 5e91f13..cd76937 100644 --- a/src/ServerStorage/Proxy/BookProxy.luau +++ b/src/ServerStorage/Proxy/BookProxy.luau @@ -35,7 +35,7 @@ end -- 初始化玩家 function BookProxy:InitPlayer(Player: Player) - local pData = Utils:GetPlayerDataFolder(Player) + local pData = Utils:WaitPlayerDataFolder(Player) if not pData then return end local BookFolder = Utils:CreateFolder("Book", pData) diff --git a/src/ServerStorage/Proxy/EquipmentProxy.luau b/src/ServerStorage/Proxy/EquipmentProxy.luau index 9e219e7..07a95c6 100644 --- a/src/ServerStorage/Proxy/EquipmentProxy.luau +++ b/src/ServerStorage/Proxy/EquipmentProxy.luau @@ -11,6 +11,7 @@ local Rng = require(ReplicatedStorage.Tools.Rng) local ArchiveProxy = require(ServerStorage.Proxy.ArchiveProxy) local PlayerInfoProxy = require(ServerStorage.Proxy.PlayerInfoProxy) local PlayerFightProxy = require(ServerStorage.Proxy.PlayerFightProxy) +local AbilityProxy = require(ServerStorage.Proxy.AbilityProxy) --> Json local JsonEquipment = require(ReplicatedStorage.Json.Equipment) @@ -58,7 +59,7 @@ end -- 初始化玩家 function EquipmentProxy:InitPlayer(Player: Player) - local pData = Utils:GetPlayerDataFolder(Player) + local pData = Utils:WaitPlayerDataFolder(Player) if not pData then return end Utils:CreateFolder("Equipment", pData) @@ -197,10 +198,18 @@ function EquipmentProxy:AddEquipment(Player: Player, EquipmentId: number) end end + ------------------------------------------------------------ + + ArchiveProxy.pData[Player.UserId][STORE_NAME][UniqueId] = ResultData + local equipmentInstance = Utils:CreateDataInstance(Player, UniqueId, ResultData, GetPlayerEquipmentFolder(Player)) + + ------------------------------------------------------------ + -- 下面逻辑会找Instance实例,所以放在之后执行逻辑 + -- 随机生成技能槽位数量 local AbilityProxy = require(ServerStorage.Proxy.AbilityProxy) - local maxAbilityNumber = PlayerInfoProxy:GetPlayerInfo(Player).abilityNumber or 0 + local maxAbilityNumber = PlayerInfoProxy:GetPlayerInfo(Player)["AttributesUpgrade"]["11"] or 0 local abilityNumber = rng:NextInteger(0, maxAbilityNumber) ResultData.maxAbilityNumber = abilityNumber if abilityNumber > 0 then @@ -230,9 +239,6 @@ function EquipmentProxy:AddEquipment(Player: Player, EquipmentId: number) ------------------------------------------------------------ - ArchiveProxy.pData[Player.UserId][STORE_NAME][UniqueId] = ResultData - local equipmentInstance = Utils:CreateDataInstance(Player, UniqueId, ResultData, GetPlayerEquipmentFolder(Player)) - -- 添加图鉴记录 local BookProxy = require(ServerStorage.Proxy.BookProxy) BookProxy:AddBook(Player, EquipmentId, UniqueId) @@ -377,8 +383,34 @@ function EquipmentProxy:GetPlayerAttributes(Player: Player) Utils:TableSafeAddTableValue(AttributesData, EquipmentData.elements) -- 增加装备元素抗性 Utils:TableSafeAddTableValue(AttributesData, EquipmentData.elementDef) + + -- print("属性表", AttributesData) + -- 计算特殊词条加成是否激活 + if EquipmentData.specialType then + + local isActive = false + -- 属性类型加成 + if EquipmentData.specialType == 1 then + local attributeData = Utils:GetIdDataFromJson(JsonAttributes, EquipmentData.specialRequire) + -- 根据配置的id转换一下 + if AttributesData[attributeData.effectAttribute] then isActive = true end + -- 技能类型加成 + elseif EquipmentData.specialType == 2 then + local wearingAbilityUniqueId, wearingOrgId = AbilityProxy:GetPlayerAbilityByEquipmentUniqueId(Player, EquipmentData.id) + print("穿戴技能", wearingOrgId, EquipmentData.specialRequire) + if table.find(wearingOrgId, EquipmentData.specialRequire) then isActive = true end + -- 晶石类型加成 + elseif EquipmentData.specialType == 3 then + + end + if isActive then + local newAddAttribute = Utils:GetIdDataFromJson(JsonAttributes, EquipmentData.specialActive[1]) + Utils:TableSafeAddValue(AttributesData, newAddAttribute.effectAttribute, EquipmentData.specialActive[2]) + end + end end end + -- print("结果属性表", AttributesData) return AttributesData end diff --git a/src/ServerStorage/Proxy/GemProxy.luau b/src/ServerStorage/Proxy/GemProxy.luau index 58afa71..8fc47ba 100644 --- a/src/ServerStorage/Proxy/GemProxy.luau +++ b/src/ServerStorage/Proxy/GemProxy.luau @@ -34,7 +34,7 @@ end -- 初始化玩家 function GemProxy:InitPlayer(Player: Player) - local pData = Utils:GetPlayerDataFolder(Player) + local pData = Utils:WaitPlayerDataFolder(Player) if not pData then return end local GemFolder = Utils:CreateFolder("Gem", pData) diff --git a/src/ServerStorage/Proxy/MobsProxy/init.luau b/src/ServerStorage/Proxy/MobsProxy/init.luau index 40191a3..df05089 100644 --- a/src/ServerStorage/Proxy/MobsProxy/init.luau +++ b/src/ServerStorage/Proxy/MobsProxy/init.luau @@ -127,7 +127,7 @@ function MobsProxy:CleanPlayerMobs(Player: Player) end function MobsProxy:InitPlayer(Player: Player) - local pData = Utils:GetPlayerDataFolder(Player) + local pData = Utils:WaitPlayerDataFolder(Player) if not pData then warn("Player Data not found", Player.Name) return end Utils:CreateFolder(Player.UserId, MobsFolder) @@ -139,9 +139,7 @@ function MobsProxy:GetPlayerMobs(Player: Player) end function MobsProxy:OnPlayerRemoving(Player: Player) - local pData = Utils:GetPlayerDataFolder(Player) - if not pData then return end - local MobsFolder = pData:FindFirstChild("Mobs"):FindFirstChild(Player.UserId) + local MobsFolder = GetPlayerMobsFolder(Player) if MobsFolder then MobsFolder:Destroy() end end diff --git a/src/ServerStorage/Proxy/PlayerInfoProxy.luau b/src/ServerStorage/Proxy/PlayerInfoProxy.luau index f76bd84..02bef0e 100644 --- a/src/ServerStorage/Proxy/PlayerInfoProxy.luau +++ b/src/ServerStorage/Proxy/PlayerInfoProxy.luau @@ -87,7 +87,7 @@ end -- 初始化玩家 function PlayerInfoProxy:InitPlayer(Player: Player) - local pData = Utils:GetPlayerDataFolder(Player) + local pData = Utils:WaitPlayerDataFolder(Player) if not pData then return end local PlayerInfoFolder = Utils:CreateFolder("PlayerInfo", pData) local StatsFolder = Utils:CreateFolder("Stats", PlayerInfoFolder) @@ -97,6 +97,7 @@ function PlayerInfoProxy:InitPlayer(Player: Player) -- 新玩家数据初始化 local isNew = false if not ArchiveProxy.pData[Player.UserId][STORE_NAME] then + print("新玩家数据初始化", Player.UserId) ArchiveProxy.pData[Player.UserId][STORE_NAME] = {} ArchiveProxy.pData[Player.UserId][STORE_NAME].Stats = {} ArchiveProxy.pData[Player.UserId][STORE_NAME].Items = {} @@ -151,6 +152,7 @@ end -- 玩家属性升级 function PlayerInfoProxy:UpgradeAttribute(Player: Player, AttributeId: number) if not Player or not AttributeId then warn('升级属性失败: ', Player.Name, AttributeId) return end + local AttributeId = tostring(AttributeId) local AttributesUpgradeFolder = GetPlayerInfoFolder(Player):FindFirstChild("AttributesUpgrade") @@ -341,6 +343,7 @@ function PlayerInfoProxy:GetPlayerUpgradeAttributes(Player: Player) local playerInfoData = ArchiveProxy.pData[Player.UserId][STORE_NAME] local attributes = {} for AttributeId, AttributeLv in playerInfoData.AttributesUpgrade do + local AttributeId = tonumber(AttributeId) local attributeData = Utils:GetIdDataFromJson(JsonAttributesUpgrade, AttributeId) -- attributes[attributeData["effectAttribute"]] = attributeData["lvAdd"][1] + (AttributeLv - 1) * attributeData["lvAdd"][2] local effectAttribute = attributeData["effectAttribute"] diff --git a/src/StarterPlayerScripts/ClientMain/Camera.client.luau b/src/StarterPlayerScripts/ClientMain/Camera.client.luau index 633aa9b..33f6d40 100644 --- a/src/StarterPlayerScripts/ClientMain/Camera.client.luau +++ b/src/StarterPlayerScripts/ClientMain/Camera.client.luau @@ -21,46 +21,46 @@ local function getCharacterRoot() return nil end -player.CharacterAdded:Connect(function(character) - local root = getCharacterRoot() - if root then - cameraCenter = Vector3.new(root.Position.X, 0, root.Position.Z) - end -end) +-- player.CharacterAdded:Connect(function(character) +-- local root = getCharacterRoot() +-- if root then +-- cameraCenter = Vector3.new(root.Position.X, 0, root.Position.Z) +-- end +-- end) -RunService.RenderStepped:Connect(function() - local root = getCharacterRoot() - if root then - if not cameraCenter then - cameraCenter = Vector3.new(root.Position.X, 0, root.Position.Z) - end +-- RunService.RenderStepped:Connect(function() +-- local root = getCharacterRoot() +-- if root then +-- if not cameraCenter then +-- cameraCenter = Vector3.new(root.Position.X, 0, root.Position.Z) +-- end - -- 只考虑X/Z平面 - local delta = Vector2.new(root.Position.X - cameraCenter.X, root.Position.Z - cameraCenter.Z) - local halfSize = DEADZONE_SIZE / 2 +-- -- 只考虑X/Z平面 +-- local delta = Vector2.new(root.Position.X - cameraCenter.X, root.Position.Z - cameraCenter.Z) +-- local halfSize = DEADZONE_SIZE / 2 - -- 检查是否超出死区 - local moveX, moveZ = 0, 0 - if math.abs(delta.X) > halfSize.X then - moveX = delta.X - math.sign(delta.X) * halfSize.X - end - if math.abs(delta.Y) > halfSize.Y then - moveZ = delta.Y - math.sign(delta.Y) * halfSize.Y - end +-- -- 检查是否超出死区 +-- local moveX, moveZ = 0, 0 +-- if math.abs(delta.X) > halfSize.X then +-- moveX = delta.X - math.sign(delta.X) * halfSize.X +-- end +-- if math.abs(delta.Y) > halfSize.Y then +-- moveZ = delta.Y - math.sign(delta.Y) * halfSize.Y +-- end - -- 更新相机中心点 - cameraCenter = cameraCenter + Vector3.new(moveX, 0, moveZ) +-- -- 更新相机中心点 +-- cameraCenter = cameraCenter + Vector3.new(moveX, 0, moveZ) - -- 让lookAt点在相机中心点后方 - local lookAt = cameraCenter - Vector3.new(-1, 0, 0) * SCREEN_OFFSET - local offset = Vector3.new( - -CAMERA_DISTANCE * math.cos(CAMERA_ANGLE), - CAMERA_HEIGHT, - 0 - ) - local cameraPos = lookAt + offset +-- -- 让lookAt点在相机中心点后方 +-- local lookAt = cameraCenter - Vector3.new(-1, 0, 0) * SCREEN_OFFSET +-- local offset = Vector3.new( +-- -CAMERA_DISTANCE * math.cos(CAMERA_ANGLE), +-- CAMERA_HEIGHT, +-- 0 +-- ) +-- local cameraPos = lookAt + offset - camera.CameraType = Enum.CameraType.Scriptable - camera.CFrame = CFrame.new(cameraPos, lookAt) - end -end) \ No newline at end of file +-- camera.CameraType = Enum.CameraType.Scriptable +-- camera.CFrame = CFrame.new(cameraPos, lookAt) +-- end +-- end) \ No newline at end of file