refactor(fight): 统一技能执行方法命名并修复战斗逻辑错误 - 将多个boss技能结构体中的OnSkill()方法重命名为Skill_Use()以保持一致性 - 修改fightc.go中的战斗回合逻辑,修复attacker和defender的执行顺序错误 - 将Effect126的TurnStart方法改为Skill_Use方法并返回bool值 - 为Effect499添加缺失的方法实现 - 移除effect_124_126.go中未
This commit is contained in:
@@ -11,7 +11,7 @@ type NewSel116 struct {
|
||||
NewSel0
|
||||
}
|
||||
|
||||
func (e *NewSel116) OnSkill() bool {
|
||||
func (e *NewSel116) Skill_Use() bool {
|
||||
if e.ID().GetCatchTime() != e.Ctx().Our.CurrentPet.Info.CatchTime {
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ type NewSel223 struct {
|
||||
NewSel0
|
||||
}
|
||||
|
||||
func (e *NewSel223) OnSkill() bool {
|
||||
func (e *NewSel223) Skill_Use() bool {
|
||||
if e.ID().GetCatchTime() != e.Ctx().Our.CurrentPet.Info.CatchTime {
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ type NewSel323 struct {
|
||||
NewSel0
|
||||
}
|
||||
|
||||
func (e *NewSel323) OnSkill() bool {
|
||||
func (e *NewSel323) Skill_Use() bool {
|
||||
if e.ID().GetCatchTime() != e.Ctx().Our.CurrentPet.Info.CatchTime {
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ type NewSel66 struct {
|
||||
NewSel0
|
||||
}
|
||||
|
||||
func (e *NewSel66) OnSkill() bool {
|
||||
func (e *NewSel66) Skill_Use() bool {
|
||||
if e.ID().GetCatchTime() != e.Ctx().Our.CurrentPet.Info.CatchTime {
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ type NewSel67 struct {
|
||||
NewSel0
|
||||
}
|
||||
|
||||
func (e *NewSel67) OnSkill() bool {
|
||||
func (e *NewSel67) Skill_Use() bool {
|
||||
if e.ID().GetCatchTime() != e.Ctx().Our.CurrentPet.Info.CatchTime {
|
||||
return true
|
||||
}
|
||||
|
||||
22
logic/service/fight/effect/486.go
Normal file
22
logic/service/fight/effect/486.go
Normal file
@@ -0,0 +1,22 @@
|
||||
package effect
|
||||
|
||||
import (
|
||||
"blazing/logic/service/fight/input"
|
||||
"blazing/logic/service/fight/node"
|
||||
)
|
||||
|
||||
// 486 - 下n回合若自身选择使用技能则无视对手能力提升状态
|
||||
type Effect486 struct {
|
||||
node.EffectNode
|
||||
}
|
||||
|
||||
func (e *Effect486) OnSkill() bool {
|
||||
// 设置标志,接下来n回合内无视对手能力提升
|
||||
e.Ctx().Our.IgnoreOpponentPositiveBuffsForNDuration(int(e.Args()[0].IntPart()))
|
||||
|
||||
return true
|
||||
}
|
||||
func init() {
|
||||
input.InitEffect(input.EffectType.Skill, 486, &Effect486{})
|
||||
|
||||
}
|
||||
36
logic/service/fight/effect/491.go
Normal file
36
logic/service/fight/effect/491.go
Normal file
@@ -0,0 +1,36 @@
|
||||
package effect
|
||||
|
||||
import (
|
||||
"blazing/logic/service/fight/info"
|
||||
"blazing/logic/service/fight/input"
|
||||
"blazing/logic/service/fight/node"
|
||||
|
||||
"github.com/alpacahq/alpacadecimal"
|
||||
)
|
||||
|
||||
// 491 - 3回合内对手造成的伤害降低m%
|
||||
type Effect491 struct {
|
||||
node.EffectNode
|
||||
}
|
||||
|
||||
func (e *Effect491) DamageDivEx(t *info.DamageZone) bool {
|
||||
if t.Type != info.DamageType.Red {
|
||||
return true
|
||||
}
|
||||
damageReduction := alpacadecimal.NewFromInt(int64(e.Args()[1].IntPart())).Mul(t.Damage)
|
||||
if t.Damage.Cmp(damageReduction) > 0 {
|
||||
t.Damage = t.Damage.Sub(damageReduction)
|
||||
} else {
|
||||
t.Damage = alpacadecimal.Zero
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
func (e *Effect491) SetArgs(t *input.Input, a ...int) {
|
||||
e.EffectNode.SetArgs(t, a...)
|
||||
e.EffectNode.Duration(a[0]) // 持续n回合
|
||||
}
|
||||
func init() {
|
||||
input.InitEffect(input.EffectType.Skill, 491, &Effect491{})
|
||||
|
||||
}
|
||||
33
logic/service/fight/effect/506.go
Normal file
33
logic/service/fight/effect/506.go
Normal file
@@ -0,0 +1,33 @@
|
||||
package effect
|
||||
|
||||
import (
|
||||
"blazing/logic/service/fight/input"
|
||||
"blazing/logic/service/fight/node"
|
||||
)
|
||||
|
||||
// 506 - 下回合受到致命伤害时残留m点体力
|
||||
type Effect506 struct {
|
||||
node.EffectNode
|
||||
triggered bool
|
||||
}
|
||||
|
||||
func (e *Effect506) Skill_Use() bool {
|
||||
e.triggered = true
|
||||
|
||||
return true
|
||||
}
|
||||
func (e *Effect506) Action_end() bool {
|
||||
if !e.triggered {
|
||||
return true
|
||||
}
|
||||
minHealth := uint32(e.Args()[0].IntPart()) // m点体力
|
||||
if e.Ctx().Our.CurrentPet.GetHP().IntPart() == 0 {
|
||||
e.Ctx().Our.CurrentPet.Info.Hp = minHealth
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
func init() {
|
||||
input.InitEffect(input.EffectType.Skill, 506, &Effect506{})
|
||||
|
||||
}
|
||||
@@ -102,23 +102,6 @@ func (e *Effect407) OnSkill() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
// 491 - 3回合内对手造成的伤害降低m%
|
||||
type Effect491 struct {
|
||||
node.EffectNode
|
||||
}
|
||||
|
||||
func (e *Effect491) OnSkill() bool {
|
||||
// 创建一个降低对手伤害的效果
|
||||
damageReduceEffect := e.Ctx().Our.InitEffect(input.EffectType.Status, int(info.PetStatus.ReduceDamageTaken))
|
||||
if damageReduceEffect != nil {
|
||||
damageReduceEffect.SetArgs(e.Ctx().Our, int(e.Args()[0].IntPart()))
|
||||
damageReduceEffect.Duration(3) // 持续3回合
|
||||
e.Ctx().Opp.AddEffect(e.Ctx().Our, damageReduceEffect)
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// 462 - n回合内受攻击时反弹m点固定伤害
|
||||
type Effect462 struct {
|
||||
node.EffectNode
|
||||
@@ -527,18 +510,6 @@ func (e *Effect156) SetArgs(t *input.Input, a ...int) {
|
||||
e.EffectNode.Duration(a[0]) // 持续n回合
|
||||
}
|
||||
|
||||
// 486 - 下n回合若自身选择使用技能则无视对手能力提升状态
|
||||
type Effect486 struct {
|
||||
node.EffectNode
|
||||
}
|
||||
|
||||
func (e *Effect486) OnSkill() bool {
|
||||
// 设置标志,接下来n回合内无视对手能力提升
|
||||
e.Ctx().Our.IgnoreOpponentPositiveBuffsForNDuration(int(e.Args()[0].IntPart()))
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// 197 - n回合内若被对方击败,则对手所有能力加强状态消失
|
||||
type Effect197 struct {
|
||||
node.EffectNode
|
||||
@@ -697,22 +668,3 @@ func (e *Effect461) OnSkill() bool {
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// 506 - 下回合受到致命伤害时残留m点体力
|
||||
type Effect506 struct {
|
||||
node.EffectNode
|
||||
}
|
||||
|
||||
func (e *Effect506) OnSkill() bool {
|
||||
minHealth := int(e.Args()[0].IntPart()) // m点体力
|
||||
|
||||
// 设置保护效果,下回合受到致命伤害时保留m点体力
|
||||
protectEffect := e.Ctx().Our.InitEffect(input.EffectType.Status, int(info.PetStatus.ProtectFromKO))
|
||||
if protectEffect != nil {
|
||||
protectEffect.SetArgs(e.Ctx().Our, minHealth)
|
||||
protectEffect.Duration(1) // 仅下回合有效
|
||||
e.Ctx().Our.AddEffect(e.Ctx().Our, protectEffect)
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
@@ -21,7 +21,7 @@ func init() {
|
||||
|
||||
}
|
||||
|
||||
func (e *Effect101) OnSkill() bool {
|
||||
func (e *Effect101) Skill_Use() bool {
|
||||
|
||||
e.Input.Heal(
|
||||
e.Ctx().Our, &action.SelectSkillAction{}, e.Ctx().Our.SumDamage.Mul(e.Args()[0].Div(alpacadecimal.NewFromInt(100))),
|
||||
|
||||
@@ -50,7 +50,7 @@ func (e *Effect104) SetArgs(t *input.Input, a ...int) {
|
||||
// -----------------------------------------------------------
|
||||
// 技能触发时调用
|
||||
// -----------------------------------------------------------
|
||||
func (e *Effect104) OnSkill() bool {
|
||||
func (e *Effect104) Skill_Use() bool {
|
||||
|
||||
if !e.can {
|
||||
e.can = true
|
||||
|
||||
@@ -20,7 +20,7 @@ func init() {
|
||||
}
|
||||
|
||||
// 命中之后
|
||||
func (e *Effect105) OnSkill() bool {
|
||||
func (e *Effect105) Skill_Use() bool {
|
||||
|
||||
e.Input.Heal(
|
||||
e.Ctx().Our, &action.SelectSkillAction{}, e.Ctx().Our.SumDamage.Div(e.Args()[0]),
|
||||
|
||||
@@ -23,7 +23,7 @@ type Effect115 struct {
|
||||
node.EffectNode
|
||||
}
|
||||
|
||||
func (e *Effect115) OnSkill() bool {
|
||||
func (e *Effect115) Skill_Use() bool {
|
||||
|
||||
// 概率判定
|
||||
ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100)
|
||||
|
||||
@@ -17,7 +17,7 @@ type Effect119 struct {
|
||||
can bool
|
||||
}
|
||||
|
||||
func (e *Effect119) OnSkill() bool {
|
||||
func (e *Effect119) Skill_Use() bool {
|
||||
|
||||
e.can = true
|
||||
return true
|
||||
@@ -64,7 +64,7 @@ type Effect120 struct {
|
||||
node.EffectNode
|
||||
}
|
||||
|
||||
func (e *Effect120) OnSkill() bool {
|
||||
func (e *Effect120) Skill_Use() bool {
|
||||
|
||||
// 50%概率
|
||||
ok, _, _ := e.Input.Player.Roll(50, 100)
|
||||
@@ -99,7 +99,7 @@ type Effect121 struct {
|
||||
node.EffectNode
|
||||
}
|
||||
|
||||
func (e *Effect121) OnSkill() bool {
|
||||
func (e *Effect121) Skill_Use() bool {
|
||||
|
||||
// 检查属性是否相同
|
||||
if e.Ctx().Our.CurrentPet.PetInfo.Type == e.Ctx().Opp.CurrentPet.PetInfo.Type {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package effect
|
||||
|
||||
import (
|
||||
"blazing/logic/service/fight/action"
|
||||
"blazing/logic/service/fight/input"
|
||||
"blazing/logic/service/fight/node"
|
||||
)
|
||||
@@ -43,7 +42,7 @@ func (e *Effect126) SetArgs(t *input.Input, a ...int) {
|
||||
e.EffectNode.Duration(e.EffectNode.SideEffectArgs[0])
|
||||
}
|
||||
|
||||
func (e *Effect126) TurnStart(_, _ *action.SelectSkillAction) {
|
||||
func (e *Effect126) Skill_Use() bool {
|
||||
changeAmount := int(e.Args()[1].IntPart())
|
||||
|
||||
// 攻击等级+1 (属性索引0)
|
||||
@@ -51,6 +50,7 @@ func (e *Effect126) TurnStart(_, _ *action.SelectSkillAction) {
|
||||
|
||||
// 速度等级+1 (属性索引4)
|
||||
e.Ctx().Our.SetProp(e.Ctx().Our, 4, int8(changeAmount))
|
||||
return true
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------
|
||||
|
||||
@@ -15,7 +15,7 @@ type Effect130 struct {
|
||||
// -----------------------------------------------------------
|
||||
// 核心共性逻辑:命中且满足条件时,附加固定伤害
|
||||
// -----------------------------------------------------------
|
||||
func (e *Effect130) OnSkill() bool {
|
||||
func (e *Effect130) Skill_Use() bool {
|
||||
// 1. 命中判定失败,不触发
|
||||
|
||||
if e.Ctx().Opp.CurrentPet.Info.Gender != int(e.Args()[0].IntPart()) {
|
||||
|
||||
@@ -13,7 +13,7 @@ type Effect140 struct {
|
||||
node.EffectNode
|
||||
}
|
||||
|
||||
func (e *Effect140) OnSkill() bool {
|
||||
func (e *Effect140) Skill_Use() bool {
|
||||
maxHp := e.Ctx().Opp.CurrentPet.GetMaxHP()
|
||||
|
||||
// 随机降低1/n 到 1/m 的体力
|
||||
|
||||
@@ -19,7 +19,7 @@ func init() {
|
||||
}
|
||||
|
||||
// 命中之后
|
||||
func (e *Effect145) OnSkill() bool {
|
||||
func (e *Effect145) Skill_Use() bool {
|
||||
|
||||
if e.Ctx().Opp.StatEffect_Exist(info.PetStatus.Poisoned) {
|
||||
heal := e.Ctx().Our.CurrentPet.GetMaxHP().Div(e.Args()[0])
|
||||
|
||||
@@ -13,7 +13,7 @@ type Effect147 struct {
|
||||
can bool
|
||||
}
|
||||
|
||||
func (e *Effect147) OnSkill() bool {
|
||||
func (e *Effect147) Skill_Use() bool {
|
||||
|
||||
if e.IsFirst() {
|
||||
return true
|
||||
@@ -42,7 +42,7 @@ type Effect148 struct {
|
||||
can bool
|
||||
}
|
||||
|
||||
func (e *Effect148) OnSkill() bool {
|
||||
func (e *Effect148) Skill_Use() bool {
|
||||
|
||||
if e.IsFirst() {
|
||||
return true
|
||||
@@ -67,7 +67,7 @@ type Effect159 struct {
|
||||
node.EffectNode
|
||||
}
|
||||
|
||||
func (e *Effect159) OnSkill() bool {
|
||||
func (e *Effect159) Skill_Use() bool {
|
||||
|
||||
// 检查自身体力是否小于最大值的1/{0}
|
||||
maxHP := int64(e.Ctx().Our.CurrentPet.Info.MaxHp)
|
||||
|
||||
@@ -18,7 +18,7 @@ func init() {
|
||||
}
|
||||
|
||||
// 命中之后
|
||||
func (e *Effect151) OnSkill() bool {
|
||||
func (e *Effect151) Skill_Use() bool {
|
||||
|
||||
if e.Ctx().Opp.StatEffect_Exist(info.PetStatus.Burned) {
|
||||
chance := e.EffectNode.SideEffectArgs[0]
|
||||
|
||||
@@ -13,7 +13,7 @@ type Effect161 struct {
|
||||
node.EffectNode
|
||||
}
|
||||
|
||||
func (e *Effect161) OnSkill() bool {
|
||||
func (e *Effect161) Skill_Use() bool {
|
||||
chance := e.Args()[0].IntPart()
|
||||
success, _, _ := e.Input.Player.Roll(int(chance), 100)
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ type Effect172 struct {
|
||||
node.EffectNode
|
||||
}
|
||||
|
||||
func (e *Effect172) OnSkill() bool {
|
||||
func (e *Effect172) Skill_Use() bool {
|
||||
if e.IsFirst() {
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ func init() {
|
||||
}
|
||||
|
||||
// 命中之后
|
||||
func (e *Effect180) OnSkill() bool {
|
||||
func (e *Effect180) Skill_Use() bool {
|
||||
|
||||
e.Ctx().Opp.CancelTurn(e.Ctx().Our)
|
||||
return true
|
||||
|
||||
@@ -20,7 +20,7 @@ type Effect182 struct {
|
||||
node.EffectNode
|
||||
}
|
||||
|
||||
func (e *Effect182) OnSkill() bool {
|
||||
func (e *Effect182) Skill_Use() bool {
|
||||
|
||||
if e.Ctx().Opp.StatEffect_Exist(info.EnumPetStatus(e.Args()[0].IntPart())) {
|
||||
// 3. 概率判定(Args()[1]为触发概率)
|
||||
|
||||
@@ -20,7 +20,7 @@ type Effect467 struct {
|
||||
node.EffectNode
|
||||
}
|
||||
|
||||
func (e *Effect467) OnSkill() bool {
|
||||
func (e *Effect467) Skill_Use() bool {
|
||||
|
||||
if e.Ctx().Opp.StatEffect_Exist(info.EnumPetStatus(e.Args()[0].IntPart())) {
|
||||
e.Ctx().Opp.Damage(e.Ctx().Our, &info.DamageZone{
|
||||
|
||||
@@ -22,7 +22,7 @@ func init() {
|
||||
}
|
||||
|
||||
// 命中之后
|
||||
func (e *Effect478) OnSkill() bool {
|
||||
func (e *Effect478) Skill_Use() bool {
|
||||
|
||||
e.can = true
|
||||
return true
|
||||
|
||||
@@ -27,14 +27,20 @@ func (e *Effect499) ActionStartEx(fattack, sattack *action.SelectSkillAction) bo
|
||||
e.Alive(false)
|
||||
return true
|
||||
}
|
||||
func (e *Effect499) OnSkill() bool {
|
||||
func (e *Effect499) Skill_Use() bool {
|
||||
if e.IsFirst() {
|
||||
return true
|
||||
}
|
||||
e.can = true
|
||||
e.Duration(1)
|
||||
|
||||
return true
|
||||
}
|
||||
func (e *Effect104) Effect499(t *input.Input, a ...int) {
|
||||
|
||||
e.EffectNode.SetArgs(t, a...)
|
||||
e.EffectNode.Duration(1)
|
||||
|
||||
}
|
||||
func init() {
|
||||
input.InitEffect(input.EffectType.Skill, 499, &Effect499{})
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ type EffectStat struct {
|
||||
// -----------------------------------------------------------
|
||||
// 技能触发时调用
|
||||
// -----------------------------------------------------------
|
||||
func (e *EffectStat) OnSkill() bool {
|
||||
func (e *EffectStat) Skill_Use() bool {
|
||||
|
||||
// 参数解构 (防止 SideEffectArgs 长度不足)
|
||||
var (
|
||||
|
||||
@@ -11,7 +11,7 @@ type Effect520 struct {
|
||||
node.EffectNode
|
||||
}
|
||||
|
||||
func (e *Effect520) OnSkill() bool {
|
||||
func (e *Effect520) Skill_Use() bool {
|
||||
chance := e.Args()[0].IntPart()
|
||||
success, _, _ := e.Input.Player.Roll(int(chance), 100)
|
||||
if success {
|
||||
|
||||
@@ -23,7 +23,7 @@ func init() {
|
||||
|
||||
// 命中之后
|
||||
// 特攻+2速度+1命中+1,
|
||||
func (e *Effect79) OnSkill() bool {
|
||||
func (e *Effect79) Skill_Use() bool {
|
||||
|
||||
e.Ctx().Our.SetProp(e.Ctx().Our, 2, 2)
|
||||
e.Ctx().Our.SetProp(e.Ctx().Our, 4, 1)
|
||||
|
||||
@@ -21,7 +21,7 @@ func init() {
|
||||
|
||||
}
|
||||
|
||||
func (e *Effect80) OnSkill() bool {
|
||||
func (e *Effect80) Skill_Use() bool {
|
||||
|
||||
att := e.Ctx().Our.CurrentPet.GetMaxHP().Div(alpacadecimal.NewFromInt(2))
|
||||
e.Ctx().Our.Damage(e.Ctx().Our, &info.DamageZone{
|
||||
|
||||
@@ -19,7 +19,7 @@ type Effect81 struct {
|
||||
can bool
|
||||
}
|
||||
|
||||
func (e *Effect81) OnSkill() bool {
|
||||
func (e *Effect81) Skill_Use() bool {
|
||||
|
||||
e.can = true
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ type Effect83 struct {
|
||||
can bool
|
||||
}
|
||||
|
||||
func (e *Effect83) OnSkill() bool {
|
||||
func (e *Effect83) Skill_Use() bool {
|
||||
|
||||
e.can = true
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ type Effect87 struct {
|
||||
node.EffectNode
|
||||
}
|
||||
|
||||
func (e *Effect87) OnSkill() bool {
|
||||
func (e *Effect87) Skill_Use() bool {
|
||||
|
||||
e.Ctx().Our.HealPP(-1)
|
||||
return true
|
||||
|
||||
@@ -52,7 +52,7 @@ func registerStatusEffects() {
|
||||
// -----------------------------------------------------------
|
||||
// 技能触发时调用
|
||||
// -----------------------------------------------------------
|
||||
func (e *Effect10) OnSkill() bool {
|
||||
func (e *Effect10) Skill_Use() bool {
|
||||
|
||||
// n% 触发概率(默认 SideEffectArgs[0])
|
||||
chance := e.EffectNode.SideEffectArgs[0]
|
||||
|
||||
@@ -259,6 +259,19 @@ func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction)
|
||||
if defender.CurrentPet.Info.Hp <= 0 && attacker.CurrentPet.Info.Hp <= 0 { //先手方死亡,触发反同归于尽
|
||||
attacker.CurrentPet.Info.Hp = 1
|
||||
}
|
||||
if defender.CurrentPet.Info.Hp <= 0 {
|
||||
|
||||
f.TURNOVER(defender)
|
||||
|
||||
break
|
||||
} else {
|
||||
//技能使用后
|
||||
defender.Exec(func(effect input.Effect) bool { //技能使用后的我方效果
|
||||
effect.Ctx().SkillEntity = currentSkill
|
||||
effect.Skill_Use_ex()
|
||||
return true
|
||||
})
|
||||
}
|
||||
if attacker.CurrentPet.Info.Hp <= 0 {
|
||||
f.TURNOVER(attacker)
|
||||
|
||||
@@ -273,19 +286,6 @@ func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction)
|
||||
|
||||
}
|
||||
|
||||
if defender.CurrentPet.Info.Hp <= 0 {
|
||||
|
||||
f.TURNOVER(defender)
|
||||
|
||||
break
|
||||
} else {
|
||||
//技能使用后
|
||||
defender.Exec(func(effect input.Effect) bool { //技能使用后的我方效果
|
||||
effect.Ctx().SkillEntity = currentSkill
|
||||
effect.Skill_Use_ex()
|
||||
return true
|
||||
})
|
||||
}
|
||||
//技能使用后
|
||||
attacker.Exec(func(effect input.Effect) bool { //技能使用后的我方效果
|
||||
effect.Ctx().SkillEntity = currentSkill
|
||||
|
||||
Reference in New Issue
Block a user