Commit Graph

874 Commits

Author SHA1 Message Date
Thinkofdeath 7fd79ff28d Move part of the Watchdog patch back into the correct patch
I have no idea how I managed to mess this up
2014-03-24 17:51:06 +00:00
Thinkofdeath f5643a1d34 Fix missed diff in TileEntityHopper 2014-03-24 12:01:26 +00:00
md_5 3c4481aa87 Fix conflicts 2014-03-24 17:12:40 +11:00
Thinkofdeath 6d22914df8 Re-add missed method to the Player Collision API 2014-03-23 18:16:32 +00:00
Thinkofdeath 58a6cb892b Cap villagers' window name to prevent client disconnects 2014-03-23 10:54:53 +00:00
Thinkofdeath 9b863cd5f2 Fix the removal of potion effects 2014-03-23 09:49:23 +00:00
md_5 c70bb68362 Fix some merge conflicts 2014-03-23 15:21:51 +11:00
Thinkofdeath 12aa3ca6ef Check for manually prefixed commands or commands that don't need a prefix for calling vanilla commands with command blocks 2014-03-23 01:29:13 +00:00
md_5 09d6e4d9e1 this.t() -> this.u() - make the server actually tick! 2014-03-23 11:34:50 +11:00
md_5 c9605032d0 Don't print permgen warning for java 8+ 2014-03-23 11:20:02 +11:00
Thinkofdeath 69324bba91 Update to 1.7.5 2014-03-23 00:06:43 +00:00
Thinkofdeath 0d601be5dd Re-add missing Player part of the particle API 2014-03-20 22:29:54 +00:00
Thinkofdeath 670d08ceb0 Remove the lastChunkAccessed if it is unloaded.
This fixes an issue where a chunk would be unloaded but remain in lastChunkAccessed meaning calls on getChunkAt could return a chunk that is no longer loaded, this caused an issue where the chunk could be reloaded whilst in use reverting any block changes. This caused findEndPortal to return null even after createEndPortal which would crash the server trying to teleport to a null location.
2014-03-18 09:52:01 +00:00
drXor d69ddc3163 Allow enchanting tables to enchant any item when plugins prompt them to. 2014-03-16 16:54:38 +11:00
drXor ddf5477f57 Change various "Nope!" kick messages to something more descriptive and less confusing for players. 2014-03-15 16:44:38 +11:00
md_5 f117731919 Optimize Player Lookup - #112
Optimize player lookup and various player operations. We mainly do this by keeping a map instead of iterating through all players. We also speed up the duplicate login check and a few other checks by simply checking for one matching player.

Thanks @aikar for some of the implementation
2014-03-15 14:34:26 +11:00
drXor 01e6512f06 Allow the potion effect caused by WitherSkulls to be cancelled along with damage cancellation (e.g. via events). 2014-03-15 14:14:01 +11:00
md_5 342630e7b4 Alter BungeeCord support to require BungeeCord when it is enabled. 2014-03-15 08:46:24 +11:00
Thinkofdeath 4adef05290 Re-add the Fix ConcurrentModificationException while being idle kicked in a vehicle patch 2014-03-12 21:26:40 +00:00
md_5 254df64f1b Rebuild patch hashes, fix build. 2014-03-10 09:14:45 +11:00
md_5 71fce21cdd Strengthen entity list guard patch back up to its original level. Whilst upstream fixes attempt to fix this, they aren't fully functional and can cause the server to crash. This way we can both identify bad plugins and stop all crashes. 2014-03-10 09:04:25 +11:00
md_5 6ed812be08 Pop guard entity list patch to top 2014-03-10 08:37:28 +11:00
md_5 3740e09267 Add more spigot links 2014-03-09 14:33:30 +11:00
Thinkofdeath 22e3ef2350 Prevent hoppers from loading chunks 2014-03-07 19:56:42 +00:00
FrozenBrain 4bd27f7d0f Use one PermissibleBase for all Command Blocks.
This fixes issues with too many command blocks lagging or crashing the server, as well as just increases their performance in general.
2014-03-03 18:00:42 +11:00
Thinkofdeath 3b52578a51 Normalize spaces on when reading a chat packet 2014-02-26 14:47:01 +00:00
md_5 eb9e4c0460 Update "Don't special case x move value" patch to ensure that move events are always fired, regardless if there are any "special cases" 2014-02-24 18:04:12 +11:00
drXor 505ac3fb4e Silent Lightning API 2014-02-23 20:37:28 +00:00
Zach Brown 4517f82aa8 Update SHA1 Info 2014-02-17 20:56:13 -06:00
Zach Brown eed20ead01 Fix ClearTickList to return correct value
Previously it always returned false, this fixes it to return whatever value the user has it set to.
2014-02-17 20:55:42 -06:00
Dmck2b 88d8ca53cc Return entity-tracking field other to intended usage. 2014-02-17 12:19:44 +00:00
hcherndon ede7aeb8b4 Unfinalize the isDisconnected() method by bukkit. 2014-02-15 09:23:33 +00:00
md_5 a08d1e540d Set lastTick to prevent first few ticks from being too quick 2014-02-13 17:34:01 +11:00
md_5 d44874ea0b Make the TPS command accurate by averaging over the sample interval, not just the current tick. 2014-02-13 17:27:41 +11:00
Thinkofdeath 73fe3123f6 Re-add the replace-commands feature 2014-02-12 20:45:59 +00:00
Thinkofdeath 5284bd1a74 Upstream merge 2014-02-12 14:06:33 +00:00
md_5 5aad14d2b6 Cap Channel Registrations to 128 entries 2014-02-12 20:03:12 +11:00
md_5 7c5df6b5bb Allow Disabling Creative Item Filter 2014-02-12 18:18:07 +11:00
Tux 95653d8b2d Add support for fetching hidden players via Spigot object 2014-02-09 14:05:23 -05:00
Aikar ee9d8c7590 Fire BlockPlaceEvent for Half Slab Completion
Fixes BUKKIT-5390
2014-02-09 19:02:00 +11:00
md_5 d504751f12 Add option to silence commandblock output to console: commands.silent-commandblock-console 2014-02-09 14:39:15 +11:00
Thinkofdeath 3c5f2712e6 Readd Spam Filter Exclusions patch 2014-02-08 08:15:21 +00:00
Thinkofdeath 18c8e057b2 Fix dispensing bone meal not having the correct data value 2014-02-06 22:01:07 +00:00
Thinkofdeath 7c1dbb44a5 Hopefully fix the AntiXray this time. Thanks to @geNAZt for helping 2014-02-05 21:40:15 +00:00
Thinkofdeath 9746d9bfc6 Revert "Fix the isLoaded check for AntiXray" Seems to causes issues still
This reverts commit fc52435f5b.
2014-02-05 19:55:31 +00:00
Thinkofdeath fc52435f5b Fix the isLoaded check for AntiXray 2014-02-05 11:37:16 +00:00
md_5 170aa26ca3 You're never gonna win, are you. People want bugs as a result of increased performance fixed, but then they want more performance as a result of bugs fixed. This reverts orebfuscator back to being threaded, and thus more performant, but unsafe. 2014-02-04 17:24:18 +11:00
md_5 4e47d75136 Allow air as an orebfuscator block 2014-02-03 17:55:58 +11:00
Dmck2b 0dbe0ab691 Fix nerf-spawner-mobs 2014-02-02 17:03:20 +00:00
md_5 bff5ac5d37 Async chunk compression needs a little bit more work still, disable for now 2014-02-02 12:26:23 +11:00
md_5 77fbb062d9 Refactor chunk compression to use its own thread pool in order to eliminate disconnect race conditions caused by Mojang's nasty disconnect routines. 2014-02-02 09:41:27 +11:00
md_5 fd83772302 Cap Entity Collisions
Limit a single entity to colliding a max of configurable times per tick.
This will alleviate issues where living entities are hoarded in 1x1 pens.
2014-02-01 18:14:48 +11:00
Aikar be31d62f43 Cap Entity Collisions
Limit a single entity to colliding a max of configurable times per tick.
This will alleviate issues where living entities are hoarded in 1x1 pens.
2014-02-01 18:13:02 +11:00
Smove b4530237fb Implement Locale Getter for Players 2014-02-01 18:12:22 +11:00
md_5 61a227c8c3 Add warning when null chunk buffers are encountered - most likely due to the orebfuscator plugin. 2014-02-01 18:07:22 +11:00
md_5 161e853450 In short, there isn't actually anything wrong with the async chunk compressor, it just accidentally caused console logging of errors which were previously ignored.
This commit restores that behaviour

You may be asking yourself why we are completely ignoring any errors which come this far down the pipeline.
The answer is quite simple:
Mojang did it
The default Mojang pipeline doesn't have any ChannelOutboundHandlerAdapter or similar instances, and thus nothing to handle exceptionCaught
So when a channel.write() or channel.flush() fails, the error message is actually just passed straight to the future provided.
It is then subsequently discarded, the channel closed, and no one except the user was any the wiser it actually happened!
Unfortunately for us, the default exceptionCaught in this class sends a blaring warning to the server admins indicating that it couldn't send a packet to a disconnected user!
We don't care about these warnings, if we did something wrong to disconnect the user, it is already logged in the proper location, as are broken sockets
tl;dr no need to blare warnings on each write to a broken socket
2014-02-01 17:53:32 +11:00
md_5 12358efad3 Use correct bitmask variable for orebfuscator 2014-02-01 10:44:25 +11:00
Thinkofdeath 31f53fbbbe Upstream merge 2014-01-31 20:42:29 +00:00
md_5 8decebe96e Don't allow respawning offline players 2014-01-31 18:15:33 +11:00
md_5 4864fd1c26 Sacrifice oreobfuscator performance for safety and reliability. 2014-01-31 16:07:28 +11:00
Thinkofdeath 42a026634b Correctly set arrows' current block 2014-01-30 20:42:01 +00:00
md_5 564ebde3ad Move exception logging to method body so we don't end up logging all outbound exceptions, which other plugins (cough ProtocolLib) may or may not be causing.
Also rumours this patch causes the server to break with ProtocolLib installed.
@aadnk
2014-01-30 16:02:25 +11:00
md_5 7bd5666ee2 Show full stack trace for errors during chunk caching/compression 2014-01-30 06:58:37 +11:00
md_5 a780739071 Use a crc32 of all the blocks in the chunk as our hash key. This is much more unique. 2014-01-29 12:51:20 +11:00
md-5 1bf13129a5 Merge pull request #108 from Dmck2b/PermGenLink
Add more information about changing PermGen size
2014-01-28 16:04:00 -08:00
md_5 911b500845 Fix unit tests 2014-01-29 09:08:29 +11:00
md_5 feacfb991d [Experimental] - Enable compressed bulk chunk cache.
Sort chunks a final time before sending. This gives the advantage that chunks will load as close to the player as they possibly can, and then move out, as well as increase the cache hit rate when using smaller bulk chunk limits such as the default of 5.
2014-01-29 09:04:51 +11:00
md_5 23615e1c9f Use simpler iterator 2014-01-29 08:47:29 +11:00
md_5 202b1fd11d Implement a compressed chunk cache. This still needs a lot of work to figure out a good mechanism for looking up previous chunks, however at the moment when coupled with a high bulk chunk limit, it can be effective for solving lag issues. 2014-01-29 08:47:29 +11:00
md_5 cd7bb0da14 Only 1 class is compressible, don't bother interfacing. 2014-01-29 08:38:37 +11:00
md_5 638b1724d0 Only create a single executor / compressor instance. 2014-01-29 08:38:37 +11:00
md_5 e8933c1890 Allow Configuring Chunks per Packet. This enables server owners to cram more chunks per packet, potentially leading to higher compression ratios, thus saving bandwidth and load time.
This is currently set at the Vanilla default value of 5, however initial testing seems to suggest there could be good performance / usability / bandwidth gains by setting it to its maximum value of 32768. Testers are welcome to experiment with this option, beware the placebo though!
2014-01-29 08:38:37 +11:00
md_5 82cf01b53f Implement Threaded Bulk Chunk Compression.
This offloads chunk compression to a new thread, which should help with the pauses often seen when teleporting large amounts of players.
2014-01-29 08:38:37 +11:00
Dmck2b 73d3519fca Add more information about changing PermGen size 2014-01-28 17:51:26 +00:00
md_5 6bf69c66f3 Merge tick shuffling branch into master. 2014-01-27 08:40:12 +11:00
md_5 d3f7cce233 Revert Spigot branding. 2014-01-26 21:54:02 +11:00
md_5 6eefe4e38e Allow configuring of player sample size, and default the sample to 12, the same as Vanilla. This has some performance overhead, as we have to shuffle the list each time, but this is better than the server displaying as offline! 2014-01-26 21:50:53 +11:00
md_5 ab3c5a42f7 Revert "Experimentally brand as "Spigot". This will be reverted if *any* plugin compatibility issues arise."
This reverts commit 71255cf140.
2014-01-26 21:33:46 +11:00
md_5 8e785b132f Always use real player count for displayed online players. 2014-01-26 12:48:32 +11:00
md_5 aec53a59da Initialise ping array on startup. The code to decide when to regenerate the array is a bit iffy (Mojang!), as it relies on System.nanoTime() which is not an absolute time source. 2014-01-26 12:30:38 +11:00
md_5 fa94a8a99a Adjust TPS command to start at 20tps, show * for catchup TPS, and round to 2 decimal places. 2014-01-26 12:17:55 +11:00
md_5 8832052c84 Fix Ping Player Sample to bring it back in line with Vanilla behaviour. The behaviour which Bukkit introduced recently is broken on larger servers as it introduces too many players to the list. 2014-01-26 12:14:05 +11:00
md_5 14c0d5cba9 We want to use Math.min, not max to cap displayed TPS to 20 2014-01-26 11:04:55 +11:00
md_5 71255cf140 Experimentally brand as "Spigot". This will be reverted if *any* plugin compatibility issues arise. 2014-01-26 09:17:40 +11:00
md_5 3d6f241c12 Fix double comparison issues. 2014-01-25 16:18:32 +11:00
md_5 53f2f7499c Don't allow plugins to create scoreboards async - this can crash the server. 2014-01-25 15:23:21 +11:00
brutuscat2 2f9b4a8573 TPS isn't capitalized
It makes me want to hurt someone when its written like "Tps"
2014-01-24 22:36:32 -05:00
md_5 a50a1d4c83 Implement a new TPS command which will show the average TPS over the last 1,5 and 15 minutes, using the same algorithm as the linux kernel (exponentiallialy damped moving average). 2014-01-25 14:09:21 +11:00
md_5 49f9f20d1c Add Spigot links. 2014-01-23 13:17:47 +11:00
md_5 526b404545 Move watchdog and timings code to tick method, not tick loop itself. 2014-01-22 19:23:59 +11:00
md_5 29c6c774dd Pop tick loop patch to top 2014-01-22 19:19:39 +11:00
md_5 2367cf0a3d Reapply tick loop patch. 2014-01-22 19:16:21 +11:00
Dmck2b 279df65068 Fix missing colons 2014-01-21 21:34:03 +00:00
md_5 80c8e1ac31 Don't disconnect player when we have no vanilla tab completions. 2014-01-21 15:32:54 +11:00
Thinkofdeath d8ad596ece Don't let trees replace any block when growing 2014-01-20 20:44:11 +00:00
Dmck2b 77d030879a Allow disabling of ZombiePigmen spawning in portals 2014-01-20 20:20:14 +00:00
md_5 8f2da2ca93 Check j, not i 2014-01-20 15:42:52 +11:00
md_5 74f78b8b88 Reduce memory of hiddenPlayers map. 2014-01-20 13:50:37 +11:00
md_5 a0deef28ee Remove NextTickList processing whilst we look into an issue.
http://www.spigotmc.org/threads/lwc-locks-randomly-going-missing-after-using-1249.10505/

Catch stalling on corrupted map data / NBT arrays.
2014-01-20 13:44:41 +11:00
mikeprimm 12b6f06e81 Merge pull request #95 from SpigotMC/optimize-nextticklist
Port Optimize NextTickList processing patch for 1.7.x
2014-01-18 18:18:31 -08:00
Mike Primm f0c97f24b8 Port Optimize NextTickList processing patch for 1.7.x 2014-01-18 13:57:03 -06:00
Thinkofdeath 027e514ebf Update chat link fix to use Bukkit's current system instead of the old one 2014-01-18 19:36:47 +00:00
Thinkofdeath c746557f95 Support vanilla's direction tag on fireballs 2014-01-18 14:30:50 +00:00
Thinkofdeath 0fbde2862d Add /tellraw to the vanilla commands defaults 2014-01-18 13:21:13 +00:00
md_5 49ae0093db Add getRawAddress back 2014-01-17 09:46:59 +11:00
Thinkofdeath 90779a43f9 Block data values that crash the client 2014-01-15 22:13:08 +00:00
md_5 65a4f51285 Upstream merge 2014-01-15 20:28:26 +11:00
Thinkofdeath fc5cf5a518 Move replace-commands to commands.replace-commands 2014-01-15 09:20:19 +00:00
Thinkofdeath 21656db5d1 Fix ConcurrentModificationException while being idle kicked in a vehicle 2014-01-14 20:14:36 +00:00
md_5 af480b8b95 Revert previous change to clear chunk list on the end of each tick, make it configurable instead.
Whilst the new behaviour was technically correct as it prevented the possibility of the chunk tick list actually increasing over time, it introduced a few issues, namely the fact that it slowed growth to unreasonable levels, and interfered with the values which server admins have finally tuned, and come to enjoy over the last few years.
If it is absolutely essential that growth be halted and ticking reduced as much as possible, the config option is there for power users.
If we wish to 'fix' this by default in the future, a new chunk ticking algorithm, which actually has meaningful config options should be designed.
2014-01-14 19:16:43 +11:00
md_5 0add6ac4af Tweak tab complete disabled to only disable completion of the /command section, and not any subsequent arguments to the command, such as player names or plugin provided completions. 2014-01-13 08:57:22 +11:00
md_5 83c105ef02 Remove accidentally added code 2014-01-13 08:28:17 +11:00
md_5 58dc769bb5 Replace AutoSave Mechanism
The problem here is that MinecraftServer.save(..), will attempt to sleep whilst all pending chunks are written to disk, however due to various and complicated bugs, it will wait for an incorrect amount of chunks, which may cause it to sleep for an overly long amount of time. Instead we will mimic the save-all command in its behaviour, which is both safe and performant.
2014-01-12 21:07:27 +11:00
md_5 8bfd4a8ccb Add more code to try and Debug [Mojang] Crash Reports Crashing 2014-01-12 20:56:59 +11:00
md_5 acd5d21a06 Take 2 at fixing unbreakable code 2014-01-10 15:39:36 +11:00
md_5 1220314f79 Fix ItemStack Unbreakable Code.
This code needs brackets to be compiled correctly.
2014-01-10 15:17:23 +11:00
Thinkofdeath afe4189e46 Fix anvil collisions
This fixes the server incorrectly moving the player out of an anvil when touching it on the side. The server used the rotation of the last placed anvil instead the of the rotation of the anvil the player was touching.
2014-01-09 14:28:04 +00:00
Thinkofdeath 4ed5d54dde Allow statistics to be disabled/forced 2014-01-08 22:43:39 +00:00
md_5 1e8cb6d468 Update Client's Hand when BlockPlaceEvent Cancelled
Send a Packet103SetSlot to client when a BlockPlaceEvent is cancelled.

Fixes BUKKIT-5284

Currently, whenever a player places a block in a protected area the
equipped itemstack size on client is never updated properly since the
client thinks the block was placed. The reason this happens is because
ItemStack.matches returns true since the server does not decrement stack
size if a BlockPlaceEvent is cancelled. This causes
PlayerConnection.a(handlePlace) not to send the appropriate packet to
client which causes the bug.
2014-01-08 14:45:45 +11:00
md_5 92db88d292 Update Chest Animation when Cancelling Event
Update chest animation after cancelling InventoryOpenEvent. Fixes BUKKIT-1440

Currently if a plugin cancels an InventoryOpenEvent for vanilla chests,
the chest animation for clients is stuck in the open state since
IInventory's closeChest method is never called. To fix the issue, closeChest
is called before exiting the display GUI method.
More info can be found here
https://bukkit.atlassian.net/browse/BUKKIT-1440
2014-01-08 14:44:50 +11:00
md_5 7e43d71c76 Clear chunkTickList at the end of every tick. 2014-01-08 14:38:38 +11:00
md_5 6c0c101bff Fix orebfuscator startup message showing hide blocks instead of replace blocks 2014-01-06 11:38:59 +11:00
md_5 cd0c975a6d Fix Biome Decoration Crashes
We don't really know what affect this will have on the terrain generation, but its better than crashing and not having terrain generate at all!
2014-01-05 09:35:15 +11:00
Thinkofdeath 885ae9871e Disconnect for spam in the main thread 2014-01-03 17:33:41 +00:00
Thinkofdeath 9f71f7e3db Handle different sizes (G,K) for the PermGen warning 2013-12-28 23:54:44 +00:00
md_5 12a1363cea Revert "Use Entity.teleportTo in CraftEntity.teleport"
This reverts commit adaf7c3ae8.
2013-12-24 14:52:45 +11:00
slide23 4fd3ddc33e Add Late Bind Option
Add late-bind config option to delay binding until loading is done.
2013-12-24 10:22:53 +11:00
Andrew Krieger adaf7c3ae8 Use Entity.teleportTo in CraftEntity.teleport
Entity.teleportTo is largely stable and correct. CraftEntity.teleport,
however, still cannot properly handle cross-world teleportation. Fix it
to defer to the better code in core Minecraft.
2013-12-24 10:18:01 +11:00
md_5 d072f55caa Revert the revert for now. 2013-12-23 21:03:39 +11:00
md_5 624acbd0c8 Increase verbosity of watchdog dumps 2013-12-23 21:01:45 +11:00
md_5 cad440b56a Revert check pending blocks patch as it (may) be causing some crash issues 2013-12-23 20:19:37 +11:00
md_5 f7086eb96d Disable connected check on setScoreboard. Mojang's semi async Netty implementation can lead to race conditions, and this exception being thrown when it really shouldn't. 2013-12-23 15:58:41 +11:00
md_5 45bbe59c15 Fix missing bitshifts 2013-12-23 15:43:33 +11:00
md_5 16467dc148 Warn if PermGen may be insufficient. Since 1.7 Mojang added a lot of new classes to their jar. This, coupled with plugins, may cause the loaded classes to exceed the default perm gem of 64mb. As such we will print a small warning advising users to set a higher PermGen if they haven't already. 2013-12-23 14:08:28 +11:00
Dan Mulloy 9272a671f7 Fix Biome Decoration Crashes 2013-12-23 11:18:44 +11:00
md_5 b32968b9a0 Add option to nerfs mobs from spawners. When this option is enabled, mobs which originate from a mob spawner will not have any AI, ie: brains. They will generally only be affected by water movement, with the exception of blazes which will still emit fireballs and float up and down.
This is disabled by default as it has a strong behavioural impact.
2013-12-22 21:02:55 +11:00
md_5 7b87ab6548 Add the getCubes patch back. Turns out the user with lockups had 23k+ entities in a single chunk. 2013-12-22 10:41:48 +11:00
md_5 6a98142bd5 Fix patch tree. 2013-12-22 10:06:06 +11:00
md_5 31c9311b07 Redo previous getCubes removal. 2013-12-22 10:05:27 +11:00
md_5 7890d0a442 Fix patches some more. 2013-12-22 10:04:44 +11:00
md_5 b47555dc7a Revert "Remove getCubes patch as under some circumstances it can loop around itself forever. For anyone wishing to reimplement this patch, the rationale behind it is quite simple, get all cubes within each chunk at the same time."
This reverts commit 06233ce472.
2013-12-22 10:03:57 +11:00
DerFlash 78bc1384a7 Save ticks lived to nbttag 2013-12-22 10:00:13 +11:00
md_5 06233ce472 Remove getCubes patch as under some circumstances it can loop around itself forever. For anyone wishing to reimplement this patch, the rationale behind it is quite simple, get all cubes within each chunk at the same time. 2013-12-22 09:59:17 +11:00
md_5 2549f4c043 Force Load Chunks for Biome Decoration. May solve some random.nextInt() crashes people have been seeing. 2013-12-21 20:08:42 +11:00
md_5 b42275d94c Fix accidentally reverted mc-dev imports. 2013-12-21 19:14:34 +11:00
md_5 1c099a713b Upstream merge, nothing major. 2013-12-21 19:13:39 +11:00
Thinkofdeath ed2fd14801 Re-add the particle API 2013-12-20 21:37:22 +00:00
md_5 a1c8965df5 Stage BiomeDecorator so we can get line numbers to match for stack traces. 2013-12-19 17:45:12 +11:00
Thinkofdeath ee8495a246 Allow the console to use vanilla commands 2013-12-18 11:40:35 +00:00
md_5 8278880f0f Fall back to our own URL clicking method as it works with more cases. 2013-12-18 20:41:42 +11:00