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
2228332f
Commit
2228332f
authored
Apr 25, 2022
by
Melledy
Browse files
Call checkSpawns from World instead of from Player
parent
c3f9fd3c
Changes
4
Hide whitespace changes
Inline
Side-by-side
src/main/java/emu/grasscutter/game/GenshinPlayer.java
View file @
2228332f
...
...
@@ -695,10 +695,6 @@ public class GenshinPlayer {
it
.
remove
();
}
}
//
if
(
this
.
getScene
()
!=
null
&&
this
.
getSceneLoadState
()
==
SceneLoadState
.
LOADED
)
{
this
.
getScene
().
checkSpawns
(
this
);
}
// Ping
if
(
this
.
getWorld
()
!=
null
)
{
// RTT notify - very important to send this often
...
...
src/main/java/emu/grasscutter/game/GenshinScene.java
View file @
2228332f
...
...
@@ -315,32 +315,31 @@ public class GenshinScene {
target
.
onDeath
(
attackerId
);
}
// TODO Do not use yet
public
synchronized
void
onTick
()
{
for
(
GenshinPlayer
player
:
this
.
getPlayers
())
{
this
.
checkSpawns
(
player
);
}
public
void
onTick
()
{
this
.
checkSpawns
();
}
// TODO - Test
public
void
checkSpawns
(
GenshinPlayer
player
)
{
public
void
checkSpawns
()
{
SpatialIndex
<
SpawnGroupEntry
>
list
=
GenshinDepot
.
getSpawnListById
(
this
.
getId
());
Set
<
SpawnDataEntry
>
visible
=
new
HashSet
<>();
int
RANGE
=
100
;
Collection
<
SpawnGroupEntry
>
entries
=
list
.
query
(
new
double
[]
{
player
.
getPos
().
getX
()
-
RANGE
,
player
.
getPos
().
getZ
()
-
RANGE
},
new
double
[]
{
player
.
getPos
().
getX
()
+
RANGE
,
player
.
getPos
().
getZ
()
+
RANGE
}
);
for
(
SpawnGroupEntry
entry
:
entries
)
{
for
(
SpawnDataEntry
spawnData
:
entry
.
getSpawns
())
{
visible
.
add
(
spawnData
);
for
(
GenshinPlayer
player
:
this
.
getPlayers
())
{
int
RANGE
=
100
;
Collection
<
SpawnGroupEntry
>
entries
=
list
.
query
(
new
double
[]
{
player
.
getPos
().
getX
()
-
RANGE
,
player
.
getPos
().
getZ
()
-
RANGE
},
new
double
[]
{
player
.
getPos
().
getX
()
+
RANGE
,
player
.
getPos
().
getZ
()
+
RANGE
}
);
for
(
SpawnGroupEntry
entry
:
entries
)
{
for
(
SpawnDataEntry
spawnData
:
entry
.
getSpawns
())
{
visible
.
add
(
spawnData
);
}
}
}
// World level
WorldLevelData
worldLevelData
=
GenshinData
.
getWorldLevelDataMap
().
get
(
player
.
getWorldLevel
());
WorldLevelData
worldLevelData
=
GenshinData
.
getWorldLevelDataMap
().
get
(
getWorld
()
.
getWorldLevel
());
int
worldLevelOverride
=
0
;
if
(
worldLevelData
!=
null
)
{
...
...
src/main/java/emu/grasscutter/game/World.java
View file @
2228332f
...
...
@@ -37,6 +37,7 @@ import emu.grasscutter.server.packet.send.PacketWorldPlayerInfoNotify;
import
emu.grasscutter.server.packet.send.PacketWorldPlayerRTTNotify
;
import
emu.grasscutter.utils.Position
;
import
it.unimi.dsi.fastutil.ints.Int2ObjectMap
;
import
it.unimi.dsi.fastutil.ints.Int2ObjectMaps
;
import
it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap
;
public
class
World
implements
Iterable
<
GenshinPlayer
>
{
...
...
@@ -58,11 +59,13 @@ public class World implements Iterable<GenshinPlayer> {
public
World
(
GenshinPlayer
player
,
boolean
isMultiplayer
)
{
this
.
owner
=
player
;
this
.
players
=
Collections
.
synchronizedList
(
new
ArrayList
<>());
this
.
scenes
=
new
Int2ObjectOpenHashMap
<>();
this
.
scenes
=
Int2ObjectMaps
.
synchronize
(
new
Int2ObjectOpenHashMap
<>()
)
;
this
.
levelEntityId
=
getNextEntityId
(
EntityIdType
.
MPLEVEL
);
this
.
worldLevel
=
player
.
getWorldLevel
();
this
.
isMultiplayer
=
isMultiplayer
;
this
.
owner
.
getServer
().
registerWorld
(
this
);
}
public
GenshinPlayer
getHost
()
{
...
...
@@ -273,6 +276,12 @@ public class World implements Iterable<GenshinPlayer> {
}
}
public
void
onTick
()
{
for
(
GenshinScene
scene
:
this
.
getScenes
().
values
())
{
scene
.
onTick
();
}
}
public
void
close
()
{
}
...
...
src/main/java/emu/grasscutter/server/game/GameServer.java
View file @
2228332f
...
...
@@ -10,6 +10,7 @@ import emu.grasscutter.command.CommandMap;
import
emu.grasscutter.database.DatabaseHelper
;
import
emu.grasscutter.game.Account
;
import
emu.grasscutter.game.GenshinPlayer
;
import
emu.grasscutter.game.World
;
import
emu.grasscutter.game.dungeons.DungeonManager
;
import
emu.grasscutter.game.gacha.GachaManager
;
import
emu.grasscutter.game.managers.ChatManager
;
...
...
@@ -26,6 +27,7 @@ public final class GameServer extends MihoyoKcpServer {
private
final
GameServerPacketHandler
packetHandler
;
private
final
Map
<
Integer
,
GenshinPlayer
>
players
;
private
final
Set
<
World
>
worlds
;
private
final
ChatManager
chatManager
;
private
final
InventoryManager
inventoryManager
;
...
...
@@ -50,6 +52,7 @@ public final class GameServer extends MihoyoKcpServer {
this
.
address
=
address
;
this
.
packetHandler
=
new
GameServerPacketHandler
(
PacketHandler
.
class
);
this
.
players
=
new
ConcurrentHashMap
<>();
this
.
worlds
=
Collections
.
synchronizedSet
(
new
HashSet
<>());
this
.
chatManager
=
new
ChatManager
(
this
);
this
.
inventoryManager
=
new
InventoryManager
(
this
);
...
...
@@ -84,6 +87,10 @@ public final class GameServer extends MihoyoKcpServer {
return
players
;
}
public
Set
<
World
>
getWorlds
()
{
return
worlds
;
}
public
ChatManager
getChatManager
()
{
return
chatManager
;
}
...
...
@@ -161,12 +168,32 @@ public final class GameServer extends MihoyoKcpServer {
}
public
void
onTick
()
throws
Exception
{
Iterator
<
World
>
it
=
this
.
getWorlds
().
iterator
();
while
(
it
.
hasNext
())
{
World
world
=
it
.
next
();
if
(
world
.
getPlayerCount
()
==
0
)
{
it
.
remove
();
}
world
.
onTick
();
}
for
(
GenshinPlayer
player
:
this
.
getPlayers
().
values
())
{
player
.
onTick
();
}
OnGameServerTick
.
post
(
new
GameServerTickEvent
());
}
public
void
registerWorld
(
World
world
)
{
this
.
getWorlds
().
add
(
world
);
}
public
void
deregisterWorld
(
World
world
)
{
// TODO Auto-generated method stub
}
@Override
public
void
onStartFinish
()
{
...
...
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