From 2bcb438e655cbe501ccf39cf5baebfadb4ad500f Mon Sep 17 00:00:00 2001 From: gechangfu Date: Fri, 22 Aug 2025 12:32:05 +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/Rune.xlsx | Bin 13227 -> 14707 bytes excel/attribute.xlsx | Bin 13942 -> 13941 bytes excel/item.xlsx | Bin 22981 -> 25369 bytes src/ReplicatedStorage/Data/RuneWeaponTag.luau | 10 +++ src/ReplicatedStorage/Json/Attributes.json | 22 ++++--- src/ReplicatedStorage/Json/ItemProp.json | 56 ++++++++++++++++- src/ReplicatedStorage/Json/Rune.json | 44 ++++++------- src/ReplicatedStorage/Modules/Filter.luau | 4 +- src/ReplicatedStorage/Tools/Utils.luau | 5 ++ src/ServerStorage/Base/Rune.luau | 15 ++++- .../Modules/Runes/RuneAtkSpeed.luau | 33 ++++++++++ .../Modules/Runes/RuneBookQualityYellow.luau | 53 ++++++++++++++++ .../Modules/Runes/RuneCritToAttackRate.luau | 37 +++++++++++ .../Modules/Runes/RuneFirstAttack.luau | 7 ++- .../Modules/Runes/RuneKillCoin.luau | 49 +++++++++++++++ .../Modules/Runes/RuneKillEnemyHeal.luau | 11 ++-- .../Modules/Runes/RuneNormalCritRate.luau | 31 +++++++++ .../Modules/Runes/RuneNormalNoElement.luau | 51 +++++++++++++++ .../Modules/Runes/RuneSacrifice.luau | 38 +++++++++++ .../Runes/RuneThunderAddDamageTime.luau | 47 ++++++++++++++ .../Runes/RuneThunderDoubleDamage.luau | 53 ++++++++++++++++ .../Runes/RuneWearElementAttackSpeed.luau | 52 +++++++++++++++ .../Modules/Runes/RuneWearGenWeapon.luau | 59 ++++++++++++++++++ .../Modules/Runes/RuneWearHeavySword.luau | 3 +- .../Modules/Runes/RuneWearKnife.luau | 3 +- .../Modules/Runes/RuneWearSingleRuneSlot.luau | 52 +++++++++++++++ .../Modules/Runes/RuneWearStick.luau | 3 +- .../Modules/Runes/RuneWearSword.luau | 3 +- .../Proxy/PlayerFightProxy/PlayerAI.luau | 7 +++ .../UI/Windows/RuneStateWindow/init.luau | 1 + 30 files changed, 703 insertions(+), 46 deletions(-) create mode 100644 src/ReplicatedStorage/Data/RuneWeaponTag.luau create mode 100644 src/ServerStorage/Modules/Runes/RuneAtkSpeed.luau create mode 100644 src/ServerStorage/Modules/Runes/RuneBookQualityYellow.luau create mode 100644 src/ServerStorage/Modules/Runes/RuneCritToAttackRate.luau create mode 100644 src/ServerStorage/Modules/Runes/RuneKillCoin.luau create mode 100644 src/ServerStorage/Modules/Runes/RuneNormalCritRate.luau create mode 100644 src/ServerStorage/Modules/Runes/RuneNormalNoElement.luau create mode 100644 src/ServerStorage/Modules/Runes/RuneSacrifice.luau create mode 100644 src/ServerStorage/Modules/Runes/RuneThunderAddDamageTime.luau create mode 100644 src/ServerStorage/Modules/Runes/RuneThunderDoubleDamage.luau create mode 100644 src/ServerStorage/Modules/Runes/RuneWearElementAttackSpeed.luau create mode 100644 src/ServerStorage/Modules/Runes/RuneWearGenWeapon.luau create mode 100644 src/ServerStorage/Modules/Runes/RuneWearSingleRuneSlot.luau diff --git a/excel/Rune.xlsx b/excel/Rune.xlsx index 5da16638ab1511dc31d1bf4eada693f6460afc1f..5ef1a1e1dacf53a661f2647fa42dd6df18f78325 100644 GIT binary patch delta 7624 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 Qn0(+cURtCzf#;Y111uzA#sB~S delta 6155 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 delta 16373 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

Qgjd=u%3}U z{Zx^9@tzpn@dQz*MPzP8Y#D9pc0&Io-v}i&$cCr(RXL~LW&KKPz8tOO$Q^>fuBk3= z5P&b@@H(?hxpv_SBWS5;W%~p0a`Q>R|Bx&_vK!a`RI@?Cm_LHF6(^MF;b;3iZm2Kj zo?}!uv;P}<#~(DqaVF-u*V|@Y&%T7NLSX;YCHzHiPZHE#3?E;Ei zw&nf?i+_Fta{492Dxa)VxgCa37Gms+0Ey_oM)_-y3Wgy*S~*2NQwJ>QNImb!qF8{+ zWfbvC!P+S*>1fZIHvgf2W~@rv#*fS*zzm1CJFih!QsuR>ulA6C&8G)XsZ?9Id+P&wCgG*lg6& z7(9Z#=#*SK0oAMPRmuy?l-_!^@&q^UZaW z`DEKgj^D@pxnp*K7z#yw0XM_)Bm1E%ysvc}v-T~(=tW)2m1&Fc_iO)!3SV$?)$&!v zuw45}a(i3pZ2M{-rHAC_b7#ZOG$s9duI)kmQL_d=<4#my$j zsG{Nn26E6P@V#DC&k0B*J)hrv!OAa~Du`%;C?{eRQxanJr$`ne60?lJ<`++ZScQyY(n3U#IFQmQ z*GqQKFh^n#B0Zw1A2@-hD`ema?)N$dM*$aZ9r4v?>r`d=@JSMe3H-hmFxD&!LAU?sD>*zz3Y zeyKTba7U(D>Qt7`D(7I4E~q6F!0{wpgaeUeL=|q$x88#f< zWKy@+mv;fcC+S<&LgA&}L}ogbXCFI-{Wu~fL7(>%8prjV&KPYODl}s}N6N z!bkeQto}zGRVm)hgo^Z!3PWgr0QtlEM+(_vR*A1R5rPhV7k_3#1uv)ZTljwf#Cea6 diff --git a/src/ReplicatedStorage/Data/RuneWeaponTag.luau b/src/ReplicatedStorage/Data/RuneWeaponTag.luau new file mode 100644 index 0000000..37dd0a3 --- /dev/null +++ b/src/ReplicatedStorage/Data/RuneWeaponTag.luau @@ -0,0 +1,10 @@ +local RuneWeaponTag = {} + +RuneWeaponTag = { + [1] = "RuneTagKnife", + [2] = "RuneTagSword", + [3] = "RuneTagStick", + [4] = "RuneTagHeavySword", +} + +return RuneWeaponTag \ No newline at end of file diff --git a/src/ReplicatedStorage/Json/Attributes.json b/src/ReplicatedStorage/Json/Attributes.json index c9efaa9..4e578ac 100644 --- a/src/ReplicatedStorage/Json/Attributes.json +++ b/src/ReplicatedStorage/Json/Attributes.json @@ -24,11 +24,19 @@ {"id":26,"type":1,"specialType":null,"effectAttribute":"mpRecoverBonus","battleValue":[1,10],"iconId":23,"nameId":226}, {"id":27,"type":2,"specialType":null,"effectAttribute":"vampireRate","battleValue":[1,10],"iconId":24,"nameId":227}, {"id":28,"type":2,"specialType":null,"effectAttribute":"coinBonus","battleValue":[1,10],"iconId":25,"nameId":228}, -{"id":50,"type":1,"specialType":null,"effectAttribute":"wearNumber","battleValue":[1,10],"iconId":26,"nameId":250}, -{"id":51,"type":1,"specialType":null,"effectAttribute":"skillNumber","battleValue":[1,10],"iconId":27,"nameId":251}, -{"id":52,"type":1,"specialType":null,"effectAttribute":"extraAttributeNumber","battleValue":[1,10],"iconId":28,"nameId":252}, -{"id":53,"type":1,"specialType":null,"effectAttribute":"elementNumber","battleValue":[1,10],"iconId":29,"nameId":253}, -{"id":54,"type":1,"specialType":null,"effectAttribute":"elementDefNumber","battleValue":[1,10],"iconId":30,"nameId":254}, -{"id":55,"type":1,"specialType":null,"effectAttribute":"gemNumber","battleValue":[1,10],"iconId":31,"nameId":255}, -{"id":56,"type":1,"specialType":null,"effectAttribute":"runeNumber","battleValue":[1,10],"iconId":32,"nameId":256} +{"id":29,"type":2,"specialType":1,"effectAttribute":"critRateFire","battleValue":[1,10],"iconId":26,"nameId":229}, +{"id":30,"type":2,"specialType":1,"effectAttribute":"critRateIce","battleValue":[1,10],"iconId":27,"nameId":230}, +{"id":31,"type":2,"specialType":1,"effectAttribute":"critRateLight","battleValue":[1,10],"iconId":28,"nameId":231}, +{"id":32,"type":2,"specialType":1,"effectAttribute":"critRateDark","battleValue":[1,10],"iconId":29,"nameId":232}, +{"id":33,"type":2,"specialType":1,"effectAttribute":"critDamageRateFire","battleValue":[1,10],"iconId":26,"nameId":233}, +{"id":34,"type":2,"specialType":1,"effectAttribute":"critDamageRateIce","battleValue":[1,10],"iconId":27,"nameId":234}, +{"id":35,"type":2,"specialType":1,"effectAttribute":"critDamageRateLight","battleValue":[1,10],"iconId":28,"nameId":235}, +{"id":36,"type":2,"specialType":1,"effectAttribute":"critDamageRateDark","battleValue":[1,10],"iconId":29,"nameId":236}, +{"id":50,"type":1,"specialType":null,"effectAttribute":"wearNumber","battleValue":[1,10],"iconId":50,"nameId":250}, +{"id":51,"type":1,"specialType":null,"effectAttribute":"skillNumber","battleValue":[1,10],"iconId":51,"nameId":251}, +{"id":52,"type":1,"specialType":null,"effectAttribute":"extraAttributeNumber","battleValue":[1,10],"iconId":52,"nameId":252}, +{"id":53,"type":1,"specialType":null,"effectAttribute":"elementNumber","battleValue":[1,10],"iconId":53,"nameId":253}, +{"id":54,"type":1,"specialType":null,"effectAttribute":"elementDefNumber","battleValue":[1,10],"iconId":54,"nameId":254}, +{"id":55,"type":1,"specialType":null,"effectAttribute":"gemNumber","battleValue":[1,10],"iconId":55,"nameId":255}, +{"id":56,"type":1,"specialType":null,"effectAttribute":"runeNumber","battleValue":[1,10],"iconId":56,"nameId":256} ] \ No newline at end of file diff --git a/src/ReplicatedStorage/Json/ItemProp.json b/src/ReplicatedStorage/Json/ItemProp.json index 19221b5..b03d2df 100644 --- a/src/ReplicatedStorage/Json/ItemProp.json +++ b/src/ReplicatedStorage/Json/ItemProp.json @@ -96,7 +96,59 @@ {"id":50013,"type":3,"typeArgs":[],"quality":14,"iconId":14,"nameId":50013,"textId":70013,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, {"id":50014,"type":3,"typeArgs":[],"quality":15,"iconId":15,"nameId":50014,"textId":70014,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, {"id":50015,"type":3,"typeArgs":[],"quality":16,"iconId":16,"nameId":50015,"textId":70015,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, -{"id":60000,"type":7,"typeArgs":[],"quality":4,"iconId":60000,"nameId":60000,"textId":80000,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60000,"type":7,"typeArgs":[],"quality":4,"iconId":60000,"nameId":60000,"textId":60000,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60000,"type":7,"typeArgs":[],"quality":4,"iconId":60000,"nameId":60000,"textId":60000,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60001,"type":7,"typeArgs":[],"quality":4,"iconId":60001,"nameId":60001,"textId":60001,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60002,"type":7,"typeArgs":[],"quality":4,"iconId":60002,"nameId":60002,"textId":60002,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60003,"type":7,"typeArgs":[],"quality":4,"iconId":60003,"nameId":60003,"textId":60003,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60004,"type":7,"typeArgs":[],"quality":4,"iconId":60004,"nameId":60004,"textId":60004,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60005,"type":7,"typeArgs":[],"quality":4,"iconId":60005,"nameId":60005,"textId":60005,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60006,"type":7,"typeArgs":[],"quality":4,"iconId":60006,"nameId":60006,"textId":60006,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60007,"type":7,"typeArgs":[],"quality":4,"iconId":60007,"nameId":60007,"textId":60007,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60008,"type":7,"typeArgs":[],"quality":4,"iconId":60008,"nameId":60008,"textId":60008,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60009,"type":7,"typeArgs":[],"quality":4,"iconId":60009,"nameId":60009,"textId":60009,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60010,"type":7,"typeArgs":[],"quality":4,"iconId":60010,"nameId":60010,"textId":60010,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60011,"type":7,"typeArgs":[],"quality":4,"iconId":60011,"nameId":60011,"textId":60011,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60012,"type":7,"typeArgs":[],"quality":4,"iconId":60012,"nameId":60012,"textId":60012,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60013,"type":7,"typeArgs":[],"quality":4,"iconId":60013,"nameId":60013,"textId":60013,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60014,"type":7,"typeArgs":[],"quality":4,"iconId":60014,"nameId":60014,"textId":60014,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60015,"type":7,"typeArgs":[],"quality":4,"iconId":60015,"nameId":60015,"textId":60015,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60016,"type":7,"typeArgs":[],"quality":4,"iconId":60016,"nameId":60016,"textId":60016,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60017,"type":7,"typeArgs":[],"quality":4,"iconId":60017,"nameId":60017,"textId":60017,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60018,"type":7,"typeArgs":[],"quality":4,"iconId":60018,"nameId":60018,"textId":60018,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60019,"type":7,"typeArgs":[],"quality":4,"iconId":60019,"nameId":60019,"textId":60019,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60020,"type":7,"typeArgs":[],"quality":4,"iconId":60020,"nameId":60020,"textId":60020,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60021,"type":7,"typeArgs":[],"quality":4,"iconId":60021,"nameId":60021,"textId":60021,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60022,"type":7,"typeArgs":[],"quality":4,"iconId":60022,"nameId":60022,"textId":60022,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60023,"type":7,"typeArgs":[],"quality":4,"iconId":60023,"nameId":60023,"textId":60023,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60024,"type":7,"typeArgs":[],"quality":4,"iconId":60024,"nameId":60024,"textId":60024,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, {"id":61000,"type":7,"typeArgs":[],"quality":5,"iconId":61000,"nameId":61000,"textId":61000,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, -{"id":62000,"type":7,"typeArgs":[],"quality":6,"iconId":62000,"nameId":62000,"textId":62000,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null} +{"id":61001,"type":7,"typeArgs":[],"quality":5,"iconId":61001,"nameId":61001,"textId":61001,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61002,"type":7,"typeArgs":[],"quality":5,"iconId":61002,"nameId":61002,"textId":61002,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61003,"type":7,"typeArgs":[],"quality":5,"iconId":61003,"nameId":61003,"textId":61003,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61004,"type":7,"typeArgs":[],"quality":5,"iconId":61004,"nameId":61004,"textId":61004,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61005,"type":7,"typeArgs":[],"quality":5,"iconId":61005,"nameId":61005,"textId":61005,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61006,"type":7,"typeArgs":[],"quality":5,"iconId":61006,"nameId":61006,"textId":61006,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61007,"type":7,"typeArgs":[],"quality":5,"iconId":61007,"nameId":61007,"textId":61007,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61008,"type":7,"typeArgs":[],"quality":5,"iconId":61008,"nameId":61008,"textId":61008,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61009,"type":7,"typeArgs":[],"quality":5,"iconId":61009,"nameId":61009,"textId":61009,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61010,"type":7,"typeArgs":[],"quality":5,"iconId":61010,"nameId":61010,"textId":61010,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61011,"type":7,"typeArgs":[],"quality":5,"iconId":61011,"nameId":61011,"textId":61011,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61012,"type":7,"typeArgs":[],"quality":5,"iconId":61012,"nameId":61012,"textId":61012,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61013,"type":7,"typeArgs":[],"quality":5,"iconId":61013,"nameId":61013,"textId":61013,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61014,"type":7,"typeArgs":[],"quality":5,"iconId":61014,"nameId":61014,"textId":61014,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61015,"type":7,"typeArgs":[],"quality":5,"iconId":61015,"nameId":61015,"textId":61015,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61016,"type":7,"typeArgs":[],"quality":5,"iconId":61016,"nameId":61016,"textId":61016,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61017,"type":7,"typeArgs":[],"quality":5,"iconId":61017,"nameId":61017,"textId":61017,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61018,"type":7,"typeArgs":[],"quality":5,"iconId":61018,"nameId":61018,"textId":61018,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61019,"type":7,"typeArgs":[],"quality":5,"iconId":61019,"nameId":61019,"textId":61019,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61020,"type":7,"typeArgs":[],"quality":5,"iconId":61020,"nameId":61020,"textId":61020,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61021,"type":7,"typeArgs":[],"quality":5,"iconId":61021,"nameId":61021,"textId":61021,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61022,"type":7,"typeArgs":[],"quality":5,"iconId":61022,"nameId":61022,"textId":61022,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61023,"type":7,"typeArgs":[],"quality":5,"iconId":61023,"nameId":61023,"textId":61023,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61024,"type":7,"typeArgs":[],"quality":5,"iconId":61024,"nameId":61024,"textId":61024,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61025,"type":7,"typeArgs":[],"quality":5,"iconId":61025,"nameId":61025,"textId":61025,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61026,"type":7,"typeArgs":[],"quality":5,"iconId":61026,"nameId":61026,"textId":61026,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":61027,"type":7,"typeArgs":[],"quality":5,"iconId":61027,"nameId":61027,"textId":61027,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":62000,"type":7,"typeArgs":[],"quality":5,"iconId":62000,"nameId":62000,"textId":62000,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null} ] \ No newline at end of file diff --git a/src/ReplicatedStorage/Json/Rune.json b/src/ReplicatedStorage/Json/Rune.json index e8e16bd..b1a366c 100644 --- a/src/ReplicatedStorage/Json/Rune.json +++ b/src/ReplicatedStorage/Json/Rune.json @@ -4,27 +4,27 @@ {"id":60002,"quality":1,"type":3,"icon":1,"nameId":60002,"runeName":"RuneLightDamage","behaviorName":null,"recycle":[],"isInPool":1}, {"id":60003,"quality":1,"type":4,"icon":1,"nameId":60003,"runeName":"RuneShadowDamage","behaviorName":null,"recycle":[],"isInPool":1}, {"id":60004,"quality":1,"type":null,"icon":1,"nameId":60004,"runeName":"RuneBookQualityPurple","behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60005,"quality":1,"type":null,"icon":1,"nameId":60005,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60006,"quality":1,"type":null,"icon":1,"nameId":60006,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60007,"quality":1,"type":null,"icon":1,"nameId":60007,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60008,"quality":1,"type":null,"icon":1,"nameId":60008,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60009,"quality":1,"type":null,"icon":1,"nameId":60009,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60010,"quality":1,"type":null,"icon":1,"nameId":60010,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60011,"quality":1,"type":null,"icon":1,"nameId":60011,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60012,"quality":1,"type":null,"icon":1,"nameId":60012,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60013,"quality":1,"type":null,"icon":1,"nameId":60013,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60014,"quality":1,"type":null,"icon":1,"nameId":60014,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60015,"quality":1,"type":null,"icon":1,"nameId":60015,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60016,"quality":1,"type":null,"icon":1,"nameId":60016,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60017,"quality":1,"type":null,"icon":1,"nameId":60017,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60018,"quality":1,"type":null,"icon":1,"nameId":60018,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60019,"quality":1,"type":null,"icon":1,"nameId":60019,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60020,"quality":1,"type":null,"icon":1,"nameId":60020,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60021,"quality":1,"type":null,"icon":1,"nameId":60021,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60022,"quality":1,"type":null,"icon":1,"nameId":60022,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60023,"quality":1,"type":null,"icon":1,"nameId":60023,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":60024,"quality":1,"type":null,"icon":1,"nameId":60024,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":61000,"quality":2,"type":1,"icon":1,"nameId":61000,"runeName":"RuneIceCoffin","behaviorName":"IceCoffine","recycle":[],"isInPool":1}, +{"id":60005,"quality":1,"type":null,"icon":1,"nameId":60005,"runeName":"RuneWearKnife","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60006,"quality":1,"type":null,"icon":1,"nameId":60006,"runeName":"RuneWearSword","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60007,"quality":1,"type":null,"icon":1,"nameId":60007,"runeName":"RuneWearStick","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60008,"quality":1,"type":null,"icon":1,"nameId":60008,"runeName":"RuneWearHeavyStick","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60009,"quality":1,"type":null,"icon":1,"nameId":60009,"runeName":"RuneCritDamageRateFire","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60010,"quality":1,"type":null,"icon":1,"nameId":60010,"runeName":"RuneCritDamageRateIce","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60011,"quality":1,"type":null,"icon":1,"nameId":60011,"runeName":"RuneCritDamageRateLight","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60012,"quality":1,"type":null,"icon":1,"nameId":60012,"runeName":"RuneCritDamageRateShadow","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60013,"quality":1,"type":null,"icon":1,"nameId":60013,"runeName":"RuneWearEmptySlot","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60014,"quality":1,"type":null,"icon":1,"nameId":60014,"runeName":"RuneWearFillSlot","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60015,"quality":1,"type":null,"icon":1,"nameId":60015,"runeName":"RuneWearElementAttack","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60016,"quality":1,"type":null,"icon":1,"nameId":60016,"runeName":"RuneFirstAttack","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60017,"quality":1,"type":null,"icon":1,"nameId":60017,"runeName":"RuneKillEnemyHeal","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60018,"quality":1,"type":null,"icon":1,"nameId":60018,"runeName":"RuneWearExAttributeAttack","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60019,"quality":1,"type":null,"icon":1,"nameId":60019,"runeName":"RuneBossAtk","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60020,"quality":1,"type":null,"icon":1,"nameId":60020,"runeName":"RuneBossHp","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60021,"quality":1,"type":null,"icon":1,"nameId":60021,"runeName":"RuneHpToAtk","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60022,"quality":1,"type":null,"icon":1,"nameId":60022,"runeName":"RuneAtkSpeed","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60023,"quality":1,"type":null,"icon":1,"nameId":60023,"runeName":"RuneThunderDoubleDamage","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":60024,"quality":1,"type":null,"icon":1,"nameId":60024,"runeName":"RuneWearElementAttackSpeed","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":61000,"quality":2,"type":1,"icon":1,"nameId":61000,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, {"id":61001,"quality":2,"type":null,"icon":1,"nameId":61001,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, {"id":61002,"quality":2,"type":null,"icon":1,"nameId":61002,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, {"id":61003,"quality":2,"type":null,"icon":1,"nameId":61003,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, @@ -47,7 +47,7 @@ {"id":61020,"quality":2,"type":null,"icon":1,"nameId":61020,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, {"id":61021,"quality":2,"type":null,"icon":1,"nameId":61021,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, {"id":61022,"quality":2,"type":null,"icon":1,"nameId":61022,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, -{"id":61023,"quality":2,"type":null,"icon":1,"nameId":61023,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, +{"id":61023,"quality":2,"type":null,"icon":1,"nameId":61023,"runeName":"RuneIceCoffin","behaviorName":"IceCoffine","recycle":[],"isInPool":1}, {"id":61024,"quality":2,"type":null,"icon":1,"nameId":61024,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, {"id":61025,"quality":2,"type":null,"icon":1,"nameId":61025,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, {"id":61026,"quality":2,"type":null,"icon":1,"nameId":61026,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}, diff --git a/src/ReplicatedStorage/Modules/Filter.luau b/src/ReplicatedStorage/Modules/Filter.luau index 55b862e..1e1944f 100644 --- a/src/ReplicatedStorage/Modules/Filter.luau +++ b/src/ReplicatedStorage/Modules/Filter.luau @@ -57,9 +57,9 @@ function Filter:AddHandler(handlerFunction: (data: any) -> any, priority: number self._weakRefs[owner] = handlerId end - -- 按优先级排序(优先级高的先执行) + -- 按优先级排序(优先级数值越小的越先执行) table.sort(self._handlers, function(a, b) - return a.priority > b.priority + return a.priority < b.priority end) return handlerId diff --git a/src/ReplicatedStorage/Tools/Utils.luau b/src/ReplicatedStorage/Tools/Utils.luau index 4798de8..d072b55 100644 --- a/src/ReplicatedStorage/Tools/Utils.luau +++ b/src/ReplicatedStorage/Tools/Utils.luau @@ -277,6 +277,11 @@ function Utils:TableSafeAddValue(AttributesData: table, AttributeName: string, A AttributesData[AttributeName] = (AttributesData[AttributeName] or 0) + AttributeValue end +-- 给表设置key,value +function Utils:TableSafeSetValue(AttributesData: table, AttributeName: string, AttributeValue: number) + AttributesData[AttributeName] = AttributeValue +end + -- 给表增加key,value(加法计算),按第二个参数表的内容增加 function Utils:TableSafeAddTableValue(AttributesData: table, AddTableValue: table) for AttributeName, AttributeValue in AddTableValue do diff --git a/src/ServerStorage/Base/Rune.luau b/src/ServerStorage/Base/Rune.luau index bdd9a12..0b59c31 100644 --- a/src/ServerStorage/Base/Rune.luau +++ b/src/ServerStorage/Base/Rune.luau @@ -24,6 +24,15 @@ function Rune:Init(PlayerAI: Player, Character: TypeList.Character, ScriptName: return self end +function Rune:InitFinish() + self:OnInitFinish() +end + +function Rune:OnInitFinish() + -- 子类可以重写这个方法(主要是,初始化时WearingSlot等还没赋值) + -- 监听事件用到参数是部分还没赋值,所以增加这个函数 +end + -- 开始记录 function Rune:StartRecording() self.isRecording = true @@ -150,9 +159,9 @@ end -- 销毁 function Rune:OnDestroy() - self.executionRecords = nil - for _, data in self do - data = nil + -- 清理所有属性引用 + for key, _ in pairs(self) do + self[key] = nil end self = nil end diff --git a/src/ServerStorage/Modules/Runes/RuneAtkSpeed.luau b/src/ServerStorage/Modules/Runes/RuneAtkSpeed.luau new file mode 100644 index 0000000..6a96caf --- /dev/null +++ b/src/ServerStorage/Modules/Runes/RuneAtkSpeed.luau @@ -0,0 +1,33 @@ +--> Services +local ReplicatedStorage = game:GetService("ReplicatedStorage") +local ServerStorage = game:GetService("ServerStorage") + +--> Dependencies +local Utils = require(ReplicatedStorage.Tools.Utils) +local TypeList = require(ServerStorage.Base.TypeList) +local Rune = require(ServerStorage.Base.Rune) + +local RuneAtkSpeed = {} +RuneAtkSpeed.__index = RuneAtkSpeed +setmetatable(RuneAtkSpeed, {__index = Rune}) + + +function RuneAtkSpeed:Init(PlayerAI, Character: TypeList.Character) + local self = Rune:Init(PlayerAI, Character, script.Name) + setmetatable(self, RuneAtkSpeed) + + return self +end + +function RuneAtkSpeed:Check(index: number, AttributesData: table, BehaviorNameList: table) + return true +end + +function RuneAtkSpeed:OnExecute(index: number, AttributesData: table, BehaviorNameList: table) + local baseAttribute = AttributesData.atkSpeed or 1 + local addAttribute = baseAttribute - math.floor(baseAttribute * 25) / 100 + Utils:TableSafeSetValue(AttributesData, "atkSpeed", addAttribute) + return nil +end + +return RuneAtkSpeed \ No newline at end of file diff --git a/src/ServerStorage/Modules/Runes/RuneBookQualityYellow.luau b/src/ServerStorage/Modules/Runes/RuneBookQualityYellow.luau new file mode 100644 index 0000000..a180cca --- /dev/null +++ b/src/ServerStorage/Modules/Runes/RuneBookQualityYellow.luau @@ -0,0 +1,53 @@ +--> Services +local ReplicatedStorage = game:GetService("ReplicatedStorage") +local ServerStorage = game:GetService("ServerStorage") + +--> Dependencies +local Utils = require(ReplicatedStorage.Tools.Utils) +local TypeList = require(ServerStorage.Base.TypeList) +local Rune = require(ServerStorage.Base.Rune) + +local RuneBookQualityYellow = {} +RuneBookQualityYellow.__index = RuneBookQualityYellow +setmetatable(RuneBookQualityYellow, {__index = Rune}) + + +function RuneBookQualityYellow:Init(PlayerAI, Character: TypeList.Character) + local self = Rune:Init(PlayerAI, Character, script.Name) + setmetatable(self, RuneBookQualityYellow) + + return self +end + +function RuneBookQualityYellow:Check(index: number, AttributesData: table, BehaviorNameList: table) + local pDataFolder = ReplicatedStorage:FindFirstChild("PlayerData") + if not pDataFolder then return nil end + local pData = pDataFolder:FindFirstChild(self.PlayerAI.Player.UserId) + if not pData then return nil end + + local bookFolder = pData:FindFirstChild("Book") + if not bookFolder then return nil end + local bookList = bookFolder:GetChildren() + if #bookList == 0 then return nil end + + self.Data = bookList + + return true +end + +function RuneBookQualityYellow:OnExecute(index: number, AttributesData: table, BehaviorNameList: table) + local qualityNumber = 0 + for _, book in self.Data do + local bookQuality = book:GetAttribute("quality") + if bookQuality >= 4 then + qualityNumber = qualityNumber + 1 + end + end + local attackRate = math.floor(qualityNumber * 50 / 100) + Utils:TableSafeAddValue(AttributesData, "attackRate", attackRate) + + return nil +end + + +return RuneBookQualityYellow \ No newline at end of file diff --git a/src/ServerStorage/Modules/Runes/RuneCritToAttackRate.luau b/src/ServerStorage/Modules/Runes/RuneCritToAttackRate.luau new file mode 100644 index 0000000..d7f9021 --- /dev/null +++ b/src/ServerStorage/Modules/Runes/RuneCritToAttackRate.luau @@ -0,0 +1,37 @@ +--> Services +local ReplicatedStorage = game:GetService("ReplicatedStorage") +local ServerStorage = game:GetService("ServerStorage") + +--> Dependencies +local Utils = require(ReplicatedStorage.Tools.Utils) +local TypeList = require(ServerStorage.Base.TypeList) +local Rune = require(ServerStorage.Base.Rune) + +local RuneCritToAttackRate = {} +RuneCritToAttackRate.__index = RuneCritToAttackRate +setmetatable(RuneCritToAttackRate, {__index = Rune}) + + +function RuneCritToAttackRate:Init(PlayerAI, Character: TypeList.Character) + local self = Rune:Init(PlayerAI, Character, script.Name) + setmetatable(self, RuneCritToAttackRate) + + return self +end + +function RuneCritToAttackRate:Check(index: number, AttributesData: table, BehaviorNameList: table) + return true +end + +function RuneCritToAttackRate:OnExecute(index: number, AttributesData: table, BehaviorNameList: table) + local nowAttribute = AttributesData.critRate + if not nowAttribute then return nil end + + local addAttribute = math.floor(nowAttribute * 10) + Utils:TableSafeAddValue(AttributesData, "attackRate", addAttribute) + Utils:TableSafeSetValue(AttributesData, "critRate", 0) + return nil +end + + +return RuneCritToAttackRate \ No newline at end of file diff --git a/src/ServerStorage/Modules/Runes/RuneFirstAttack.luau b/src/ServerStorage/Modules/Runes/RuneFirstAttack.luau index f93fcf6..20adb0f 100644 --- a/src/ServerStorage/Modules/Runes/RuneFirstAttack.luau +++ b/src/ServerStorage/Modules/Runes/RuneFirstAttack.luau @@ -22,6 +22,10 @@ function RuneFirstAttack:Init(PlayerAI, Character: TypeList.Character) setmetatable(self, RuneFirstAttack) self.FirstAttack = true + return self +end + +function RuneFirstAttack:OnInitFinish() EventFilter.SubscribeGlobalFilter(EventFilterEnum.BEFORE_ATTACK, function(eventData) if self.FirstAttack then self.FirstAttack = false @@ -30,9 +34,8 @@ function RuneFirstAttack:Init(PlayerAI, Character: TypeList.Character) end end return eventData - end, 10, self) + end, self.TriggerSlot, self) - return self end function RuneFirstAttack:Check(index: number, AttributesData: table, BehaviorNameList: table) diff --git a/src/ServerStorage/Modules/Runes/RuneKillCoin.luau b/src/ServerStorage/Modules/Runes/RuneKillCoin.luau new file mode 100644 index 0000000..8fde1ed --- /dev/null +++ b/src/ServerStorage/Modules/Runes/RuneKillCoin.luau @@ -0,0 +1,49 @@ +--> Services +local ReplicatedStorage = game:GetService("ReplicatedStorage") +local ServerStorage = game:GetService("ServerStorage") + +--> Dependencies +local Utils = require(ReplicatedStorage.Tools.Utils) +local TypeList = require(ServerStorage.Base.TypeList) +local Rune = require(ServerStorage.Base.Rune) +local PlayerInfoProxy = require(ServerStorage.Proxy.PlayerInfoProxy) +local Rng = require(ReplicatedStorage.Tools.Rng) + +--> EventFilter +local EventFilter = require(ReplicatedStorage.Modules.EventFilter) +local EventFilterEnum = require(ReplicatedStorage.Data.EventFilterEnum) + + + + +local RuneKillCoin = {} +RuneKillCoin.__index = RuneKillCoin +setmetatable(RuneKillCoin, {__index = Rune}) + + +function RuneKillCoin:Init(PlayerAI, Character: TypeList.Character) + local self = Rune:Init(PlayerAI, Character, script.Name) + setmetatable(self, RuneKillCoin) + + return self +end + +function RuneKillCoin:OnInitFinish() + EventFilter.SubscribeGlobalFilter(EventFilterEnum.BEFORE_KILL_MONSTER, function(eventData) + if Rng:RandomPercent(25) then + PlayerInfoProxy:ChangeItemCount(self.PlayerAI.Player, 1, 10) + end + return eventData + end, self.TriggerSlot, self) +end + +function RuneKillCoin:Check(index: number, AttributesData: table, BehaviorNameList: table) + return true +end + +function RuneKillCoin:OnExecute(index: number, AttributesData: table, BehaviorNameList: table) + return nil +end + + +return RuneKillCoin \ No newline at end of file diff --git a/src/ServerStorage/Modules/Runes/RuneKillEnemyHeal.luau b/src/ServerStorage/Modules/Runes/RuneKillEnemyHeal.luau index 185e128..7527aee 100644 --- a/src/ServerStorage/Modules/Runes/RuneKillEnemyHeal.luau +++ b/src/ServerStorage/Modules/Runes/RuneKillEnemyHeal.luau @@ -25,16 +25,19 @@ function RuneKillEnemyHeal:Init(PlayerAI, Character: TypeList.Character) setmetatable(self, RuneKillEnemyHeal) self.FirstAttack = true + return self +end + +function RuneKillEnemyHeal:OnInitFinish() EventFilter.SubscribeGlobalFilter(EventFilterEnum.BEFORE_KILL_MONSTER, function(eventData) if self.FirstAttack then self.FirstAttack = false - DamageProxy:Heal(PlayerAI, PlayerAI, math.floor(self.Character.Config.maxhp * 0.01)) + DamageProxy:Heal(self.PlayerAI, self.PlayerAI, math.floor(self.Character.Config.maxhp * 0.01)) end - end, 10, self) - - return self + end, self.TriggerSlot, self) end + function RuneKillEnemyHeal:Check(index: number, AttributesData: table, BehaviorNameList: table) return true end diff --git a/src/ServerStorage/Modules/Runes/RuneNormalCritRate.luau b/src/ServerStorage/Modules/Runes/RuneNormalCritRate.luau new file mode 100644 index 0000000..c960dd6 --- /dev/null +++ b/src/ServerStorage/Modules/Runes/RuneNormalCritRate.luau @@ -0,0 +1,31 @@ +--> Services +local ReplicatedStorage = game:GetService("ReplicatedStorage") +local ServerStorage = game:GetService("ServerStorage") + +--> Dependencies +local Utils = require(ReplicatedStorage.Tools.Utils) +local TypeList = require(ServerStorage.Base.TypeList) +local Rune = require(ServerStorage.Base.Rune) +local RuneNormalCritRate = {} +RuneNormalCritRate.__index = RuneNormalCritRate +setmetatable(RuneNormalCritRate, {__index = Rune}) + + +function RuneNormalCritRate:Init(PlayerAI, Character: TypeList.Character) + local self = Rune:Init(PlayerAI, Character, script.Name) + setmetatable(self, RuneNormalCritRate) + + return self +end + +function RuneNormalCritRate:Check(index: number, AttributesData: table, BehaviorNameList: table) + return true +end + +function RuneNormalCritRate:OnExecute(index: number, AttributesData: table, BehaviorNameList: table) + Utils:TableSafeAddValue(AttributesData, "critDamageRate", 100) + return nil +end + + +return RuneNormalCritRate \ No newline at end of file diff --git a/src/ServerStorage/Modules/Runes/RuneNormalNoElement.luau b/src/ServerStorage/Modules/Runes/RuneNormalNoElement.luau new file mode 100644 index 0000000..8224ed9 --- /dev/null +++ b/src/ServerStorage/Modules/Runes/RuneNormalNoElement.luau @@ -0,0 +1,51 @@ +--> Services +local ReplicatedStorage = game:GetService("ReplicatedStorage") +local ServerStorage = game:GetService("ServerStorage") + +--> Dependencies +local Utils = require(ReplicatedStorage.Tools.Utils) +local TypeList = require(ServerStorage.Base.TypeList) +local Rune = require(ServerStorage.Base.Rune) +local RuneNormalNoElement = {} +RuneNormalNoElement.__index = RuneNormalNoElement +setmetatable(RuneNormalNoElement, {__index = Rune}) + + +function RuneNormalNoElement:Init(PlayerAI, Character: TypeList.Character) + local self = Rune:Init(PlayerAI, Character, script.Name) + setmetatable(self, RuneNormalNoElement) + + return self +end + +function RuneNormalNoElement:Check(index: number, AttributesData: table, BehaviorNameList: table) + return true +end + +function RuneNormalNoElement:OnExecute(index: number, AttributesData: table, BehaviorNameList: table) + local pDataFolder = ReplicatedStorage:FindFirstChild("PlayerData") + if not pDataFolder then return nil end + local pData = pDataFolder:FindFirstChild(self.PlayerAI.Player.UserId) + if not pData then return nil end + + local equipmentFolder = pData:FindFirstChild("Equipment") + if not equipmentFolder then return nil end + local equipmentList = equipmentFolder:GetChildren() + if #equipmentList == 0 then return nil end + + local elementNumber = 0 + for _, equipment in equipmentList do + local equipmentWearing = equipment:GetAttribute("wearing") + if equipmentWearing > 0 and #equipment:FindFirstChild("Element"):GetAttributes() == 0 then + elementNumber = elementNumber + 1 + end + end + + local attackRate = math.floor((AttributesData.attackRate or 100) * elementNumber * 50 / 100) + Utils:TableSafeAddValue(AttributesData, "attackRate", attackRate) + + return nil +end + + +return RuneNormalNoElement \ No newline at end of file diff --git a/src/ServerStorage/Modules/Runes/RuneSacrifice.luau b/src/ServerStorage/Modules/Runes/RuneSacrifice.luau new file mode 100644 index 0000000..0df0833 --- /dev/null +++ b/src/ServerStorage/Modules/Runes/RuneSacrifice.luau @@ -0,0 +1,38 @@ +--> Services +local ReplicatedStorage = game:GetService("ReplicatedStorage") +local ServerStorage = game:GetService("ServerStorage") + +--> Dependencies +local Utils = require(ReplicatedStorage.Tools.Utils) +local TypeList = require(ServerStorage.Base.TypeList) +local Rune = require(ServerStorage.Base.Rune) + +local RuneSacrifice = {} +RuneSacrifice.__index = RuneSacrifice +setmetatable(RuneSacrifice, {__index = Rune}) + + +function RuneSacrifice:Init(PlayerAI, Character: TypeList.Character) + local self = Rune:Init(PlayerAI, Character, script.Name) + setmetatable(self, RuneSacrifice) + + return self +end + +function RuneSacrifice:Check(index: number, AttributesData: table, BehaviorNameList: table) + return true +end + +function RuneSacrifice:OnExecute(index: number, AttributesData: table, BehaviorNameList: table) + local hpAttribute = AttributesData.hp + + local reduceHp = math.floor(hpAttribute * 0.25) + + Utils:TableSafeAddValue(AttributesData, "attackRate", 50) + Utils:TableSafeSetValue(AttributesData, "hp", RuneSacrifice - reduceHp) + + return nil +end + + +return RuneSacrifice \ No newline at end of file diff --git a/src/ServerStorage/Modules/Runes/RuneThunderAddDamageTime.luau b/src/ServerStorage/Modules/Runes/RuneThunderAddDamageTime.luau new file mode 100644 index 0000000..3c07054 --- /dev/null +++ b/src/ServerStorage/Modules/Runes/RuneThunderAddDamageTime.luau @@ -0,0 +1,47 @@ +--> Services +local ReplicatedStorage = game:GetService("ReplicatedStorage") +local ServerStorage = game:GetService("ServerStorage") + +--> Dependencies +local Utils = require(ReplicatedStorage.Tools.Utils) +local TypeList = require(ServerStorage.Base.TypeList) +local Rune = require(ServerStorage.Base.Rune) +local DamageProxy = require(ServerStorage.Proxy.DamageProxy) + +--> EventFilter +local EventFilter = require(ReplicatedStorage.Modules.EventFilter) +local EventFilterEnum = require(ReplicatedStorage.Data.EventFilterEnum) + +local RuneThunderAddDamageTime = {} +RuneThunderAddDamageTime.__index = RuneThunderAddDamageTime +setmetatable(RuneThunderAddDamageTime, {__index = Rune}) + + +function RuneThunderAddDamageTime:Init(PlayerAI, Character: TypeList.Character) + local self = Rune:Init(PlayerAI, Character, script.Name) + setmetatable(self, RuneThunderAddDamageTime) + + return self +end + +function RuneThunderAddDamageTime:OnInitFinish() + EventFilter.SubscribeGlobalFilter(EventFilterEnum.BEFORE_ATTACK, function(eventData) + for _, damageData in eventData.damageData do + if damageData.ElementType == DamageProxy.ElementType.LIGHT then + local newDamageData = Utils:DeepCopyTable(damageData) + table.insert(eventData.damageData, newDamageData) + end + end + return eventData + end, self.TriggerSlot, self) +end + +function RuneThunderAddDamageTime:Check(index: number, AttributesData: table, BehaviorNameList: table) + return true +end + +function RuneThunderAddDamageTime:OnExecute(index: number, AttributesData: table, BehaviorNameList: table) + return nil +end + +return RuneThunderAddDamageTime \ No newline at end of file diff --git a/src/ServerStorage/Modules/Runes/RuneThunderDoubleDamage.luau b/src/ServerStorage/Modules/Runes/RuneThunderDoubleDamage.luau new file mode 100644 index 0000000..09b6bb8 --- /dev/null +++ b/src/ServerStorage/Modules/Runes/RuneThunderDoubleDamage.luau @@ -0,0 +1,53 @@ +--> Services +local ReplicatedStorage = game:GetService("ReplicatedStorage") +local ServerStorage = game:GetService("ServerStorage") + +--> Dependencies +local Utils = require(ReplicatedStorage.Tools.Utils) +local TypeList = require(ServerStorage.Base.TypeList) +local Rune = require(ServerStorage.Base.Rune) +local DamageProxy = require(ServerStorage.Proxy.DamageProxy) + +--> EventFilter +local EventFilter = require(ReplicatedStorage.Modules.EventFilter) +local EventFilterEnum = require(ReplicatedStorage.Data.EventFilterEnum) + +local RuneThunderDoubleDamage = {} +RuneThunderDoubleDamage.__index = RuneThunderDoubleDamage +setmetatable(RuneThunderDoubleDamage, {__index = Rune}) + + +function RuneThunderDoubleDamage:Init(PlayerAI, Character: TypeList.Character) + local self = Rune:Init(PlayerAI, Character, script.Name) + setmetatable(self, RuneThunderDoubleDamage) + + return self +end + +function RuneThunderDoubleDamage:OnInitFinish() + EventFilter.SubscribeGlobalFilter(EventFilterEnum.BEFORE_ATTACK, function(eventData) + local newDamageDataList = {} + for _, damageData in eventData.damageData do + if damageData.ElementType == DamageProxy.ElementType.LIGHT then + local newDamageData = Utils:DeepCopyTable(damageData) + table.insert(newDamageDataList, newDamageData) + end + end + if #newDamageDataList > 0 then + for _, newDamageData in newDamageDataList do + table.insert(eventData.damageData, newDamageData) + end + end + return eventData + end, self.TriggerSlot, self) +end + +function RuneThunderDoubleDamage:Check(index: number, AttributesData: table, BehaviorNameList: table) + return true +end + +function RuneThunderDoubleDamage:OnExecute(index: number, AttributesData: table, BehaviorNameList: table) + return nil +end + +return RuneThunderDoubleDamage \ No newline at end of file diff --git a/src/ServerStorage/Modules/Runes/RuneWearElementAttackSpeed.luau b/src/ServerStorage/Modules/Runes/RuneWearElementAttackSpeed.luau new file mode 100644 index 0000000..f874079 --- /dev/null +++ b/src/ServerStorage/Modules/Runes/RuneWearElementAttackSpeed.luau @@ -0,0 +1,52 @@ +--> Services +local ReplicatedStorage = game:GetService("ReplicatedStorage") +local ServerStorage = game:GetService("ServerStorage") + +--> Dependencies +local Utils = require(ReplicatedStorage.Tools.Utils) +local TypeList = require(ServerStorage.Base.TypeList) +local Rune = require(ServerStorage.Base.Rune) + +local RuneWearElementAttackSpeed = {} +RuneWearElementAttackSpeed.__index = RuneWearElementAttackSpeed +setmetatable(RuneWearElementAttackSpeed, {__index = Rune}) + + +function RuneWearElementAttackSpeed:Init(PlayerAI, Character: TypeList.Character) + local self = Rune:Init(PlayerAI, Character, script.Name) + setmetatable(self, RuneWearElementAttackSpeed) + + return self +end + +function RuneWearElementAttackSpeed:Check(index: number, AttributesData: table, BehaviorNameList: table) + return true +end + +function RuneWearElementAttackSpeed:OnExecute(index: number, AttributesData: table, BehaviorNameList: table) + local pDataFolder = ReplicatedStorage:FindFirstChild("PlayerData") + if not pDataFolder then return nil end + local pData = pDataFolder:FindFirstChild(self.PlayerAI.Player.UserId) + if not pData then return nil end + + local equipmentFolder = pData:FindFirstChild("Equipment") + if not equipmentFolder then return nil end + local equipmentList = equipmentFolder:GetChildren() + if #equipmentList == 0 then return nil end + + local elementNumber = 0 + for _, equipment in equipmentList do + local equipmentWearing = equipment:GetAttribute("wearing") + if equipmentWearing > 0 then + elementNumber = elementNumber + #equipment:FindFirstChild("Element"):GetAttributes() + end + end + + local baseAttribute = AttributesData.atkSpeed or 1 + local addAttribute = baseAttribute - math.floor(baseAttribute * elementNumber * 25) / 100 + Utils:TableSafeSetValue(AttributesData, "atkSpeed", addAttribute) + + return nil +end + +return RuneWearElementAttackSpeed \ No newline at end of file diff --git a/src/ServerStorage/Modules/Runes/RuneWearGenWeapon.luau b/src/ServerStorage/Modules/Runes/RuneWearGenWeapon.luau new file mode 100644 index 0000000..c877f4f --- /dev/null +++ b/src/ServerStorage/Modules/Runes/RuneWearGenWeapon.luau @@ -0,0 +1,59 @@ +--> Services +local ReplicatedStorage = game:GetService("ReplicatedStorage") +local ServerStorage = game:GetService("ServerStorage") + +--> Dependencies +local Utils = require(ReplicatedStorage.Tools.Utils) +local TypeList = require(ServerStorage.Base.TypeList) +local Rune = require(ServerStorage.Base.Rune) +local RuneWeaponTag = require(ReplicatedStorage.Data.RuneWeaponTag) + +local RuneWearGenWeapon = {} +RuneWearGenWeapon.__index = RuneWearGenWeapon +setmetatable(RuneWearGenWeapon, {__index = Rune}) + + +function RuneWearGenWeapon:Init(PlayerAI, Character: TypeList.Character) + local self = Rune:Init(PlayerAI, Character, script.Name) + setmetatable(self, RuneWearGenWeapon) + + return self +end + +function RuneWearGenWeapon:Check(index: number, AttributesData: table, BehaviorNameList: table) + return true +end + +function RuneWearGenWeapon:OnExecute(index: number, AttributesData: table, BehaviorNameList: table) + local pDataFolder = ReplicatedStorage:FindFirstChild("PlayerData") + if not pDataFolder then return nil end + local pData = pDataFolder:FindFirstChild(self.PlayerAI.Player.UserId) + if not pData then return nil end + + local equipmentFolder = pData:FindFirstChild("Equipment") + if not equipmentFolder then return nil end + local equipmentList = equipmentFolder:GetChildren() + if #equipmentList == 0 then return nil end + + -- 找到自己穿戴的装备所有类型 + local wearingTypeList = {} + for _, equipment in equipmentList do + local equipmentSubType = equipment:GetAttribute("subType") + local equipmentWearing = equipment:GetAttribute("wearing") + if equipmentWearing > 0 and not table.find(wearingTypeList, RuneWeaponTag[equipmentSubType]) then + table.insert(wearingTypeList, RuneWeaponTag[equipmentSubType]) + end + end + + -- 如果没有对应类型就加在ShareData中 + for _, wearingType in RuneWeaponTag do + if not table.find(wearingTypeList, wearingType) then + self.PlayerAI:SetSharedData(wearingType, 1) + end + end + + return nil +end + + +return RuneWearGenWeapon \ No newline at end of file diff --git a/src/ServerStorage/Modules/Runes/RuneWearHeavySword.luau b/src/ServerStorage/Modules/Runes/RuneWearHeavySword.luau index 8de30b3..92a4dbe 100644 --- a/src/ServerStorage/Modules/Runes/RuneWearHeavySword.luau +++ b/src/ServerStorage/Modules/Runes/RuneWearHeavySword.luau @@ -6,6 +6,7 @@ local ServerStorage = game:GetService("ServerStorage") local Utils = require(ReplicatedStorage.Tools.Utils) local TypeList = require(ServerStorage.Base.TypeList) local Rune = require(ServerStorage.Base.Rune) +local RuneWeaponTag = require(ReplicatedStorage.Data.RuneWeaponTag) local RuneWearHeavySword = {} RuneWearHeavySword.__index = RuneWearHeavySword @@ -45,7 +46,7 @@ function RuneWearHeavySword:OnExecute(index: number, AttributesData: table, Beha end end - local CheckShareName = "RuneTagHeavySword" + local CheckShareName = RuneWeaponTag[4] if self.PlayerAI:GetSharedData(CheckShareName) then subTypeNumber = subTypeNumber + self.PlayerAI:GetSharedData(CheckShareName) end diff --git a/src/ServerStorage/Modules/Runes/RuneWearKnife.luau b/src/ServerStorage/Modules/Runes/RuneWearKnife.luau index bffcd68..4ca465b 100644 --- a/src/ServerStorage/Modules/Runes/RuneWearKnife.luau +++ b/src/ServerStorage/Modules/Runes/RuneWearKnife.luau @@ -6,6 +6,7 @@ local ServerStorage = game:GetService("ServerStorage") local Utils = require(ReplicatedStorage.Tools.Utils) local TypeList = require(ServerStorage.Base.TypeList) local Rune = require(ServerStorage.Base.Rune) +local RuneWeaponTag = require(ReplicatedStorage.Data.RuneWeaponTag) local RuneWearKnife = {} RuneWearKnife.__index = RuneWearKnife @@ -45,7 +46,7 @@ function RuneWearKnife:OnExecute(index: number, AttributesData: table, BehaviorN end end - local CheckShareName = "RuneTagKnife" + local CheckShareName = RuneWeaponTag[1] if self.PlayerAI:GetSharedData(CheckShareName) then subTypeNumber = subTypeNumber + self.PlayerAI:GetSharedData(CheckShareName) end diff --git a/src/ServerStorage/Modules/Runes/RuneWearSingleRuneSlot.luau b/src/ServerStorage/Modules/Runes/RuneWearSingleRuneSlot.luau new file mode 100644 index 0000000..d1c00bf --- /dev/null +++ b/src/ServerStorage/Modules/Runes/RuneWearSingleRuneSlot.luau @@ -0,0 +1,52 @@ +--> Services +local ReplicatedStorage = game:GetService("ReplicatedStorage") +local ServerStorage = game:GetService("ServerStorage") + +--> Dependencies +local Utils = require(ReplicatedStorage.Tools.Utils) +local TypeList = require(ServerStorage.Base.TypeList) +local Rune = require(ServerStorage.Base.Rune) + +local RuneWearSingleRuneSlot = {} +RuneWearSingleRuneSlot.__index = RuneWearSingleRuneSlot +setmetatable(RuneWearSingleRuneSlot, {__index = Rune}) + + +function RuneWearSingleRuneSlot:Init(PlayerAI, Character: TypeList.Character) + local self = Rune:Init(PlayerAI, Character, script.Name) + setmetatable(self, RuneWearSingleRuneSlot) + + return self +end + +function RuneWearSingleRuneSlot:Check(index: number, AttributesData: table, BehaviorNameList: table) + return true +end + +function RuneWearSingleRuneSlot:OnExecute(index: number, AttributesData: table, BehaviorNameList: table) + local pDataFolder = ReplicatedStorage:FindFirstChild("PlayerData") + if not pDataFolder then return nil end + local pData = pDataFolder:FindFirstChild(self.PlayerAI.Player.UserId) + if not pData then return nil end + + local equipmentFolder = pData:FindFirstChild("Equipment") + if not equipmentFolder then return nil end + local equipmentList = equipmentFolder:GetChildren() + if #equipmentList == 0 then return nil end + + local singleRuneSlotNumber = 0 + for _, equipment in equipmentList do + local equipmentMaxRuneNumber = equipment:GetAttribute("maxRuneNumber") + if equipmentMaxRuneNumber == 1 then + singleRuneSlotNumber = singleRuneSlotNumber + 1 + end + end + + local baseAttribute = AttributesData.attackRate or 100 + local addAttribute = baseAttribute * (math.floor(singleRuneSlotNumber * 25) / 100) + Utils:TableSafeSetValue(AttributesData, "attackRate", addAttribute) + + return nil +end + +return RuneWearSingleRuneSlot \ No newline at end of file diff --git a/src/ServerStorage/Modules/Runes/RuneWearStick.luau b/src/ServerStorage/Modules/Runes/RuneWearStick.luau index 4aa1a87..ab4ff0e 100644 --- a/src/ServerStorage/Modules/Runes/RuneWearStick.luau +++ b/src/ServerStorage/Modules/Runes/RuneWearStick.luau @@ -6,6 +6,7 @@ local ServerStorage = game:GetService("ServerStorage") local Utils = require(ReplicatedStorage.Tools.Utils) local TypeList = require(ServerStorage.Base.TypeList) local Rune = require(ServerStorage.Base.Rune) +local RuneWeaponTag = require(ReplicatedStorage.Data.RuneWeaponTag) local RuneWearStick = {} RuneWearStick.__index = RuneWearStick @@ -45,7 +46,7 @@ function RuneWearStick:OnExecute(index: number, AttributesData: table, BehaviorN end end - local CheckShareName = "RuneTagStick" + local CheckShareName = RuneWeaponTag[3] if self.PlayerAI:GetSharedData(CheckShareName) then subTypeNumber = subTypeNumber + self.PlayerAI:GetSharedData(CheckShareName) end diff --git a/src/ServerStorage/Modules/Runes/RuneWearSword.luau b/src/ServerStorage/Modules/Runes/RuneWearSword.luau index b0ee014..0487e62 100644 --- a/src/ServerStorage/Modules/Runes/RuneWearSword.luau +++ b/src/ServerStorage/Modules/Runes/RuneWearSword.luau @@ -6,6 +6,7 @@ local ServerStorage = game:GetService("ServerStorage") local Utils = require(ReplicatedStorage.Tools.Utils) local TypeList = require(ServerStorage.Base.TypeList) local Rune = require(ServerStorage.Base.Rune) +local RuneWeaponTag = require(ReplicatedStorage.Data.RuneWeaponTag) local RuneWearSword = {} RuneWearSword.__index = RuneWearSword @@ -45,7 +46,7 @@ function RuneWearSword:OnExecute(index: number, AttributesData: table, BehaviorN end end - local CheckShareName = "RuneTagSword" + local CheckShareName = RuneWeaponTag[2] if self.PlayerAI:GetSharedData(CheckShareName) then subTypeNumber = subTypeNumber + self.PlayerAI:GetSharedData(CheckShareName) end diff --git a/src/ServerStorage/Proxy/PlayerFightProxy/PlayerAI.luau b/src/ServerStorage/Proxy/PlayerFightProxy/PlayerAI.luau index 5e315c0..7d3961a 100644 --- a/src/ServerStorage/Proxy/PlayerFightProxy/PlayerAI.luau +++ b/src/ServerStorage/Proxy/PlayerFightProxy/PlayerAI.luau @@ -113,6 +113,13 @@ function PlayerAI:AddRune(RuneName: string, WearingSlot: number?) self:UpdateRuneTriggerSlots() end +-- 触发所有符文初始化完成 +function PlayerAI:TriggerAllRunesInitFinish() + for _, data in self.RuneList do + data.rune:InitFinish() + end +end + -- 更新所有符文的TriggerSlot function PlayerAI:UpdateRuneTriggerSlots() -- 收集所有符文并按WearingSlot排序 diff --git a/src/StarterPlayerScripts/UI/Windows/RuneStateWindow/init.luau b/src/StarterPlayerScripts/UI/Windows/RuneStateWindow/init.luau index 9e29ffc..c6fe8e6 100644 --- a/src/StarterPlayerScripts/UI/Windows/RuneStateWindow/init.luau +++ b/src/StarterPlayerScripts/UI/Windows/RuneStateWindow/init.luau @@ -314,6 +314,7 @@ end -- 接收符文执行记录 function RuneStateWindow:OnRuneExecutionRecord(executionRecords: table) + print("OnRuneExecutionRecord", executionRecords) -- 自动刷新符文列表(获取最新的穿戴符文数据) self:RefreshRuneList()