Commit Graph

4178 Commits

Author SHA1 Message Date
Spottedleaf c4ff33a9e5
Make region files more reliable to write to
Previously we would write to header before writing our chunk data,
which opens a window for corruption (or we would overwrite entirely).
Now the saving process has been changed to follow this chain of events:

1. We always allocate a new space to write so we do not potentially
overwrite and corrupt the current data
2. Write the chunk data first (the order of the fields in
the chunk data isn't relevant though)
3. Flush to disk
4. Write to the region header last
5. Flush to disk
6. Then we free the previous space allocated

With this chain of events it is impossible for a chunk write to corrupt
a region file, unless the operating system has lied and we have NOT flushed
to disk.

However server administrators are still recommended to continue performing
regular backups.

Note that when Mojang finally decides to change their region format
to deal with oversized chunks this patch must be changed to deal with
whatever system they decide to impose.

We also make use of two flushes to disk per chunk save (to ensure
ordering and ensure data has gone to disk), so this will negatively
affect save performance.
2019-04-03 22:24:55 -04:00
Aikar 87a726351b
[Auto] Updated Upstream (Bukkit/CraftBukkit)
Upstream has released updates that appears to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

Bukkit Changes:
7634491f Added Entity#setRotation.

CraftBukkit Changes:
0e1cea5a Added Entity#setRotation.
2019-04-03 04:51:39 -04:00
Spottedleaf 2e43721654
Allow login events to fire only after the server has loaded
Plugins that rely on the async login event to fire can miss the event
if a player tries to log in before the server has loaded.

The solution is to simply block the event threads from executing until
the server has loaded. This will not have an adverse affect on logins
since the event threads are cached and are only used for executing events
asynchronously.
2019-04-03 02:27:09 -04:00
Aikar e9b353ff02
Updated Upstream (CraftBukkit/Spigot)
We pretty much reverted most of Spigots changes here as ours is better.

I guess least Spigot is trying to get closer to us? but missed..

CraftBukkit Changes:
0bf75bbd SPIGOT-4686: Enchantment ordering nondeterministic

Spigot Changes:
f09662d0 Rebuild patches
2019-04-02 23:27:31 -04:00
Aikar 96f8b1af6c
Improve upstream merge script to rebuild patches
this will help ensure that upstreams apply as cleanly as it does manually

the filtering makes the patches more fragile, but usually not an issue for small updates.

this will unfilter, apply the cleanest patches, then the next rebuild will
filter out unnecessary changes
2019-04-02 23:25:48 -04:00
Aikar 747e70a90d
Try to improve Timings stack management
I can't reproduce issues locally, but this should be even more 'stable'
2019-04-02 23:25:48 -04:00
Aikar a32840b449
Clean upstream before merging to ensure clean state 2019-04-02 21:46:32 -04:00
Aikar eb3be0ea5c
Re-add isTypeNotPersistent check
seems CB did something different with that field more than I understood.

So now it permanently doesn't match vanilla? :(
2019-03-29 08:50:52 -04:00
Shane Freeder 761d6ae72e Fix PersistentStructureLegacy NPE on custom worlds
This is caused due to the DimensionManager in CB worlds not being
registered by NMS, we fix this by copying CBs behavior of using the
world providers DimensionManager, vs using the actual dimension manager
of the world
2019-03-29 11:37:20 +00:00
Aikar f4f4396f0e
Restore vanilla behavior of mob counts for persistent mobs
Now decounts entities that got name tagged or persistent state changed.

Removes a bad CB check that ignored some persistent mobs persistence state.

Vanilla code explicitly only cares 'is this mob persistent?' and if
it is, it is not counted. CB should not of been checking its type state.

Fixes #1922
2019-03-29 03:38:23 -04:00
Aikar 27c32b9344
Fix map rendering issues - Fixes #1796 2019-03-29 03:38:23 -04:00
Aikar 52ebb355bc
Optimize Persistent Data Loading
removes Mineshaft loading legacy as we had pre 1.13.2 to avoid managing
that very large data file from legacy systems.

Previous to 1.13.2 these data files were never loaded to begin with, so they
effectively do not contain valid/relevant data.

These files take a long time to convert on large worlds and crashes the server.

Additionally, cache the result of a file being missing so we don't keep spam checking it.
2019-03-29 03:38:22 -04:00
Aikar b66154b26e
Fix a concurrency issue with legacy structure data loading
This code could get hit by many threads at once, causing multiple
chunk loads to convert legacy data, leading to all sorts of fun.

Additionally, go ahead and preload it async on world load.
2019-03-29 03:38:22 -04:00
Zach Brown e42b8d1c0c
Fix javadocs take 2: electric boogaloo 2019-03-29 00:44:41 -04:00
Aikar 4a0da388da
fix javadocs 2019-03-28 23:58:09 -04:00
Aikar a73444b0e1
Reuse buffers for chunk compression to optimize memory use
Instead of allocating a buffer for every chunk compression, reuse
the same 64k sized buffer.

Also stopped doing dynamic compression levels. It wasn't helping enough.

This will improve memory usage and zlib performance of chunk compression.
2019-03-28 23:46:45 -04:00
Aikar def0033929
Forgot to convert duration to millis per the API expectation for tick event 2019-03-28 01:27:39 -04:00
Aikar be067fea11
PlayerDeathEvent#getItemsToKeep
Exposes a mutable array on items a player should keep on death.

This allows a cleaner method to implement "Keep certain items on death"
than how plugins currently do it in that it never removes them in first
place, so its safe if the player logs out/server is shutdown before respawn.

Example Usage: https://gist.github.com/aikar/5bb202de6057a051a950ce1f29feb0b4
2019-03-28 01:12:38 -04:00
Aikar 8f25112b93
Server Tick Events
Fires event at start and end of a server tick
2019-03-27 22:49:29 -04:00
Aikar af52f138da
Remove light optimization
getting lots of bug reports on light. just going to drop this even though
I really don't see how it could be the source due to my understanding of
the games light engine...

Fixes #1920
2019-03-27 20:46:46 -04:00
Shane Freeder 8383c2b97c Updated Upstream (CraftBukkit/Spigot)
Upstream has released updates that appears to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

CraftBukkit Changes:
4c8327f7 SPIGOT-4673: EntitySpawnEvent should not be called for players

Spigot Changes:
5629554b Rebuild patches
2019-03-27 18:41:12 +00:00
Aikar 25e5bfe669
Revert "Optimize Bukkit <-> NMS Mapping tables and legacy conversion"
This reverts commit f5e7717214.

Has issues, will fix later
2019-03-26 02:04:09 -04:00
Aikar 4d3f9e2033
Fix issue in last build with null task timings 2019-03-26 01:31:59 -04:00
Aikar e055103d3d
Improve Timings stack protection more
Ensures in more places that exceptions will not corrupt the Timings stack.

Timings will now better report stack corruption and auto repair itself too.
2019-03-26 00:58:23 -04:00
Aikar f5e7717214
Optimize Bukkit <-> NMS Mapping tables and legacy conversion
Use O(1) patterns for mapping conversions to improve plugin performance.
Optimize collections used by legacy plugin conversion

This should improve plugin performance across the board
on Paper for both Modern and Legacy Plugins.

Also log how long building those tables takes...
2019-03-26 00:07:20 -04:00
Shane Freeder 364a53e37a Ensure that TimedEventExecutor timings are closed (Fixes #1918)
pre this, any event handler firing an exception would leave the timings
open, causing the timings stack to be corrupted
2019-03-26 00:56:16 +00:00
Aikar e8bbfbfddf
[CI-SKIP] [Auto] Rebuild Patches
A recent commit has been made that caused patches to be out of order, rebuilding
2019-03-24 23:51:44 -04:00
Shane Freeder 8e9ec4b058 Don't update entity trackers for worlds without players
PlayerList#moveToWorld already untracks the player from the player list,
meaning that we do not need to worry about this untracking players
who've left the world, The server also untracks a player during
disconnect, handing yet another case.

If we don't need to untrack players who've left the world, it should be
reasonably save to do this, as we're not going to be performing any
server->client updates here, which is what this code is intended to do,
and all players should be untracked.
2019-03-24 23:55:05 +00:00
Aikar d4f193e15f
Improve nullability changes from last commit about getWorld 2019-03-24 19:33:26 -04:00
Aikar 4ae1989c4f
Restore some SANITY around nullability annotations
Some of these were wrong (scoreboard manager), others are counter to
everything everyone expects (Locations world being null, which wasnt ever safe EVER)
others are just too noisy.

Replace some with Contract to get rid of the nullability constraint and go back to
the old days of IDE not considering it strictly one way or the other.

Also, stop requiring annotations on package-private.

Introduces the next Developer Perk for Paper-API: Your plugin isn't yellow anymore.

Also fixed random dupe code in ensureServerConversions that got mistakenly set in the update.
2019-03-24 19:13:07 -04:00
Aikar b1777724a5
Add the unnecessary annotation
cmon, that wasn't even API.

i've updated my IDE to now not skip tests :(
2019-03-24 18:32:08 -04:00
Aikar 95941afd59
missed a spot for pickupDelay fix 2019-03-24 18:15:39 -04:00
Aikar 76fab035d3
don't go below 0 for pickupDelay, breaks picking up items
vanilla checks for == 0

Fixes #1911
2019-03-24 18:12:56 -04:00
Aikar 424b05051b
update metadata refresh approach
same fix, less work needed to do it
2019-03-24 17:48:22 -04:00
Aikar 4c807f929e
Timings Improvements
use a better stack for managing timing tree relationships
remove unnecessary synchronization (i forgot HANDLERS is only touched on main)

this should hopefully resolve any data integrity concerns
2019-03-24 17:47:23 -04:00
Aikar 5fc918bbf1
include chunk gen mobs in natural counting, fix some spawn reasons 2019-03-24 14:11:06 -04:00
Joel Paulien 830137acbe Add PlayerPostRespawnEvent (#1622) 2019-03-24 13:50:42 -04:00
Mark Vainomaa 556259dd97 Add GS4 query event (#1906) 2019-03-24 13:01:31 -04:00
Johnny Cao 0f82626d76 Fixes issues with player interaction preventing metadata from being updated for other players (#1896) 2019-03-24 13:00:42 -04:00
Aikar 76d2a4cb8f
Add a config for mob spawn change, really shouldn't use it
turning this to true allows 1 player to deny other players the ability
to have mobs spawn. It really is a bad idea and reverts back to iffy
mob spawn limits where mob farms in the world stops natural spawns
from occuring.

Really recommend resorting to different solutions than ever using this config.
2019-03-24 12:59:28 -04:00
Aikar 458aa79f63
Updated Upstream (Bukkit/CraftBukkit)
Upstream has released updates that appears to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

Bukkit Changes:
451bd74e Use gson for decoding version command

CraftBukkit Changes:
51100db8 SPIGOT-4678: Fix placing signs in certain circumstances
2019-03-24 12:33:39 -04:00
Zach Brown c5ef31cb0d
Restore lost player cooldown APIs
Accidentally removed in 0976d52bbd
2019-03-24 13:16:59 -04:00
Aikar 5368451566
Only count Natural Spawned mobs towards natural spawn mob limit
This resolves the super common complaint about mobs not spawning.

This was ultimately a flaw in the vanilla count algorithim that allows
spawners and other misc mobs to count against the mob limit, which are
not bounded, and can prevent the entire world from spawning new.

I believe Bukkits changes around persistence may of actually made it
worse than vanilla.

This should fully solve all of the issues around it so that only natural
influences natural spawns.
2019-03-24 01:05:20 -04:00
Aikar e58c65bb37
Entity#getEntitySpawnReason
Allows you to return the SpawnReason for why an Entity Spawned

Pre existing entities will return NATURAL if it was a non
persistenting Living Entity, SPAWNER for spawners,
or DEFAULT since data was not stored.
2019-03-24 01:05:20 -04:00
Aikar 81ff6e67f5
Fix a case where mob spawning could load/gen chunks 2019-03-24 01:05:20 -04:00
Aikar b587621ad9
[Auto] Updated Upstream (CraftBukkit)
Upstream has released updates that appears to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

CraftBukkit Changes:
d65a2576 SPIGOT-4674: Allow spawning hanging on top/bottom of block
2019-03-22 05:36:44 -04:00
Aikar e50b4f608d
[Auto] Updated Upstream (Bukkit)
Upstream has released updates that appears to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

Bukkit Changes:
0eaf10f1 Add getObject methods to ConfigurationSection
2019-03-21 06:21:43 -04:00
kashike 2e4520d902 Use proper max length when serialising BungeeCord text component 2019-03-20 21:20:56 -07:00
Shane Freeder ea855e2b46 Updated Upstream (Bukkit/CraftBukkit/Spigot)
Upstream has released updates that appears to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

Developers!: You will need to clean up your work/Minecraft/1.13.2 folder
for this

Also, restore a patch that was dropped in the last upstream

Bukkit Changes:
279eeab3 Fix command description not being set
96e2bb18 Remove debug print from SyntheticEventTest

CraftBukkit Changes:
d3ed1516 Fix dangerously threaded beacons
217a293d Don't relocate joptsimple to allow --help to work.
1be05a21 Prepare for imminent Java 12 release
a49270b2 Mappings Update
5259d80c SPIGOT-4669: Fix PlayerTeleportEvent coordinates for relative teleports

Spigot Changes:
e6eb36f2 Rebuild patches
2019-03-20 01:55:16 +00:00
Shane Freeder 0976d52bbd Updated Upstream (Bukkit/CraftBukkit/Spigot)
Upstream has released updates that appears to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

Please note that this build includes changes to meet upstreams
requirements for nullability annotations. While we aim for a level of
accuracy, these might not be 100% correct, if there are any issues,
please speak to us on discord, or open an issue on the tracker to
discuss.

Bukkit Changes:
9a6a1de3 Remove nullability annotations from enum constructors
3f0591ea SPIGOT-2540: Add nullability annotations to entire Bukkit API

CraftBukkit Changes:
8d8475fc SPIGOT-4666: Force parameter in HumanEntity#sleep
8b1588e2 Fix ExplosionPrimeEvent#setFire not working with EnderCrystals
39a287b7 Don't ignore newlines in PlayerListHeader/Footer

Spigot Changes:
cf694d87 Add nullability annotations
2019-03-20 00:31:18 +00:00