装备特征后端功能
This commit is contained in:
gechangfu 2025-08-12 15:09:58 +08:00
parent 5d0f85c31a
commit 170d8d28b2
17 changed files with 149 additions and 104 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,4 +1,4 @@
[ [
{"id":20000,"type":1,"icon":1,"behaviourName":"Attack","upgradeCost":[30000,5,0],"upgradeValue":[10,0],"recycle":[30000,0]}, {"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]} {"id":20001,"type":1,"icon":1,"behaviourName":"SwordWave","upgradeCost":[30000,5,10],"upgradeValue":[10,200],"recycle":[30000,100],"isInPool":1}
] ]

View File

@ -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}
] ]

View File

@ -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":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","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","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","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","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","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","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","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","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","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","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","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","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","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","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","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}
] ]

View File

@ -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":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":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":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":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":[50005,1]}, {"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":[50006,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":[50007,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":[]},
{"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":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":[50009,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":[]},
{"id":10,"type":2,"timeLimit":60,"atkBonus":155,"hpBonus":155,"wave":[[30,1000,1]],"finishRewards":[50010,1]}, {"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":[50011,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":[50012,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":[]},
{"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":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":[50014,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":[]},
{"id":15,"type":2,"timeLimit":60,"atkBonus":197,"hpBonus":197,"wave":[[30,1000,1]],"finishRewards":[50015,1]}, {"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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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":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]}
] ]

View File

@ -21,6 +21,8 @@ end
function Utils:GetPlayerDataFolder(Player: Player) function Utils:GetPlayerDataFolder(Player: Player)
local pData = PlayerDataFolder:FindFirstChild(Player.UserId) local pData = PlayerDataFolder:FindFirstChild(Player.UserId)
if pData then return pData end if pData then return pData end
--打印堆栈
print(debug.traceback())
warn("玩家数据不存在: " .. Player.Name) warn("玩家数据不存在: " .. Player.Name)
return nil return nil
end end
@ -71,7 +73,7 @@ end
function Utils:GetIdDataFromJson(JsonData: table, id: number) function Utils:GetIdDataFromJson(JsonData: table, id: number)
-- 遍历JsonData查找id字段等于目标id的项 -- 遍历JsonData查找id字段等于目标id的项
for _, item in ipairs(JsonData) do for _, item in ipairs(JsonData) do
if item.id == id then if item.id == tonumber(id) then
return Utils:DeepCopyTable(item) return Utils:DeepCopyTable(item)
end end
end end

View File

@ -33,7 +33,7 @@ end
-- 初始化玩家 -- 初始化玩家
function AbilityProxy:InitPlayer(Player: Player) function AbilityProxy:InitPlayer(Player: Player)
local pData = Utils:GetPlayerDataFolder(Player) local pData = Utils:WaitPlayerDataFolder(Player)
if not pData then return end if not pData then return end
local AbilityFolder = Utils:CreateFolder("Ability", pData) local AbilityFolder = Utils:CreateFolder("Ability", pData)
@ -60,7 +60,7 @@ function AbilityProxy:AddAbility(Player: Player, AbilityId: number)
local AbilityData = Utils:GetIdDataFromJson(JsonAbility, AbilityId) local AbilityData = Utils:GetIdDataFromJson(JsonAbility, AbilityId)
if not AbilityData then return end 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 = {} local ResultData = {}
for key, value in pairs(AbilityData) do for key, value in pairs(AbilityData) do
@ -75,7 +75,7 @@ function AbilityProxy:AddAbility(Player: Player, AbilityId: number)
-- 记录穿戴的装备UniqueId -- 记录穿戴的装备UniqueId
ResultData.wearing = 0 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)) local AbilityInstance = Utils:CreateDataInstance(Player, UniqueId, ResultData, GetPlayerAbilityFolder(Player))
return Utils:DeepCopyTable(ResultData), AbilityInstance return Utils:DeepCopyTable(ResultData), AbilityInstance
end end
@ -142,15 +142,11 @@ end
-- 穿戴技能 -- 穿戴技能
function AbilityProxy:WearAbility(Player: Player, AbilityUniqueId: number, EquipmentUniqueId: number) function AbilityProxy:WearAbility(Player: Player, AbilityUniqueId: number, EquipmentUniqueId: number)
local pData = Utils:GetPlayerDataFolder(Player) 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] local UniqueData = ArchiveProxy.pData[Player.UserId][STORE_NAME]["Ability"][AbilityUniqueId]
if not UniqueData then return end if not UniqueData then print("UniqueData不存在", Player.Name, AbilityUniqueId) return end
-- 获取装备实例存储数据
local EquipmentData = ArchiveProxy.pData[Player.UserId][EquipmentUniqueId]
if not EquipmentData then return end
-- 检查是否有技能实例 -- 检查是否有技能实例
local AbilityInstance = GetPlayerAbilityFolder(Player):FindFirstChild(AbilityUniqueId) local AbilityInstance = GetPlayerAbilityFolder(Player):FindFirstChild(AbilityUniqueId)
@ -162,26 +158,26 @@ function AbilityProxy:WearAbility(Player: Player, AbilityUniqueId: number, Equip
-- 遍历技能查看现在穿了几个 -- 遍历技能查看现在穿了几个
local wearingCount = 0 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 if AbilityData.wearing == EquipmentUniqueId then
wearingCount = wearingCount + 1 wearingCount = wearingCount + 1
end end
end end
if EquipmentData.abilitySlotNumber <= 0 then if EquipmentData.maxAbilityNumber <= 0 then
RE_PlayerTip:FireClient(Player, "装备没有技能槽位") RE_PlayerTip:FireClient(Player, "装备没有技能槽位")
return return
end end
-- 检查槽位数量是否充足 -- 检查槽位数量是否充足
if wearingCount >= EquipmentData.abilitySlotNumber then if wearingCount >= EquipmentData.maxAbilityNumber then
RE_PlayerTip:FireClient(Player, "装备已满技能槽位") RE_PlayerTip:FireClient(Player, "装备已满技能槽位")
return return
end end
-- 穿戴技能 -- 穿戴技能
UniqueData.wearing = EquipmentUniqueId UniqueData.wearing = EquipmentUniqueId
AbilityInstance:SetAttribute("Wearing", EquipmentUniqueId) AbilityInstance:SetAttribute("wearing", EquipmentUniqueId)
end end
-- 获取技能等级数值(对应技能调用这个函数获取数值) -- 获取技能等级数值(对应技能调用这个函数获取数值)
@ -208,7 +204,7 @@ function AbilityProxy:GetRandomAbilityId(ExceptIdList: table)
local candidateIds = {} local candidateIds = {}
for _, ability in ipairs(JsonAbility) do for _, ability in ipairs(JsonAbility) do
local id = ability.id 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) table.insert(candidateIds, id)
end end
end end
@ -236,6 +232,20 @@ function AbilityProxy:GetPlayerWearingAbilityData(Player: Player)
end end
return wearingAbilityUniqueId, behaviourNames return wearingAbilityUniqueId, behaviourNames
end 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
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- 获取技能属性 -- 获取技能属性

View File

@ -70,7 +70,7 @@ local function SaveData(Player: Player): boolean
end end
if Success then 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 else
warn(("DataManager: User %s's data failed to save."):format(Player.Name)) warn(("DataManager: User %s's data failed to save."):format(Player.Name))
end end

View File

@ -35,7 +35,7 @@ end
-- 初始化玩家 -- 初始化玩家
function BookProxy:InitPlayer(Player: Player) function BookProxy:InitPlayer(Player: Player)
local pData = Utils:GetPlayerDataFolder(Player) local pData = Utils:WaitPlayerDataFolder(Player)
if not pData then return end if not pData then return end
local BookFolder = Utils:CreateFolder("Book", pData) local BookFolder = Utils:CreateFolder("Book", pData)

View File

@ -11,6 +11,7 @@ local Rng = require(ReplicatedStorage.Tools.Rng)
local ArchiveProxy = require(ServerStorage.Proxy.ArchiveProxy) local ArchiveProxy = require(ServerStorage.Proxy.ArchiveProxy)
local PlayerInfoProxy = require(ServerStorage.Proxy.PlayerInfoProxy) local PlayerInfoProxy = require(ServerStorage.Proxy.PlayerInfoProxy)
local PlayerFightProxy = require(ServerStorage.Proxy.PlayerFightProxy) local PlayerFightProxy = require(ServerStorage.Proxy.PlayerFightProxy)
local AbilityProxy = require(ServerStorage.Proxy.AbilityProxy)
--> Json --> Json
local JsonEquipment = require(ReplicatedStorage.Json.Equipment) local JsonEquipment = require(ReplicatedStorage.Json.Equipment)
@ -58,7 +59,7 @@ end
-- 初始化玩家 -- 初始化玩家
function EquipmentProxy:InitPlayer(Player: Player) function EquipmentProxy:InitPlayer(Player: Player)
local pData = Utils:GetPlayerDataFolder(Player) local pData = Utils:WaitPlayerDataFolder(Player)
if not pData then return end if not pData then return end
Utils:CreateFolder("Equipment", pData) Utils:CreateFolder("Equipment", pData)
@ -197,10 +198,18 @@ function EquipmentProxy:AddEquipment(Player: Player, EquipmentId: number)
end end
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 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) local abilityNumber = rng:NextInteger(0, maxAbilityNumber)
ResultData.maxAbilityNumber = abilityNumber ResultData.maxAbilityNumber = abilityNumber
if abilityNumber > 0 then 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) local BookProxy = require(ServerStorage.Proxy.BookProxy)
BookProxy:AddBook(Player, EquipmentId, UniqueId) BookProxy:AddBook(Player, EquipmentId, UniqueId)
@ -377,8 +383,34 @@ function EquipmentProxy:GetPlayerAttributes(Player: Player)
Utils:TableSafeAddTableValue(AttributesData, EquipmentData.elements) Utils:TableSafeAddTableValue(AttributesData, EquipmentData.elements)
-- 增加装备元素抗性 -- 增加装备元素抗性
Utils:TableSafeAddTableValue(AttributesData, EquipmentData.elementDef) 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
end end
-- print("结果属性表", AttributesData)
return AttributesData return AttributesData
end end

View File

@ -34,7 +34,7 @@ end
-- 初始化玩家 -- 初始化玩家
function GemProxy:InitPlayer(Player: Player) function GemProxy:InitPlayer(Player: Player)
local pData = Utils:GetPlayerDataFolder(Player) local pData = Utils:WaitPlayerDataFolder(Player)
if not pData then return end if not pData then return end
local GemFolder = Utils:CreateFolder("Gem", pData) local GemFolder = Utils:CreateFolder("Gem", pData)

View File

@ -127,7 +127,7 @@ function MobsProxy:CleanPlayerMobs(Player: Player)
end end
function MobsProxy:InitPlayer(Player: Player) 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 if not pData then warn("Player Data not found", Player.Name) return end
Utils:CreateFolder(Player.UserId, MobsFolder) Utils:CreateFolder(Player.UserId, MobsFolder)
@ -139,9 +139,7 @@ function MobsProxy:GetPlayerMobs(Player: Player)
end end
function MobsProxy:OnPlayerRemoving(Player: Player) function MobsProxy:OnPlayerRemoving(Player: Player)
local pData = Utils:GetPlayerDataFolder(Player) local MobsFolder = GetPlayerMobsFolder(Player)
if not pData then return end
local MobsFolder = pData:FindFirstChild("Mobs"):FindFirstChild(Player.UserId)
if MobsFolder then MobsFolder:Destroy() end if MobsFolder then MobsFolder:Destroy() end
end end

View File

@ -87,7 +87,7 @@ end
-- 初始化玩家 -- 初始化玩家
function PlayerInfoProxy:InitPlayer(Player: Player) function PlayerInfoProxy:InitPlayer(Player: Player)
local pData = Utils:GetPlayerDataFolder(Player) local pData = Utils:WaitPlayerDataFolder(Player)
if not pData then return end if not pData then return end
local PlayerInfoFolder = Utils:CreateFolder("PlayerInfo", pData) local PlayerInfoFolder = Utils:CreateFolder("PlayerInfo", pData)
local StatsFolder = Utils:CreateFolder("Stats", PlayerInfoFolder) local StatsFolder = Utils:CreateFolder("Stats", PlayerInfoFolder)
@ -97,6 +97,7 @@ function PlayerInfoProxy:InitPlayer(Player: Player)
-- 新玩家数据初始化 -- 新玩家数据初始化
local isNew = false local isNew = false
if not ArchiveProxy.pData[Player.UserId][STORE_NAME] then if not ArchiveProxy.pData[Player.UserId][STORE_NAME] then
print("新玩家数据初始化", Player.UserId)
ArchiveProxy.pData[Player.UserId][STORE_NAME] = {} ArchiveProxy.pData[Player.UserId][STORE_NAME] = {}
ArchiveProxy.pData[Player.UserId][STORE_NAME].Stats = {} ArchiveProxy.pData[Player.UserId][STORE_NAME].Stats = {}
ArchiveProxy.pData[Player.UserId][STORE_NAME].Items = {} ArchiveProxy.pData[Player.UserId][STORE_NAME].Items = {}
@ -151,6 +152,7 @@ end
-- 玩家属性升级 -- 玩家属性升级
function PlayerInfoProxy:UpgradeAttribute(Player: Player, AttributeId: number) function PlayerInfoProxy:UpgradeAttribute(Player: Player, AttributeId: number)
if not Player or not AttributeId then warn('升级属性失败: ', Player.Name, AttributeId) return end if not Player or not AttributeId then warn('升级属性失败: ', Player.Name, AttributeId) return end
local AttributeId = tostring(AttributeId)
local AttributesUpgradeFolder = GetPlayerInfoFolder(Player):FindFirstChild("AttributesUpgrade") local AttributesUpgradeFolder = GetPlayerInfoFolder(Player):FindFirstChild("AttributesUpgrade")
@ -341,6 +343,7 @@ function PlayerInfoProxy:GetPlayerUpgradeAttributes(Player: Player)
local playerInfoData = ArchiveProxy.pData[Player.UserId][STORE_NAME] local playerInfoData = ArchiveProxy.pData[Player.UserId][STORE_NAME]
local attributes = {} local attributes = {}
for AttributeId, AttributeLv in playerInfoData.AttributesUpgrade do for AttributeId, AttributeLv in playerInfoData.AttributesUpgrade do
local AttributeId = tonumber(AttributeId)
local attributeData = Utils:GetIdDataFromJson(JsonAttributesUpgrade, AttributeId) local attributeData = Utils:GetIdDataFromJson(JsonAttributesUpgrade, AttributeId)
-- attributes[attributeData["effectAttribute"]] = attributeData["lvAdd"][1] + (AttributeLv - 1) * attributeData["lvAdd"][2] -- attributes[attributeData["effectAttribute"]] = attributeData["lvAdd"][1] + (AttributeLv - 1) * attributeData["lvAdd"][2]
local effectAttribute = attributeData["effectAttribute"] local effectAttribute = attributeData["effectAttribute"]

View File

@ -21,46 +21,46 @@ local function getCharacterRoot()
return nil return nil
end end
player.CharacterAdded:Connect(function(character) -- player.CharacterAdded:Connect(function(character)
local root = getCharacterRoot() -- local root = getCharacterRoot()
if root then -- if root then
cameraCenter = Vector3.new(root.Position.X, 0, root.Position.Z) -- cameraCenter = Vector3.new(root.Position.X, 0, root.Position.Z)
end -- end
end) -- end)
RunService.RenderStepped:Connect(function() -- RunService.RenderStepped:Connect(function()
local root = getCharacterRoot() -- local root = getCharacterRoot()
if root then -- if root then
if not cameraCenter then -- if not cameraCenter then
cameraCenter = Vector3.new(root.Position.X, 0, root.Position.Z) -- cameraCenter = Vector3.new(root.Position.X, 0, root.Position.Z)
end -- end
-- 只考虑X/Z平面 -- -- 只考虑X/Z平面
local delta = Vector2.new(root.Position.X - cameraCenter.X, root.Position.Z - cameraCenter.Z) -- local delta = Vector2.new(root.Position.X - cameraCenter.X, root.Position.Z - cameraCenter.Z)
local halfSize = DEADZONE_SIZE / 2 -- local halfSize = DEADZONE_SIZE / 2
-- 检查是否超出死区 -- -- 检查是否超出死区
local moveX, moveZ = 0, 0 -- local moveX, moveZ = 0, 0
if math.abs(delta.X) > halfSize.X then -- if math.abs(delta.X) > halfSize.X then
moveX = delta.X - math.sign(delta.X) * halfSize.X -- moveX = delta.X - math.sign(delta.X) * halfSize.X
end -- end
if math.abs(delta.Y) > halfSize.Y then -- if math.abs(delta.Y) > halfSize.Y then
moveZ = delta.Y - math.sign(delta.Y) * halfSize.Y -- moveZ = delta.Y - math.sign(delta.Y) * halfSize.Y
end -- end
-- 更新相机中心点 -- -- 更新相机中心点
cameraCenter = cameraCenter + Vector3.new(moveX, 0, moveZ) -- cameraCenter = cameraCenter + Vector3.new(moveX, 0, moveZ)
-- 让lookAt点在相机中心点后方 -- -- 让lookAt点在相机中心点后方
local lookAt = cameraCenter - Vector3.new(-1, 0, 0) * SCREEN_OFFSET -- local lookAt = cameraCenter - Vector3.new(-1, 0, 0) * SCREEN_OFFSET
local offset = Vector3.new( -- local offset = Vector3.new(
-CAMERA_DISTANCE * math.cos(CAMERA_ANGLE), -- -CAMERA_DISTANCE * math.cos(CAMERA_ANGLE),
CAMERA_HEIGHT, -- CAMERA_HEIGHT,
0 -- 0
) -- )
local cameraPos = lookAt + offset -- local cameraPos = lookAt + offset
camera.CameraType = Enum.CameraType.Scriptable -- camera.CameraType = Enum.CameraType.Scriptable
camera.CFrame = CFrame.new(cameraPos, lookAt) -- camera.CFrame = CFrame.new(cameraPos, lookAt)
end -- end
end) -- end)