Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
ziqian zhang
Grasscutter
Commits
cf2832ae
Commit
cf2832ae
authored
Aug 04, 2022
by
KingRainbow44
Browse files
Add `EntityDamageEvent` and implementations
parent
d05b3207
Changes
2
Show whitespace changes
Inline
Side-by-side
src/main/java/emu/grasscutter/game/entity/GameEntity.java
View file @
cf2832ae
...
...
@@ -15,6 +15,7 @@ import emu.grasscutter.net.proto.MotionInfoOuterClass.MotionInfo;
import
emu.grasscutter.net.proto.MotionStateOuterClass.MotionState
;
import
emu.grasscutter.net.proto.SceneEntityInfoOuterClass.SceneEntityInfo
;
import
emu.grasscutter.net.proto.VectorOuterClass.Vector
;
import
emu.grasscutter.server.event.entity.EntityDamageEvent
;
import
emu.grasscutter.server.event.entity.EntityDeathEvent
;
import
emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify
;
import
emu.grasscutter.utils.Position
;
...
...
@@ -50,7 +51,7 @@ public abstract class GameEntity {
}
public
int
getEntityType
()
{
return
getId
()
>>
24
;
return
this
.
getId
()
>>
24
;
}
public
World
getWorld
()
{
...
...
@@ -66,7 +67,7 @@ public abstract class GameEntity {
}
public
LifeState
getLifeState
()
{
return
isAlive
()
?
LifeState
.
LIFE_ALIVE
:
LifeState
.
LIFE_DEAD
;
return
this
.
isAlive
()
?
LifeState
.
LIFE_ALIVE
:
LifeState
.
LIFE_DEAD
;
}
public
Map
<
String
,
Float
>
getMetaOverrideMap
()
{
...
...
@@ -122,15 +123,15 @@ public abstract class GameEntity {
}
public
void
addFightProperty
(
FightProperty
prop
,
float
value
)
{
this
.
getFightProperties
().
put
(
prop
.
getId
(),
getFightProperty
(
prop
)
+
value
);
this
.
getFightProperties
().
put
(
prop
.
getId
(),
this
.
getFightProperty
(
prop
)
+
value
);
}
public
float
getFightProperty
(
FightProperty
prop
)
{
return
getFightProperties
().
getOrDefault
(
prop
.
getId
(),
0
f
);
return
this
.
getFightProperties
().
getOrDefault
(
prop
.
getId
(),
0
f
);
}
public
void
addAllFightPropsToEntityInfo
(
SceneEntityInfo
.
Builder
entityInfo
)
{
for
(
Int2FloatMap
.
Entry
entry
:
getFightProperties
().
int2FloatEntrySet
())
{
for
(
Int2FloatMap
.
Entry
entry
:
this
.
getFightProperties
().
int2FloatEntrySet
())
{
if
(
entry
.
getIntKey
()
==
0
)
{
continue
;
}
...
...
@@ -165,8 +166,8 @@ public abstract class GameEntity {
protected
MotionInfo
getMotionInfo
()
{
MotionInfo
proto
=
MotionInfo
.
newBuilder
()
.
setPos
(
getPosition
().
toProto
())
.
setRot
(
getRotation
().
toProto
())
.
setPos
(
this
.
getPosition
().
toProto
())
.
setRot
(
this
.
getRotation
().
toProto
())
.
setSpeed
(
Vector
.
newBuilder
())
.
setState
(
this
.
getMotionState
())
.
build
();
...
...
@@ -187,8 +188,8 @@ public abstract class GameEntity {
return
0
f
;
}
float
curHp
=
getFightProperty
(
FightProperty
.
FIGHT_PROP_CUR_HP
);
float
maxHp
=
getFightProperty
(
FightProperty
.
FIGHT_PROP_MAX_HP
);
float
curHp
=
this
.
getFightProperty
(
FightProperty
.
FIGHT_PROP_CUR_HP
);
float
maxHp
=
this
.
getFightProperty
(
FightProperty
.
FIGHT_PROP_MAX_HP
);
if
(
curHp
>=
maxHp
)
{
return
0
f
;
...
...
@@ -197,37 +198,43 @@ public abstract class GameEntity {
float
healed
=
Math
.
min
(
maxHp
-
curHp
,
amount
);
this
.
addFightProperty
(
FightProperty
.
FIGHT_PROP_CUR_HP
,
healed
);
getScene
().
broadcastPacket
(
new
PacketEntityFightPropUpdateNotify
(
this
,
FightProperty
.
FIGHT_PROP_CUR_HP
));
this
.
getScene
().
broadcastPacket
(
new
PacketEntityFightPropUpdateNotify
(
this
,
FightProperty
.
FIGHT_PROP_CUR_HP
));
return
healed
;
}
public
void
damage
(
float
amount
)
{
damage
(
amount
,
0
);
this
.
damage
(
amount
,
0
);
}
public
void
damage
(
float
amount
,
int
killerId
)
{
//
Sanity check
if
(
getFightProperties
()
==
null
)
{
//
Check if the entity has properties.
if
(
this
.
getFightProperties
()
==
null
)
{
return
;
}
// Lose hp
addFightProperty
(
FightProperty
.
FIGHT_PROP_CUR_HP
,
-
amount
);
// Invoke entity damage event.
EntityDamageEvent
event
=
new
EntityDamageEvent
(
this
,
amount
,
this
.
getScene
().
getEntityById
(
killerId
));
event
.
call
();
if
(
event
.
isCanceled
())
{
return
;
// If the event is canceled, do not damage the entity.
}
// Add negative HP to the current HP property.
this
.
addFightProperty
(
FightProperty
.
FIGHT_PROP_CUR_HP
,
-(
event
.
getDamage
()));
// Check if dead
boolean
isDead
=
false
;
if
(
getFightProperty
(
FightProperty
.
FIGHT_PROP_CUR_HP
)
<=
0
f
)
{
setFightProperty
(
FightProperty
.
FIGHT_PROP_CUR_HP
,
0
f
);
if
(
this
.
getFightProperty
(
FightProperty
.
FIGHT_PROP_CUR_HP
)
<=
0
f
)
{
this
.
setFightProperty
(
FightProperty
.
FIGHT_PROP_CUR_HP
,
0
f
);
isDead
=
true
;
}
// Packets
this
.
getScene
().
broadcastPacket
(
new
PacketEntityFightPropUpdateNotify
(
this
,
FightProperty
.
FIGHT_PROP_CUR_HP
));
// Check if dead
// Check if dead
.
if
(
isDead
)
{
getScene
().
killEntity
(
this
,
killerId
);
this
.
getScene
().
killEntity
(
this
,
killerId
);
}
}
...
...
src/main/java/emu/grasscutter/server/event/entity/EntityDamageEvent.java
0 → 100644
View file @
cf2832ae
package
emu.grasscutter.server.event.entity
;
import
emu.grasscutter.game.entity.GameEntity
;
import
emu.grasscutter.server.event.Cancellable
;
import
emu.grasscutter.server.event.types.EntityEvent
;
import
javax.annotation.Nullable
;
public
final
class
EntityDamageEvent
extends
EntityEvent
implements
Cancellable
{
private
float
damage
;
@Nullable
private
final
GameEntity
damager
;
public
EntityDamageEvent
(
GameEntity
entity
,
float
damage
,
@Nullable
GameEntity
damager
)
{
super
(
entity
);
this
.
damage
=
damage
;
this
.
damager
=
damager
;
}
public
float
getDamage
()
{
return
this
.
damage
;
}
public
void
setDamage
(
float
damage
)
{
this
.
damage
=
damage
;
}
@Nullable
public
GameEntity
getDamager
()
{
return
this
.
damager
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment