Compare commits

...

4056 Commits

Author SHA1 Message Date
metalgearsloth
5e86a99060 Version: 0.8.63 2022-02-27 13:00:41 +11:00
Paul Ritter
ce9070b966 changes pvs chunkorder to use a tree-structure, should fix children being sent without parents (#2562)
Co-authored-by: Paul Ritter <ritter.paul1@gmail.com>
Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
2022-02-27 13:00:10 +11:00
Vera Aguilera Puerto
aa5bcefaf2 Add System.Threading.Monitor (lock keyword) to sandbox whitelist. 2022-02-26 16:50:41 +01:00
Acruid
08a52fb892 MapChunk Cleanup (#2555)
* All IPhysShapes now expose a property to get the local AABB.

* Removed IMapChunk. It's internal, we only have 1 implementation in the engine, no need for abstraction, and removing it helps perf.

* Cleaned up issues in MapChunk file.

* Encapsulate _tiles access inside MapChunk.

* Remove IEnumerable<TileRef> from MapChunk.

* Remove CollidesWithChunk

* Move CalcWorldAABB and RegenerateCollision from MapChunk to MapGrid.
Remove MapChunk.GridId.

* Removed MapChunk.GetAllTiles

* Removed the terrible mocked unit tests.

* Moved the GetTileRef functions from MapChunk to MapGrid.

* Add an event raised on MapChunk when a tile is modified.
Completely remove the IMapGrid dependency from MapChunk.

* Fix bug where you cannot change the tile damage of a tile.
2022-02-21 20:49:30 -08:00
Pieter-Jan Briers
fd3c54b373 Seal some classes. 2022-02-21 14:02:34 +01:00
Pieter-Jan Briers
adee05b009 Make client start with non-seekable streams.
Not marking #2439 as fixed yet due to lack of thorough testing.
2022-02-21 11:23:37 +01:00
Pieter-Jan Briers
a66d40eb19 CVar to force ResourceManager to provide seekability for streams.
To help with #2439
2022-02-21 11:23:37 +01:00
metalgearsloth
d065a96e01 Don't serialize grid fixtures (#2477) 2022-02-21 20:15:30 +11:00
Kara D
ef7709aa78 Version: 0.8.62 2022-02-20 19:34:25 -07:00
Paul Ritter
305b330075 bandaid 2022-02-21 02:30:03 +01:00
Acruid
bec4297ce1 Move Map Pause data from MapManager to MapComponent. (#2543)
* Encapsulated existing _pausedMaps access in MapManager.Pause.
Added more unit tests.

* Moved the MapPaused flag from MapManager.Pause to MapComponent.

* Moved the MapPreInit flag from MapManager.Pause to MapComponent.

* Changed visibility so content can't access the flags directly.

* It's not the code that is wrong, it's the tests that are wrong!

* Removed completely obsolete bookkeeping event.
2022-02-20 13:36:45 -08:00
metalgearsloth
18b21b3d60 Version: 0.8.61 2022-02-20 17:44:49 +11:00
mirrorcult
9b263417b9 Merge pull request #2541 from metalgearsloth/2022-02-14_1 2022-02-19 12:33:46 -07:00
Acruid
13da0a7925 Adds command buffer to client, and input command injection (#2538)
Adds the command buffer to the console.
adds wait <ticks> command to console.
Adds the `incmd` command to inject input commands directly into the simulation, bypassing the frontend.
Removes client side permission check for debug builds.
2022-02-18 19:27:38 -08:00
Kara D
bb28db2412 Version: 0.8.60 2022-02-18 15:50:15 -07:00
mirrorcult
489d150ae0 Merge pull request #2558 from PaulRitter/2022_02_18_real_pvs_hours 2022-02-18 15:49:20 -07:00
Paul Ritter
077dbaf933 yo this slaps 2022-02-18 20:49:03 +01:00
Paul Ritter
26f83ac7a2 bored trainride 2022-02-17 15:08:55 +01:00
metalgearsloth
822009b429 Version: 0.8.59 2022-02-17 18:05:50 +11:00
Leon Friedrich
e07a4e516c Add random vector functions to IRobustRandom (#2551) 2022-02-17 18:05:12 +11:00
metalgearsloth
9ec38b5538 Optimise PVS recursion (#2524) 2022-02-17 18:03:14 +11:00
metalgearsloth
97da770978 More physics ECS (#2529) 2022-02-17 17:52:27 +11:00
metalgearsloth
3acbc8235d Funny struct enumerator for xform kids Part 2 (#2492) 2022-02-17 17:19:08 +11:00
Sam Weaver
a32359d5d4 Only include shadow casting lights in the "max lights per scene" count (#2446)
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
2022-02-17 14:24:36 +11:00
Paul
78fd39aee2 could fix a racecondition? maybe? 2022-02-16 23:55:04 +01:00
Kara D
fca5c14c67 Version: 0.8.58 2022-02-16 15:53:10 -07:00
Kara D
f60e3a14ef Fix VS2022 17.1 issue 2022-02-16 15:49:19 -07:00
Leon Friedrich
503a7032f9 Hopefully fix appearance component mispredict reconciliation (#2460) 2022-02-16 23:26:13 +01:00
metalgearsloth
918bbd3f01 Version: 0.8.57 2022-02-17 01:06:34 +11:00
Leon Friedrich
a1441d5051 Properly support sprite layer transforms. (#2533) 2022-02-17 00:06:14 +11:00
Leon Friedrich
58d6189c40 Allow sprite layer data to be set using PrototypeLayerData. (#2442) 2022-02-16 19:37:40 +11:00
Leon Friedrich
58defed1d2 Fix InteractionOutline 2: Electric boogaloo (#2511)
Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
2022-02-16 18:32:40 +11:00
Paul
27a94384d0 v0.8.56 2022-02-15 18:16:07 +01:00
Paul Ritter
4b8f5815db pvs caching (#2547)
Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
2022-02-15 18:14:44 +01:00
metalgearsloth
d830eef435 Version: 0.8.55 2022-02-15 21:16:35 +11:00
metalgearsloth
e7c4bf7341 Don't use worldbounds for PVS (#2473) 2022-02-15 21:07:41 +11:00
ike709
162e646404 Fix a weird issue with config (#2546)
Co-authored-by: ike709 <ike709@github.com>
2022-02-15 20:57:32 +11:00
metalgearsloth
93049fcacf More transform optimisations (#2519) 2022-02-15 20:43:49 +11:00
metalgearsloth
5b90db4beb inline 2022-02-14 18:30:33 +11:00
metalgearsloth
7692ff736b Some more ECS stuff
- Proxy methods on EntityManager
- Transform system stuff
2022-02-14 18:24:52 +11:00
Kara D
f25ad8ece9 Version: 0.8.54 2022-02-13 20:25:00 -07:00
mirrorcult
1aaf3b9250 Merge pull request #2521 from ElectroJr/public-AppearanceSystem 2022-02-13 20:24:23 -07:00
mirrorcult
11f6cff6df Merge pull request #2539 from Acruid/vv_fix_entName 2022-02-13 20:01:53 -07:00
mirrorcult
c2ea57c95a Merge pull request #2503 from Ygg01/linguini-multiline-error-fix 2022-02-13 20:00:47 -07:00
Ygg01
f61ae5da6b Update Linguini and line info in errors 2022-02-14 01:50:11 +01:00
Acruid
8ae9a5f2da Fix a typo where setting the description of an entity in VV sets the name. 2022-02-13 16:35:51 -08:00
Ygg01
3f7e89e006 Merge remote-tracking branch 'origin/master' into linguini-multiline-error-fix 2022-02-13 23:35:28 +01:00
Ygg01
cee4e4d62e Enable Fluent logs for only .ftl files (#2532) 2022-02-12 21:59:08 +11:00
metalgearsloth
14a3783760 Version: 0.8.53 2022-02-12 15:56:21 +11:00
mirrorcult
b4607f7b1f Draw effects below FOV (#2534) 2022-02-12 15:54:50 +11:00
Acruid
5a28c16cae Map Pausing Fixes (#2520) 2022-02-12 15:54:03 +11:00
ElectroJr
9e8bf861ea Merge remote-tracking branch 'upstream/master' into public-AppearanceSystem 2022-02-11 20:43:19 +13:00
ElectroJr
b540f04a7a Version: 0.8.52 2022-02-10 21:46:08 +13:00
Leon Friedrich
bcaa7001ad Hopefully fix container occlusion bug? (#2464) 2022-02-10 09:29:26 +01:00
metalgearsloth
3f0fba7b4e Version: 0.8.51 2022-02-10 12:57:00 +11:00
metalgearsloth
d7d7a53045 Raise appearance event by ref 2022-02-10 12:56:14 +11:00
metalgearsloth
40daba9adf Version: 0.8.50 2022-02-10 12:53:26 +11:00
mirrorcult
5665f8eb1c Abstract VisualizerSystem (#2522) 2022-02-10 12:52:42 +11:00
metalgearsloth
8f0d562f3e Version: 0.8.49 2022-02-10 11:21:29 +11:00
ike709
f3950e940e Re-adds UpdateEntityTree() to EntityLookup's interface (#2525) 2022-02-10 11:15:09 +11:00
Leon Friedrich
3fdca65cc9 Make occluder use try get map (#2516) 2022-02-10 01:40:11 +11:00
ElectroJr
4cfb9210d0 Make AppearanceSystem public 2022-02-09 04:55:31 +13:00
ike709
23d0b8a555 Expose LastTick on IGameTiming (#2518) 2022-02-08 14:02:36 +11:00
mirrorcult
452b03d5a6 Merge pull request #2513 from metalgearsloth/2022-02-07_EnsureCompOut 2022-02-07 13:41:59 -07:00
metalgearsloth
c8f2dab381 Don't crash on VV edit for angles (#2517) 2022-02-08 02:58:55 +11:00
metalgearsloth
7409df07f8 Merge remote-tracking branch 'upstream/master' into 2022-02-07_EnsureCompOut 2022-02-07 19:55:45 +11:00
metalgearsloth
973406b91d Cleanup contact code a lot (#2480) 2022-02-07 13:10:58 +11:00
metalgearsloth
2e646fe2b6 EntityQueryEnumerator "fix" (#2501) 2022-02-07 12:06:50 +11:00
mirrorcult
6b902d22d4 Merge pull request #2504 from metalgearsloth/2022-02-03_appearance-events
Appearance data event
2022-02-06 11:23:01 -07:00
metalgearsloth
83e6d52e58 Version: 0.8.47 2022-02-07 02:56:24 +11:00
metalgearsloth
025fdcd0b3 GetHardAABB (#2514) 2022-02-07 02:10:02 +11:00
metalgearsloth
fe3ace92bd Another helper 2022-02-07 02:04:57 +11:00
metalgearsloth
317070f167 Some animation helpers for cargo telepad too 2022-02-07 02:00:31 +11:00
metalgearsloth
3524363ad4 fix build 2022-02-07 01:44:27 +11:00
metalgearsloth
90287dbb09 Merge remote-tracking branch 'upstream/master' into 2022-02-03_appearance-events
# Conflicts:
#	Robust.Shared/GameObjects/Components/Appearance/AppearanceComponent.cs
2022-02-07 01:42:53 +11:00
metalgearsloth
9a2f35f2d3 Also pass comp 2022-02-07 01:42:32 +11:00
metalgearsloth
3f10dbe770 EnsureComponent<T> with out variable
Useful for EnsureComponent<T>(uid, out var comp) && comp.Thing
2022-02-07 00:07:01 +11:00
metalgearsloth
8fcba93ada Don't draw 0-mass non-hard fixtures as invalid (#2499) 2022-02-06 19:42:47 +11:00
ElectroJr
35366b5bc1 Version: 0.8.46 2022-02-06 15:18:56 +13:00
mirrorcult
d8bf31ecc4 Merge pull request #2510 from ElectroJr/fix-sprite-bug 2022-02-05 15:23:25 -07:00
Pieter-Jan Briers
de4d255841 Analyzer to enforce classes to be either [Virtual], abstract, or sealed. (#2469)
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
2022-02-05 19:31:58 +01:00
Leon Friedrich
ec768c563f Add spin command (#2484) 2022-02-05 12:38:02 +11:00
metalgearsloth
2114d2bc67 Funny struct enumerator for xform kids (#2487) 2022-02-05 12:32:13 +11:00
ElectroJr
43478d0e45 avoid unnecessary RoundToCardinal calls 2022-02-05 14:27:31 +13:00
Leon Friedrich
561699b26e Replace EntityDirtyEvent with C# event. (#2495) 2022-02-05 12:23:51 +11:00
ElectroJr
460923e54d fix sprite bug 2022-02-05 14:10:28 +13:00
Kara D
c299104f0c Version: 0.8.45 2022-02-04 14:35:35 -07:00
Kara D
224bebeeb5 ok then 2022-02-04 14:35:15 -07:00
Kara D
52c8e8ecdf Version: 0.8.44 2022-02-04 14:20:48 -07:00
mirrorcult
ac636b2703 Merge pull request #2441 from metalgearsloth/2022-01-20_more-caching 2022-02-04 14:13:26 -07:00
mirrorcult
a892f9ac99 Merge pull request #2506 from metalgearsloth/2022-02-04_xform-children 2022-02-04 14:13:18 -07:00
mirrorcult
2ebee8f40c Merge pull request #2508 from metalgearsloth/2022-02-04_powa 2022-02-04 14:13:10 -07:00
mirrorcult
43741dc5fc Merge pull request #2490 from metalgearsloth/2022-02-01_game-state 2022-02-04 14:12:56 -07:00
metalgearsloth
da9467b678 Reduce FindGridsIntersecting allocs 2022-02-04 17:44:44 +11:00
Leon Friedrich
8f24a7b4fc Reduce ContainerHelper IoCManager resolves (#2498) 2022-02-04 12:51:29 +11:00
metalgearsloth
ff48959e97 Merge remote-tracking branch 'upstream/master' into 2022-01-20_more-caching 2022-02-04 12:46:01 +11:00
metalgearsloth
09e648d086 Version: 0.8.43 2022-02-04 12:43:43 +11:00
metalgearsloth
1d1db2e109 Also that sneaky pvs one 2022-02-04 12:40:40 +11:00
metalgearsloth
6a902286cd Merge remote-tracking branch 'upstream/master' into 2022-01-20_more-caching 2022-02-04 12:38:32 +11:00
metalgearsloth
933724e4ee Nuke CompGetStateAttempt allocs (#2497) 2022-02-04 12:35:57 +11:00
metalgearsloth
53034e6f05 Replace xform children sortedset with hashset 2022-02-04 12:27:51 +11:00
Ygg01
681f77a796 Change newline append 2022-02-04 02:01:52 +01:00
metalgearsloth
6a31c5649c Tweak 2022-02-03 18:03:56 +11:00
metalgearsloth
7bd90578dc Appearance data event
We agreed that AppearanceVisualizers should probably be deprecated in favour of just using a system instead.
2022-02-03 18:01:31 +11:00
Ygg01
2a7f1cbf48 Ensure that tests work regardless of platform 2022-02-03 04:06:53 +01:00
metalgearsloth
c076be95a6 Version: 0.8.42 2022-02-03 13:26:13 +11:00
metalgearsloth
7b732dd68a Remove unnecessary resolves from MapLoader (#2462) 2022-02-03 13:25:22 +11:00
metalgearsloth
3e34b1414e The end of IMapInit (#2479) 2022-02-03 13:15:17 +11:00
Acruid
8456cd90d1 Move MapGrid data from MapManager to MapGridComponent (#2430) 2022-02-03 13:15:06 +11:00
Ygg01
c4e63cfdc7 Fix multiline errors, add some tests 2022-02-03 01:43:45 +01:00
Pieter-Jan Briers
d716e1ff62 Fix EstPixelSize for Rg32f.
This function literally isn't used but that won't stop me from making this commit.
2022-02-02 21:46:42 +01:00
metalgearsloth
8e9acc9191 Reduce broadphase allocs a l'il bit (#2493) 2022-02-03 00:52:04 +11:00
metalgearsloth
773a068b7d Merge remote-tracking branch 'upstream/master' into 2022-02-01_game-state 2022-02-02 22:13:17 +11:00
metalgearsloth
b37bfff155 Remove string allocs from client prediction (#2494) 2022-02-02 21:59:40 +11:00
Leon Friedrich
a14cce222b Misc physics/shutdown related optimizations (#2496) 2022-02-02 18:12:53 +11:00
Leon Friedrich
c077e09436 Add explicit transform matrices (#2483) 2022-02-02 10:03:45 +11:00
Leon Friedrich
213955566b remove GetBus() (#2491) 2022-02-02 10:03:03 +11:00
metalgearsloth
b98cd3e6e1 Reduce batch for lowerpop I guess 2022-02-01 23:11:35 +11:00
metalgearsloth
987c8e8229 Reduce gamestate allocs
Parallel.ForEach has no right to be that expensive.
2022-02-01 23:11:05 +11:00
metalgearsloth
fcbb97ec55 Fix edge collisions (#2482) 2022-02-01 15:28:12 +11:00
Pieter-Jan Briers
c1ac7aebdb Version: 0.8.41 2022-01-31 17:37:35 +01:00
Pieter-Jan Briers
e4b0d1a03c Hotfix servers not working due to auto pause. 2022-01-31 17:37:19 +01:00
Leon Friedrich
f13f9dc5cd Make OffsetRsiDir() and GetDir() public (#2434) 2022-01-31 19:22:56 +11:00
metalgearsloth
1f6170c000 Merge remote-tracking branch 'upstream/master' into 2022-01-20_more-caching 2022-01-31 18:21:23 +11:00
metalgearsloth
53c7ec8ddc Version: 0.8.40 2022-01-31 17:55:53 +11:00
metalgearsloth
e438e53d36 Silly caching 2022-01-31 17:50:30 +11:00
metalgearsloth
792608f0d0 Merge remote-tracking branch 'upstream/master' into 2022-01-20_more-caching 2022-01-31 17:42:09 +11:00
metalgearsloth
7b5678fd0f woops 2022-01-31 17:34:49 +11:00
metalgearsloth
88c328a636 Smol entityquery change 2022-01-31 17:33:21 +11:00
metalgearsloth
f9573530a8 Nuke entitylookup to get it merged 2022-01-31 17:30:53 +11:00
Leon Friedrich
c1df7dcca7 Move some static helpers to container system (#2470) 2022-01-31 17:21:09 +11:00
Pieter-Jan Briers
f141a0033e Automatically pause server if no players connected. (#2465) 2022-01-31 17:20:26 +11:00
metalgearsloth
227d047584 Version: 0.8.39 2022-01-31 16:25:52 +11:00
metalgearsloth
73b73cd9da Fix InvWorldMatrix helper (#2478) 2022-01-31 16:20:21 +11:00
Pieter-Jan Briers
66be082bdb Fix display.angle_force_es2 defaulting to true. 2022-01-30 20:21:35 +01:00
Pieter-Jan Briers
ac43cf0de1 Fix GLES2 support. 2022-01-30 20:20:23 +01:00
Pieter-Jan Briers
fb41601d9f CVar to force a GLES2 context with GLContextAngle. 2022-01-30 18:06:59 +01:00
metalgearsloth
f35dda3fb3 Version: 0.8.38 2022-01-31 02:09:20 +11:00
metalgearsloth
7ee14f6f4f Remove some unnecessary writer resolves (#2475) 2022-01-31 00:54:30 +11:00
metalgearsloth
97920b42ee Fix FindGridContacts (#2474) 2022-01-30 18:32:13 +11:00
metalgearsloth
8ace0ec254 Fix entity map change crash (#2461) 2022-01-30 17:44:07 +11:00
metalgearsloth
a3606f1098 Fix grid fixture deserialization (#2472) 2022-01-30 17:09:22 +11:00
metalgearsloth
616d379902 Version: 0.8.37 2022-01-29 16:18:05 +11:00
metalgearsloth
a27f475715 Proxy method for entitymanager.dirty(comp) (#2467) 2022-01-29 16:16:32 +11:00
Leon Friedrich
6ee76e8f46 Fix point light add/remove (#2466) 2022-01-29 16:05:23 +11:00
metalgearsloth
891c30c9be Fix maplinearvelocity? (#2317) 2022-01-27 18:01:20 +11:00
metalgearsloth
9757a4c3b6 Fix broadphase for rotation events (#2463) 2022-01-27 17:36:17 +11:00
Pieter-Jan Briers
5be2f610cd Fix thread pool queue histogram having buckets divided by 1000. 2022-01-27 01:55:33 +01:00
metalgearsloth
35324e0853 Version: 0.8.36 2022-01-26 17:56:54 +11:00
metalgearsloth
ac753cdb93 Revert "Reduce component / resolve calls in transformcomp (#2450)" (#2459) 2022-01-26 17:56:30 +11:00
metalgearsloth
3edd39f0eb Version: 0.8.35 2022-01-26 16:10:45 +11:00
metalgearsloth
8f790c28be Deprecate component.Paused (#2449) 2022-01-26 16:10:25 +11:00
metalgearsloth
c253afaf8e Version: 0.8.34 2022-01-26 15:15:19 +11:00
metalgearsloth
a6ac1dced0 Fix more physics ordering bugs (#2458) 2022-01-26 14:59:31 +11:00
wrexbe
d1e0f2cd94 Automatic Component Names (Alternate ending) (#2389) 2022-01-25 14:10:08 +01:00
metalgearsloth
af861d289a Remove some unnecessary resolves (#2452) 2022-01-25 14:01:44 +01:00
metalgearsloth
753f3f8c0f Add dirty method to entmanager for components (#2453) 2022-01-25 14:00:03 +01:00
Leon Friedrich
5c2a5741ee Prevent CreateAudioSource() from erroring/crashing in debug when hitting source limit (#2448) 2022-01-25 13:35:01 +01:00
metalgearsloth
26941a2013 Reduce component / resolve calls in transformcomp (#2450) 2022-01-25 13:32:28 +01:00
Moony
fad4c20da2 VV for entity systems. (#2447) 2022-01-25 13:29:17 +01:00
Pieter-Jan Briers
2b79ef301d Add prometheus-net.DotNetRuntime for more detailed runtime metrics like GC pause times. (#2457) 2022-01-25 13:23:55 +01:00
metalgearsloth
014491e674 Fix joints crash (#2454) 2022-01-25 12:39:31 +11:00
metalgearsloth
2e70cd4f2e Add HasComp to EntityQuery struct (#2451) 2022-01-24 18:48:45 +11:00
metalgearsloth
689e1baa12 Version: 0.8.33 2022-01-24 11:58:16 +11:00
metalgearsloth
c34e84378a Fix grid deletion (#2445) 2022-01-24 11:55:37 +11:00
Kara D
9a44becc73 Version: 0.8.32 2022-01-21 20:08:35 -07:00
mirrorcult
d324d9fcf3 Merge pull request #2429 from metalgearsloth/2022-01-17_grid-iter 2022-01-21 20:04:35 -07:00
Pieter-Jan Briers
74cd48401c Engine changes for launcher ContentDB/delta updates. 2022-01-21 17:24:07 +01:00
metalgearsloth
43081c57e7 Add acruid's funny entity query (#2440) 2022-01-21 10:45:10 +11:00
Leon Friedrich
b80a51d03f Raise an attempt-event when receiving client BUI messages. (#2414) 2022-01-20 02:42:48 +11:00
mirrorcult
e90d5e4977 Merge pull request #2433 from wrexbe/warningfixes 2022-01-18 15:24:14 -07:00
mirrorcult
979034906a Merge pull request #2417 from weaversam8/shutdown-pre-mainloop 2022-01-18 15:23:46 -07:00
Pieter-Jan Briers
9e4fd2905b Release DXGI Factory in VramCommand 2022-01-18 18:16:02 +01:00
Leon Friedrich
914c269411 return -> continue (#2437) 2022-01-18 23:41:55 +11:00
metalgearsloth
2cacc4cd49 Version: 0.8.31 2022-01-18 19:02:43 +11:00
Leon Friedrich
3024094584 Add IsQueuedForDeletion (#2421)
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
2022-01-18 19:02:10 +11:00
Leon Friedrich
4c66451324 Stop updating entity tree on pre-delete un-anchor event (#2422) 2022-01-18 17:49:31 +11:00
Leon Friedrich
7e7d808c90 Sprite offset rendering fix (#2432) 2022-01-18 17:45:49 +11:00
wrexbe
0538e89948 Fixes warnings 2022-01-17 19:13:54 -08:00
Sam Weaver
6376f7c35d Add System.Text.Json.JsonPropertyNameAttribute to sandbox allowlist (#2435) 2022-01-18 03:14:10 +01:00
metalgearsloth
37721f2327 Align rotation 2022-01-17 15:26:39 +11:00
metalgearsloth
b0d2404644 sussy init 2022-01-17 15:09:33 +11:00
metalgearsloth
5f76cb4819 Tests working let's go 2022-01-17 15:05:36 +11:00
metalgearsloth
427a54fc67 Fix tests I guess 2022-01-17 14:53:51 +11:00
metalgearsloth
1cd1fb905d Comment 2022-01-17 14:40:12 +11:00
metalgearsloth
33333f87d2 Nuke broadphase caches
Scales really poorly at high grid counts and better to just lazy load.
2022-01-17 14:26:15 +11:00
metalgearsloth
4e5b8ec1e2 Fix early move / rotate crash 2022-01-17 13:40:54 +11:00
metalgearsloth
007feb76b7 Optimise broadphase movebuffer 2022-01-17 13:27:16 +11:00
metalgearsloth
d34dcb81fb ! 2022-01-17 12:47:16 +11:00
metalgearsloth
8abb366903 aaaaaaaaaaaAAAAAAAAAAAAAAA 2022-01-17 12:43:31 +11:00
metalgearsloth
3e7ba7ca28 Just work please 2022-01-17 11:55:19 +11:00
Pieter-Jan Briers
14d52a9da9 Update ManagedHttpListener. This gives it IPv6 support 2022-01-16 16:32:46 +01:00
Pieter-Jan Briers
847f8d1fee Document most engine CVars.c 2022-01-16 15:08:10 +01:00
Pieter-Jan Briers
0c8d7adf37 Fix wrong comment in cvars 2022-01-16 14:12:23 +01:00
Leon Friedrich
d68d803709 Prevent disembowelling on tile removal. (#2418) 2022-01-16 18:51:04 +11:00
metalgearsloth
13ef514d3e Version: 0.8.30 2022-01-16 18:47:43 +11:00
Vera Aguilera Puerto
e20cd248a0 Makes VirtualController an abstract class inheriting EntitySystem (#2424) 2022-01-16 18:46:48 +11:00
mirrorcult
b8a3bda31d Don't dirty entities when NetSyncEnabled is false (#2426) 2022-01-15 19:31:05 +01:00
ElectroJr
001493d984 Version: 0.8.29 2022-01-15 15:21:54 +13:00
Paul Ritter
013a3e3e8c removes componentdependencies (#2423) 2022-01-15 13:06:29 +11:00
Vera Aguilera Puerto
4c2d984835 Fix singleplayer clients being in "prediction" always, breaking physics. 2022-01-14 19:07:16 +01:00
Paul Ritter
21bb0f15e0 i fudged it 2022-01-12 23:03:54 +01:00
Paul Ritter
8d5162ef8d forgot some 2022-01-12 22:49:10 +01:00
Paul Ritter
257913ac0e add myself to codeowners 2022-01-12 22:43:11 +01:00
metalgearsloth
c90dfccbf4 Version: 0.8.28 2022-01-12 23:15:37 +11:00
metalgearsloth
9c7dc8876f Deduplicate most of loadbp and loadmap (#2409) 2022-01-12 23:14:19 +11:00
metalgearsloth
fc8cbdf01f Entity lookup fixes (#2407) 2022-01-12 14:45:01 +11:00
Sam Weaver
5af4bfa912 Merge branch 'space-wizards:master' into shutdown-pre-mainloop 2022-01-11 22:16:33 -05:00
Sam Weaver
0c5a47ff9d Allow the server to shutdown before the main loop has started 2022-01-11 19:34:41 -05:00
metalgearsloth
b4b4a3864f Version: 0.8.27 2022-01-12 00:43:33 +11:00
metalgearsloth
dca8561881 Remove some unnecessary physics resolves and events (#2404) 2022-01-12 00:35:32 +11:00
metalgearsloth
ee58b5299d Joint serialization (#2410) 2022-01-12 00:31:39 +11:00
Leon Friedrich
7868b12279 Remove unused grid-tile-lookup related code (#2416) 2022-01-11 18:56:09 +11:00
Leon Friedrich
42e91e8c4d Deparent entities on grid tile delete (#2415) 2022-01-11 18:55:23 +11:00
Leon Friedrich
28c9326305 Move popup above modal in RootControl (#2412) 2022-01-10 16:35:04 +01:00
metalgearsloth
40b8772980 Prettify contact deletions (#2413) 2022-01-10 16:34:50 +01:00
Pieter-Jan Briers
b6a548629a More async stuff for StatusHost. 2022-01-10 16:34:16 +01:00
Vera Aguilera Puerto
291a37924d Add a method to unregister "manual" commands from IConsoleHost. (#2403) 2022-01-10 12:51:13 +01:00
Vera Aguilera Puerto
0b5eccd60a Expose ConsoleHost.RegisteredCommand and its callback. (#2394) 2022-01-10 12:50:55 +01:00
Vera Aguilera Puerto
866a324922 ServerConsoleHost logs errors as errors, not warnings. 2022-01-10 12:50:23 +01:00
Pieter-Jan Briers
baf48a8dc1 Update ManagedHttpListener submodule 2022-01-10 11:55:08 +01:00
Pieter-Jan Briers
a85b2dd43c Version: 0.8.26 2022-01-10 01:36:12 +01:00
Pieter-Jan Briers
43059b3985 Remove usages of Newtonsoft.Json from StatusHost (#2405) 2022-01-10 01:36:00 +01:00
Vera Aguilera Puerto
4d6183d6af Add new entries to CODEOWNERS for myself. 2022-01-09 19:26:22 +01:00
metalgearsloth
79f87f03ce Version: 0.8.25 2022-01-09 23:46:35 +11:00
metalgearsloth
01ede29fc4 Nuke gridtilelookup (#2399) 2022-01-09 23:45:48 +11:00
Pieter-Jan Briers
fb54d0df1c Remove usages of Newtonsoft.Json outside StatusHost 2022-01-09 11:53:06 +01:00
E F R
5b65495fbc Controls/SplitContainer: Allow Content to change the SplitState (#2392) 2022-01-09 10:26:24 +01:00
Pieter-Jan Briers
cec3a8c1c2 Remove unnecessary warning mute from Clyde. 2022-01-09 10:21:00 +01:00
Leon Friedrich
8bd0b459b9 Make entity manager proxy methods protected (#2402) 2022-01-07 11:21:28 +01:00
Leon Friedrich
7da50516f9 Fix ghost-pointing visibility (#2401) 2022-01-07 17:08:19 +11:00
Kara D
6cbb2135b8 Version: 0.8.24 2022-01-04 17:51:39 -07:00
mirrorcult
66dbc05022 Merge pull request #2390 from wrexbe/tilesid 2022-01-04 17:48:50 -07:00
Paul
18cc385c70 version bump & changes to itemlist 2022-01-04 21:11:47 +01:00
Matz05
384f672eec Engine changes for more server-pushed lighting variables (#2367)
* Engine changes for more server-pushed lighting variables, but apparently this is a deprecated way of doing things anyway

* Removed two unecessary uses of virtual
2022-01-05 02:57:49 +11:00
Paul
f49a29cfb3 smol itemlist change & version bump 2022-01-03 04:12:04 +01:00
Wrexbe
e8b70877cf Tiles Name->Id DisplayName->Name 2022-01-01 20:52:59 -08:00
Paul Ritter
9b084ea6a9 bandaid fix pvs grid crash for or14 2022-01-01 23:29:14 +01:00
ShadowCommander
51f2fc4259 TeleportTo upgrades (#2384)
* Clean up TeleportTo

* Change TeleportTo to allow teleporting to EntitiyUid

* Rename TeleportToPlayerCommand to TeleportToCommand

* Move duplicate parsing code to TryGetTransformFromUidOrUsername
2022-01-01 17:14:17 +01:00
Pieter-Jan Briers
bb27482e9f Fix release/debug serializer mismatch. 2021-12-31 10:06:32 +01:00
Pieter-Jan Briers
75912896c9 Version: 0.8.21 2021-12-31 09:37:30 +01:00
Pieter-Jan Briers
6e0632ae1b Explicitly block P/Invoke methods in AssemblyTypeChecker 2021-12-31 09:35:34 +01:00
Pieter-Jan Briers
7c90da0402 Correctly load mismatching versions from Robust modules. 2021-12-31 09:35:34 +01:00
Pieter-Jan Briers
313a3eb7f2 Minor GLContextEgl cleanup:
* Compile it in by default but leave display.egl=false by default.
* Minor code cleanup/TerraFX usage.
2021-12-31 09:35:34 +01:00
metalgearsloth
cb054f0761 Avoid touching physicscomp when removed from container (#2379) 2021-12-31 08:36:08 +01:00
Paul Ritter
579b21716d version 0.8.20 2021-12-30 22:55:06 +01:00
Paul Ritter
3ffdc8cc2d changes needed for inventory refactor (#2350)
* get that crap outta here

* reenables tests

* helper

* removes serverside itemcomp & misc fixes

* oopsie

* fixes tests

* motivation low

* container stuff

* resolves optional

* fix some tests

* fixes

Co-authored-by: Paul Ritter <ritter.paul1@gmail.com>
2021-12-30 22:54:00 +01:00
Pieter-Jan Briers
e68af15b40 Don't skip viewer entity in PVS for streaming
This causes problems on the client.
2021-12-30 21:00:52 +01:00
Pieter-Jan Briers
8e5fafaf05 Version: 0.8.19 2021-12-30 18:20:38 +01:00
Pieter-Jan Briers
95f9418e56 Remove some garbage from .gitignore
A different time
2021-12-30 18:12:35 +01:00
Pieter-Jan Briers
23af814ebc Remove Resources/.gitignore
:salute:
2021-12-30 18:10:13 +01:00
Pieter-Jan Briers
ae7dda9dab Update NetSerializer 2021-12-30 18:04:59 +01:00
Pieter-Jan Briers
c5899944a2 Uncomment stuff in manifest so it's not empty and won't break the launcher.
Whoops.
2021-12-30 17:48:22 +01:00
Pieter-Jan Briers
c0e0f65ebe Unhardcode Lidgren App Identifier.
Default value is now RobustToolbox, not SS14_NetTag
2021-12-30 17:32:49 +01:00
Pieter-Jan Briers
3bdce98964 Change X11 instance/class names to RobustToolbox 2021-12-30 17:24:25 +01:00
Pieter-Jan Briers
478ab3bec4 Remove Space Station 14 reference from a MessageBox 2021-12-30 17:23:29 +01:00
Pieter-Jan Briers
ae77ee3df4 Remove SS14 logo/icon/splash/window title branding. Make it all configurable with manifest.yml 2021-12-30 17:22:21 +01:00
Pieter-Jan Briers
86e4a558c5 F3 menu moves out of the way when console opens 2021-12-30 16:49:36 +01:00
metalgearsloth
15c1e8f7bf Run appearancevisualizers on dummy entities again (#2380) 2021-12-30 20:41:55 +11:00
metalgearsloth
f38770dbb5 Poly-edge collision optimisations (#2366) 2021-12-30 20:17:55 +11:00
Pieter-Jan Briers
75d37f8309 Version: 0.8.18 2021-12-30 03:10:50 +01:00
Pieter-Jan Briers
ed641c8cc8 Properly dispose debug console history writer so it flushes properly. 2021-12-30 03:10:01 +01:00
Pieter-Jan Briers
069ebbc8d0 Make disabled prediction work again.
Simulation input and Update() does not happen when prediction is disabled. Both of these can be re-opted in on a per-handler/system basis with a bool flag. Stuff like physics opts out of this now.
2021-12-30 03:03:39 +01:00
Pieter-Jan Briers
720f33a12a Updated webview packaging script 2021-12-29 20:27:50 +01:00
Leon Friedrich
08f1cfbc79 add CanInsertIfEmpty() (#2382)
* add CanInsertIfEmpty

* make CanInsert call CanInsertIfEmpty
2021-12-29 20:27:01 +01:00
Pieter-Jan Briers
9896697919 Viewports have configurable clear color, default to black. 2021-12-29 20:11:08 +01:00
metalgearsloth
057d50b60b BQL optimisations (#2315) 2021-12-29 14:04:19 +11:00
Pieter-Jan Briers
e3dc446e9e Version: 0.8.17 2021-12-28 22:27:33 +01:00
Pieter-Jan Briers
c529f756af Make default visibility mask if no EyeComponent 1 in PVS.
This fixes OpenDream.

@metalgearsloth
2021-12-28 22:27:20 +01:00
metalgearsloth
c07eaecacb Version: 0.8.16 2021-12-29 05:12:05 +11:00
metalgearsloth
ddc03a1d62 Cache vismask on each entity (#2312) 2021-12-29 05:11:53 +11:00
Pieter-Jan Briers
ca59cff07f WiP launcher CEF loading. (#2376) 2021-12-28 17:37:54 +01:00
Pieter-Jan Briers
df4ddfdf25 Unhardcode ACZ stuff to be more flexible (and work on master SS14). 2021-12-28 16:17:21 +01:00
Pieter-Jan Briers
c667a326a3 Fix ACZ creating invalid zip paths on Windows.
Zip files always use / path separators.
2021-12-28 16:17:21 +01:00
Vera Aguilera Puerto
0099442852 Version 0.8.15 2021-12-27 18:48:46 +01:00
Vera Aguilera Puerto
eecb104cc5 Adds help method to C# scripting. (#2368) 2021-12-27 18:47:16 +01:00
Vera Aguilera Puerto
a54283e637 ByRefEvent attribute for events. (#2375) 2021-12-27 17:59:32 +01:00
Vera Aguilera Puerto
ed06107a9f Proxy method AddComp actually returns the added component now. 2021-12-27 16:43:54 +01:00
Vera Aguilera Puerto
2d833daa57 Fix EntitySpawnWindow Erase Mode not being toggled off correctly.
It would always get toggled back on after Clear cleared the erase mode status...
2021-12-27 16:40:52 +01:00
metalgearsloth
67dd0a9433 Make gridfixture_test use fixturescomp (#2370) 2021-12-25 19:05:16 +01:00
Vera Aguilera Puerto
fcc16d67f7 Remove Eye Lerping from engine. (#2371) 2021-12-25 19:05:07 +01:00
metalgearsloth
394f51f70d Version: 0.8.14 2021-12-25 21:42:26 +11:00
metalgearsloth
538627328e Don't wake destroyed contact bodies if they can't collide (#2369)
e.g. if they're getting yeeted to nullspace or inserted into a container.
2021-12-25 11:26:47 +01:00
Vera Aguilera Puerto
b5a21ccc4d Version 0.8.13 2021-12-23 13:06:39 +01:00
metalgearsloth
2d331ff786 Broadphase fix take 2 (#2327)
Co-authored-by: Paul Ritter <ritter.paul1@googlemail.com>
2021-12-23 12:20:59 +01:00
metalgearsloth
9d9ad15274 Entity deletion stuff (#2365) 2021-12-23 12:20:44 +01:00
Pieter-Jan Briers
114ec2e493 This is literally me when you need to google just to delete a submodule 2021-12-23 12:10:51 +01:00
Pieter-Jan Briers
2fb45da0d7 Switch to NuGet packages for Linguini 2021-12-23 10:42:19 +01:00
metalgearsloth
54a693dfa7 Fix attached effects 2021-12-23 15:50:19 +11:00
Pieter-Jan Briers
4be572ba58 whoops 2021-12-23 01:25:42 +01:00
Pieter-Jan Briers
e22d6ea65c Use float.IsFinite in some appropriate places previously using IsNan || IsInfinity 2021-12-23 01:21:57 +01:00
Pieter-Jan Briers
baf86b5b83 Get rid of ComponentTypeCache stuff.
It didn't really work.
2021-12-23 01:15:25 +01:00
Pieter-Jan Briers
e56c77319c Fix tests breaking due to component index stuff. 2021-12-23 01:12:56 +01:00
Pieter-Jan Briers
a170dbd716 Use BitOperations for MathHelper.NextPowerOfTwo instead. 2021-12-23 01:12:02 +01:00
Pieter-Jan Briers
b821833437 Fix compiler warning in GLContextAngle.cs 2021-12-22 20:50:53 +01:00
Pieter-Jan Briers
1bb9b8cae3 Fix launchauth command 2021-12-22 20:46:57 +01:00
metalgearsloth
1e32eb135d Version: 0.8.12 2021-12-22 10:30:23 +11:00
Pieter-Jan Briers
b695ce581e Replace Win32 interop sigs with TerraFX.
We include TerraFX in builds now so this shouldn't be a problem.
2021-12-21 17:29:06 +01:00
Pieter-Jan Briers
8138fc5fa2 Remove component get caching from PVS.
This was literally slower than simply doing it directly.
2021-12-21 17:16:58 +01:00
Pieter-Jan Briers
0b2693cb98 Optimize TryGetComponent & friends with array type -> dict lookups. 2021-12-21 17:16:08 +01:00
Vera Aguilera Puerto
3d959c98ed Version 0.8.11 2021-12-20 17:17:03 +01:00
Vera Aguilera Puerto
0ccee0b496 Fix engine status host not reporting hostname correctly.
The hostname wasn't being cached at server start.
2021-12-20 17:16:13 +01:00
Paul
b7b2a0ab5e quickly put that back 2021-12-20 15:33:50 +01:00
metalgearsloth
375402c455 Optimise DetachParentToNull for grid deletion (#2362) 2021-12-20 13:59:50 +01:00
Paul
03505da382 fixes a bunch of warnings 2021-12-20 13:59:01 +01:00
metalgearsloth
f56219746b Allow tight grid fits (#2309) 2021-12-20 13:58:33 +01:00
metalgearsloth
116c3e491c Use velocities and positions by ref in constraints solver (#2360) 2021-12-20 13:57:32 +01:00
Vera Aguilera Puerto
e94c2f039c Some fixes for map init. (#2355) 2021-12-20 13:57:26 +01:00
Pieter-Jan Briers
2fd52ef3eb Add automatic hub advertisement. 2021-12-20 13:56:17 +01:00
Paul
29659536aa version 0.8.10 2021-12-20 12:39:19 +01:00
Paul Ritter
338a2831ee Revert Rich Text (#2363) 2021-12-20 12:38:35 +01:00
metalgearsloth
c64c1aca5b Fix effect rotation (#2357) 2021-12-19 17:44:26 +11:00
Vera Aguilera Puerto
0dd72f4434 Extra MIDI sanity checks.
Makes sure the tracking entity is valid before setting source velocity based on global linear velocity.
2021-12-18 00:31:23 +01:00
Vera Aguilera Puerto
891d1da208 Version 0.8.9 2021-12-17 23:41:02 +01:00
E F R
f8e903c422 Rich Text Fixes The 3rd (#2351) 2021-12-17 23:39:46 +01:00
Vera Aguilera Puerto
b373824cf5 Various MIDI improvements and fixes.
- Fix bug where MIDI renderers in other maps than the current map in IEyeManager would be silenced forever.
- Tracking an entity now sets the TrackingCoordinates to the entity's coordinates.
- MIDI renderers not in your same IEyeManager.CurrentMap or that have invalid coordinates will have their occlusion set to the max value, essentially becoming silenced. I feel like this is a much better solution than changing the volume, as things should be able to call Source.SetVolume without it being changed by positional audio shenanigans.
2021-12-17 23:38:14 +01:00
Paul
6c3c51e816 fix FloatSerializer.cs 2021-12-16 17:52:14 +01:00
Paul
9abc3fbee2 remove allocations with this one simple trick. doctors hate em! 2021-12-16 14:25:26 +01:00
Vera Aguilera Puerto
9f20c325ab Cache transform comp in CreateEntityUninitialized.
Instead of getting it 5 times in a row.
2021-12-16 12:58:12 +01:00
Vera Aguilera Puerto
e7308efdd7 Botch VV to allow viewing remote entities that don't exist locally. (#2346) 2021-12-16 11:32:54 +01:00
Vera Aguilera Puerto
c2113b5719 Remove AggressiveOptimization flag from EntitySystem proxy methods.
Also fixes xmldoc inheritance for some methods.
2021-12-15 11:45:34 +01:00
Leon Friedrich
c43f7ea861 Add nullable overrides for the the Deleted() & Exists() proxy methods. (#2348) 2021-12-15 11:38:45 +01:00
E F R
5fac3f4adb UserInterface/RichTextEntry: Rich Text Fixes (Round 2) (#2340)
Co-authored-by: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com>
Co-authored-by: Paul Ritter <ritter.paul1@googlemail.com>
2021-12-15 10:25:33 +01:00
metalgearsloth
7a31525c3c EntityQuery funnies (#2347) 2021-12-15 18:02:02 +11:00
Vera Aguilera Puerto
1613f5e982 Expose IContentRoot to content. (#2338) 2021-12-14 13:49:07 +01:00
Leon Friedrich
b6907e999d Make ContainerSystem.ContainsEntity() not log missing components (#2345) 2021-12-14 10:14:09 +01:00
Vera Aguilera Puerto
c73077014b EntityUid now shows a "View" button in VV. (#2342) 2021-12-14 09:57:46 +01:00
metalgearsloth
ce9bf26204 Minor render tree updates optimisation (#2337) 2021-12-14 09:51:27 +01:00
Paul Ritter
85f716ef03 pvs optimizations (#2341) 2021-12-14 09:50:34 +01:00
metalgearsloth
fba696ad6d Optimise client 5% with this one trick (#2334) 2021-12-14 09:50:03 +01:00
metalgearsloth
ed4267df50 Minor xform optimisations (#2335) 2021-12-14 09:49:30 +01:00
Insineer
1afeac4b95 fix(server): specify default culture for float.Parse (#2307)
Co-authored-by: Acruid <shatter66@gmail.com>
2021-12-13 11:27:16 +01:00
ShadowCommander
1c761737b6 Version: 0.8.8 2021-12-12 23:19:42 -08:00
ShadowCommander
a159db74f6 Version: 0.2.26 2021-12-12 23:19:07 -08:00
ShadowCommander
ac781e51ec Clean up unused variables in OutputPanel 2021-12-12 23:17:38 -08:00
E F R
e050af31af Controls/OutputPanel: Conslidate logic in _invalidateEntries, and get rid of some rogue LineHeight calculations (#2332) 2021-12-12 23:10:24 -08:00
Acruid
9ca1b8dae0 Version: 0.8.7 2021-12-12 18:20:47 -08:00
wrexbe
a59ab44199 Add IWritableDirProvider helper (#2321) 2021-12-12 16:19:51 -08:00
ShadowCommander
45d4a67ff4 Fix replicated cvars not copying overrides from cmd line (#2329) 2021-12-12 16:17:19 -08:00
Acruid
97f5131ce0 Fixed bug where _pendingResolves was not getting cleared. (#2328)
Added an option to defer field DI for RegisteredInstances until BuildGraph is called. This lets you register instances that contain dependency fields that are not instantiated yet.
2021-12-12 16:12:52 -08:00
localcc
2d4ddd8bd1 Texture GetPixel implemented (#2320) 2021-12-12 16:09:02 -08:00
wrexbe
c94e49ed08 Cache Component Types (#2325) 2021-12-12 16:06:51 -08:00
metalgearsloth
30a72b1227 Optimise some physics stuff (#2303)
* Optimise some physics stuff

* Fix build
2021-12-12 15:45:29 -08:00
metalgearsloth
b5ac7752d4 Make client console check perms locally (#2188) 2021-12-13 00:43:33 +01:00
E F R
04ed7e14e2 Console/SystemConsoleManager: Short-circuit console input handling when not interactive (#2311)
* Console/SystemConsoleManager: Short-circuit console input handling when not interactive

* Console/SystemConsoleManager: Use a `Task` for reading input

Now with 100% less blocking (on the main thread, at least)

* Console/SystemConsoleManager: move command execution off the worker thread
2021-12-12 15:28:02 -08:00
E F R
d168926f98 Graphics/Clyde: add option to submit GLSL #defines for shaders (#2306) 2021-12-12 15:05:50 -08:00
E F R
2a8887d0b4 Rich text redux (#2213)
* Shared/Utility: Define new FormattedMessage core types

* Shared/Utility: Move MarkupParser to a new namespace, update to new FormattedText

* Shared/Serialization: Temporary fix for FormattedMessageSerializer

* Scripting/ScriptInstanceShared: Move to new FormattedMessage.Builder

* Shared/Utility: Add a FormattedMessage loader to the .Builder

* Server/Scripting: Port SciptHost to FormattedMessage.Builder

* UserInterface/RichTextEntry: NOP out almost everything

not gonna bother fixing it until more groundwork is laid

* Shared/Utility: Expand Utility.Extensions a bit

strictly for pesonal reasons

* Client/UserInterface: Add the base TextLayout engine

* Client/Graphics: Add a Font Library manager

* Graphics/TextLayout: Finish up implementing the TextLayout engine

* Utility/FormattedMessage: Add yet another hack to keep the serializer in service

* Commands/Debug: Use FormattedMessage.Builder

* Console/Completions: Use FormattedMessage.Builder

* Utility/FormattedMessage: Add `AddMessage` methods

* Console/ScriptConsole: Use FormattedMessage.Builder

* Client/Log: Use FormattedMessage.Builder

* CustomControls/DebugConsole: Use FormattedMessage.Builder

* Controls/OutputPanel: Use FormattedMessage.Builder, NOP `Draw` pending rewrite

* Controls/RichTextLabel: Use FormattedMessage.Builder, NOP `Draw` pending rewrite

* UnitTesting: Update FormattedMessage/Markup Tests

They will NOT pass yet, but I don't care; it compiles.

* Utility/FormattedMessage: Fix some off-by-one Builder bugs

* Utility/FormattedMessage: Continue cleanup, test compliance

* Utility/FormattedMessage: Work around https://github.com/dotnet/roslyn/issues/57870

* Utility/FormattedMessage: Move ISectionable from TextLayout, implement it for FormattedMessage

* UserInterface/TextLayout: Add a `postcreate` function to set up new `TIn`s

Apparently Roslyn isn't big-brained enough to understand that a
closure of type `Func<T>` means that `var n = new(); return n;` requires
`new()` to return a `T`.

Ironically, it's significantly less cbt to add this than to convert
that big tuple in `Layout` in to a class or struct of some sort
(to initialize the `List<>`s).

* UserInterface/TextLayout: Throw if `Meta` isn't recognized

TODO warning go brrr

* Graphics/FontLibrary: Add a `DummyVariant`

* UserInterface/UITheme: Move to FontLibraries

* UserInterface/TextLayout: Move to an un-nested `ImmutableArray`

* UserInterface/RichTextEntry: Go ahead. Draw.

* Markup/Basic: Add extension & helpers for FormattedMessage.Builder

* Markup/Basic: Add `EscapeText` back in

A forgotten casualty of the great Markup separation of 2021

* Graphics/FontLibrary: Clean up bit magic, ensure that at least one font is picked

* Graphics/FontLibrary: Add diagnostics to the "no fonts" exception

* UserInterface/TextLayout: Scrap `Word`, return to `Offset`

* UserInterface/TextLayout: A whole bunch of hard-fought bugfixes

* Utility/FormattedMessage: Add a static, empty FormattedMessage

* Utility/FormattedMessage: Fix. Bugs.

* UserInterface/RichTextEntry: Bug fixin'

* UserInterface: CSS teim

* Markup/Basic: Add an optional "default" style to use

* Utility/FormattedMessage: I'm surprised I only made this mistake once.

* Log/DebugConsoleLogHandler: work around lack of a default style
2021-12-12 14:35:26 -08:00
E F R
f7f6b74fd3 Graphics/Clyde: make Clearing RenderTargets optional (#2302) 2021-12-11 16:48:34 -08:00
Leon Friedrich
7609a49c17 Make AudioSystem no longer automatically add players in range. (#2299)
* make adding entities in range optional

* Revert "make adding entities in range optional"

This reverts commit bd707b9f4e.

* remove AudioSystem filter modifications
2021-12-11 16:32:17 -08:00
Vera Aguilera Puerto
213db08566 Version 0.8.6 2021-12-11 21:09:40 +01:00
Vera Aguilera Puerto
ba2fbd99a8 Revert "Fix broadphase RemoveBody issue (#2318)"
Caused severe issues, such as firelocks not having collision and some funny exceptions.
This reverts commit fd1a1d326c.
2021-12-11 20:59:44 +01:00
Vera Aguilera Puerto
8ed681d82e EntityStringRepresentation implements IFormattable 2021-12-11 16:00:26 +01:00
Vera Aguilera Puerto
1032f10d85 Version 0.8.5 2021-12-11 15:32:31 +01:00
Vera Aguilera Puerto
4fc46ac814 Transform DetachParentToNull sets map to nullspace before raising the event. 2021-12-11 15:32:10 +01:00
Vera Aguilera Puerto
1611fb00d8 Version 0.8.4 2021-12-11 14:19:40 +01:00
Vera Aguilera Puerto
57a1f2743e Some minor PVS optimizations (#2324) 2021-12-11 14:17:38 +01:00
metalgearsloth
fd1a1d326c Fix broadphase RemoveBody issue (#2318) 2021-12-11 14:08:57 +01:00
metalgearsloth
ca7fdacfeb Make RunDeferred use worldpos+rot method (#2314) 2021-12-11 14:02:43 +01:00
Vera Aguilera Puerto
80f05d7467 Fix botched delete inline in EntityLookup 2021-12-11 12:38:32 +01:00
Paul Ritter
e84604f7e3 Fixes pvs culling & make budgets more granular (#2322) 2021-12-11 12:11:16 +01:00
Vera Aguilera Puerto
66c3013e39 VV EntityUid Name/Description setter.
For all your adminbus needs!
2021-12-10 11:53:00 +01:00
Vera Aguilera Puerto
717802fe54 Fix wrong grid placement direction when grid is rotated
Something to note is that grid placement is still very scuffed. On certain rotations, it begins acting weird.
2021-12-10 11:24:39 +01:00
Paul
977a840253 version bump 2021-12-10 10:17:25 +01:00
Paul
6051d4d358 removes statecache 2021-12-10 10:16:22 +01:00
Vera Aguilera Puerto
0a00a8a109 Fix build 2021-12-09 21:30:50 +01:00
wrexbe
9d1aff3a75 Fix NextMultipleOf for int/long (#2289) 2021-12-09 12:27:08 -08:00
E F R
3332279e75 SharedPhysicsSystem: convert parents' angular velocity to linear when leaving (#2208)
* SharedPhysicsSystem: convert parents' angular velocity to linear when leaving

Co-authored-by: ElectroJr <60421075+ElectroJr@users.noreply.github.com>
Co-authored-by: Tomeno <Tomeno@users.noreply.github.com>

* SharedPhysicsSystem: Use Center of Mass now that it supposedly works

* SharedPhysicsSystem: Use REAL MATH™ to handle rotation when reparenting

* SharedPhysicsSystem: Cache some reused matrices

Addresses:
https://github.com/space-wizards/RobustToolbox/pull/2208#discussion_r762503056
https://github.com/space-wizards/RobustToolbox/pull/2208#discussion_r762502704

* SharedPhysicsSystem: More caching, I guess

* SharedPhysicsSystem: save ONE WHOLE ACCESS

What's next, shortening variable names to make it load faster?

Co-authored-by: ElectroJr <60421075+ElectroJr@users.noreply.github.com>
Co-authored-by: Tomeno <Tomeno@users.noreply.github.com>
2021-12-09 12:18:37 -08:00
Vera Aguilera Puerto
d8059cacf4 Version 0.8.2
I hate myself sometimes
2021-12-09 14:55:15 +01:00
Vera Aguilera Puerto
374e80aad3 Version 0.8.1
Fixes bug regarding actors and player sessions on RELEASE.
2021-12-09 14:53:05 +01:00
Vera Aguilera Puerto
2fd15b0375 Version 0.8.0 2021-12-09 14:27:12 +01:00
Vera Aguilera Puerto
9293421f41 Merge branch '2021-12-03-remove-IEntity-komm-süsser-todd' 2021-12-09 14:25:49 +01:00
Vera Aguilera Puerto
4f358b3a5e proper VV for EntityUid 2021-12-09 13:24:19 +01:00
Vera Aguilera Puerto
76a804d427 TempQualifier moment 2021-12-09 12:54:49 +01:00
Vera Aguilera Puerto
f8bf877b61 Fix weird lifestage autorefactors. 2021-12-09 12:39:42 +01:00
Vera Aguilera Puerto
1f99f43755 Resolve IEntityManager as needed in MetaDataComponent 2021-12-09 11:22:56 +01:00
Vera Aguilera Puerto
457abf323b Merge branch 'master' into 2021-12-03-remove-IEntity-komm-süsser-todd
# Conflicts:
#	Robust.Shared/GameObjects/EntitySystem.Resolve.cs
2021-12-09 10:39:00 +01:00
Vera Aguilera Puerto
35d81974a8 Resolve no longer debug-asserts that the entity exists. 2021-12-09 01:59:02 +01:00
Paul
c6a9113144 version bump 2021-12-08 19:56:32 +01:00
Paul
c76d1d8c5c Merge branch 'master' of https://github.com/space-wizards/RobustToolbox 2021-12-08 19:55:42 +01:00
Paul
0e289873f5 pvs fixes 2021-12-08 19:55:24 +01:00
Paul
7e59febb47 nukes more resolves 2021-12-08 19:38:59 +01:00
Vera Aguilera Puerto
fb7a231b78 Fix VV crash 2021-12-08 13:33:21 +01:00
Vera Aguilera Puerto
85ded7a5a5 Fix build 2021-12-08 12:23:33 +01:00
Vera Aguilera Puerto
db996b9fb3 A bunch more resolves removed wooo 2021-12-08 11:37:11 +01:00
Vera Aguilera Puerto
52b09cef71 Fix build on RELEASE
EXCEPTION TOLERANCEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaAAaAAaaAAaAAaaAaaAAaaAaaAAAAAAaaaaaaaAAAAaaAAAAAaaaAAAAaaaaAAAAAaaaaaAAAAaaaaaaaAAAAAAAaaaaAAAAAaaaaaaaaAAAAAAAAAAAAAaaaaaaAAAAAAAAAAAaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAa
2021-12-08 11:11:13 +01:00
Vera Aguilera Puerto
26dcef4a11 Fix more useless resolves, makes entity system proxy "Deleted" not throw. 2021-12-08 11:10:11 +01:00
Vera Aguilera Puerto
9133879bd3 Remove more IoCManager IEntityManager resolves
Also adds convenience "Deleted" method to IEntityManager
2021-12-08 10:53:24 +01:00
Paul
76b2909116 removes resolves 2021-12-08 00:09:41 +01:00
Paul
9dab8e77a7 oh nein, kringe 2021-12-07 23:50:05 +01:00
Paul
0464b89cfe nonsense 2021-12-07 23:37:05 +01:00
Vera Aguilera Puerto
877e64f6be Merge pull request #12 from wrexbe/fork123 2021-12-07 18:52:59 +01:00
Wrexbe
4df03f859b Fix release building 2021-12-07 09:50:07 -08:00
metalgearsloth
66435e6022 optimise the shit out of rendertrees 2021-12-07 23:47:12 +11:00
Vera Aguilera Puerto
dc4f3b8f6f Merge pull request #10 from metalgearsloth/2021-12-03-remove-IEntity-komm-süsser-todd 2021-12-07 13:43:42 +01:00
metalgearsloth
8377acb672 more cast memes 2021-12-07 22:14:44 +11:00
metalgearsloth
84c14a4657 Remove redundant IComponent casts 2021-12-07 21:53:44 +11:00
Vera Aguilera Puerto
1d5476e01b More crash fixes 2021-12-06 15:56:14 +01:00
Vera Aguilera Puerto
73d21da0dd entity spawn panel fix 2021-12-06 15:41:38 +01:00
Vera Aguilera Puerto
81672fbe29 Goes in-game now 2021-12-06 15:34:46 +01:00
DrSmugleaf
5655dea1c7 Fix more errors, client and server now build 2021-12-06 14:00:38 +01:00
DrSmugleaf
2616f3cedd Merge branch 'master' of https://github.com/space-wizards/RobustToolbox into 2021-12-03-remove-IEntity-komm-süsser-todd 2021-12-06 12:44:57 +01:00
DrSmugleaf
511f272e96 Merge branch '2021-12-03-remove-IEntity-komm-süsser-todd' of https://github.com/Zumorica/RobustToolbox into 2021-12-03-remove-IEntity-komm-süsser-todd 2021-12-06 12:44:52 +01:00
DrSmugleaf
3c7f87b8c3 Add GetComponentOrNull extension for nullable EUid 2021-12-06 12:44:11 +01:00
DrSmugleaf
7f89aabbb0 Merge branch 'master' of https://github.com/space-wizards/RobustToolbox into 2021-12-03-remove-IEntity-komm-süsser-todd 2021-12-06 12:41:36 +01:00
DrSmugleaf
d6c9420a74 Add an overload for nullable EUid CompOrNull 2021-12-06 12:38:04 +01:00
Vera Aguilera Puerto
43e67c0db9 Add new EntitySystem proxy methods. (#2310) 2021-12-06 12:33:04 +01:00
metalgearsloth
2e1aa16d38 Merge pull request #9 from wrexbe/fixingitagain 2021-12-06 15:48:51 +11:00
metalgearsloth
849bcaeb74 Merge branch '2021-12-03-remove-IEntity-komm-süsser-todd' into fixingitagain 2021-12-06 15:48:44 +11:00
metalgearsloth
dce320d0f5 AttachedEntity stuff 2021-12-06 15:07:12 +11:00
metalgearsloth
d40804b41e testing push perms 2021-12-06 14:27:59 +11:00
Wrexbe
90596c8979 Fixed It 2021-12-05 18:12:56 -08:00
DrSmugleaf
36f582a712 Fix errors 2021-12-05 21:02:03 +01:00
DrSmugleaf
163deff564 Fix 3000 errors 2021-12-05 18:13:33 +01:00
metalgearsloth
ca68041199 Optimise showchunkbb a lot (#2308) 2021-12-05 13:38:40 +11:00
Vera Aguilera Puerto
850d7ba032 More error fixes. 2021-12-04 12:47:09 +01:00
Vera Aguilera Puerto
4c5fefc3b2 Merge pull request #8 from wrexbe/fork3 2021-12-04 11:50:26 +01:00
Wrexbe
84ee039f62 Fix the tests 2021-12-03 18:48:29 -08:00
Vera Aguilera Puerto
a84b481143 Merge pull request #6 from wrexbe/fork2 2021-12-03 23:27:28 +01:00
Wrexbe
69fa2eed64 Building Tests 2021-12-03 14:22:53 -08:00
Vera Aguilera Puerto
71f8275ae2 Merge pull request #4 from 20kdc/susser-todd 2021-12-03 22:46:57 +01:00
20kdc
b89bf5739c Move porting convenience properties 2021-12-03 21:44:14 +00:00
20kdc
e9ec2ee1d3 Susser Todd: Robust.Server, Error Pass 2 2021-12-03 21:33:10 +00:00
Vera Aguilera Puerto
a44a25fb96 Merge pull request #3 from wrexbe/fork1 2021-12-03 22:09:32 +01:00
Wrexbe
5356523305 Client builds 2021-12-03 12:58:37 -08:00
Vera Aguilera Puerto
2004ee9040 Merge pull request #2 from 20kdc/susser-todd 2021-12-03 21:00:09 +01:00
20kdc
7b6d9bd719 Susser Todd: Robust.Client/Robust.Server: Error Pass 1 2021-12-03 19:57:19 +00:00
Vera Aguilera Puerto
287e57f717 Merge pull request #1 from 20kdc/susser-todd 2021-12-03 20:44:39 +01:00
20kdc
add06753e9 Susser Todd: Robust.Shared.Scripting, Error Pass 2021-12-03 19:38:13 +00:00
20kdc
8aa6fb478b Susser Todd: Robust.Shared, Error Pass 2 "It Now Compiles" 2021-12-03 19:36:16 +00:00
20kdc
5e7d617736 Susser Todd: Robust.Shared, Error Pass 1 2021-12-03 18:40:55 +00:00
Vera Aguilera Puerto
fa6c37778e Minor EntityLookup fixes. 2021-12-03 17:50:37 +01:00
Vera Aguilera Puerto
4f92301d25 More manual fixes. 2021-12-03 17:35:20 +01:00
Vera Aguilera Puerto
bd6be35b4d ForAll, Spawn, etc 2021-12-03 17:11:29 +01:00
Vera Aguilera Puerto
c39f6d09eb Lots of manual fixing. More to come. 2021-12-03 17:01:46 +01:00
Vera Aguilera Puerto
5eda1b326d Inline OwnerUid 2021-12-03 16:30:34 +01:00
Vera Aguilera Puerto
5c3b058e81 Literally fucking remove IEntity 2021-12-03 16:08:41 +01:00
Vera Aguilera Puerto
7a06db60cf Inline UID 2021-12-03 15:53:10 +01:00
Vera Aguilera Puerto
aafb15aff5 Perform a slight amount of trolling 2021-12-03 15:35:18 +01:00
Vera Aguilera Puerto
c437fadd25 Inline GetComponentOrNull 2021-12-03 15:32:05 +01:00
Vera Aguilera Puerto
bab37587c5 Inline Name 2021-12-03 15:25:51 +01:00
Vera Aguilera Puerto
c4cd1fb6ee Some manual GetComponentOrNull inlines 2021-12-03 15:09:45 +01:00
Vera Aguilera Puerto
94e6886a85 Inline Transform 2021-12-03 14:20:35 +01:00
Vera Aguilera Puerto
e93ae73e50 Inline TryGetComponent completely, for real 2021-12-03 14:17:01 +01:00
Vera Aguilera Puerto
9739eaa34a Inline TryGetComponent completely 2021-12-03 14:05:36 +01:00
Vera Aguilera Puerto
2aa5e8c07f Version 0.7.21 2021-12-03 13:07:22 +01:00
Vera Aguilera Puerto
f8b2412855 holy fucking shit, fuck exception tolerance only being in RELEASE 2021-12-03 13:07:22 +01:00
metalgearsloth
04782b83ab Add overload to draw rotated position (#2304) 2021-12-03 12:41:58 +01:00
metalgearsloth
e2f2b3a26d Get rid of unused dependency on EffectOverlay 2021-12-03 22:24:23 +11:00
Vera Aguilera Puerto
b44a1cde88 Inline HasComponent entirely 2021-12-03 12:23:18 +01:00
Vera Aguilera Puerto
af964b52ed Inline one TryGetComponent overload 2021-12-03 12:18:25 +01:00
Vera Aguilera Puerto
ebca38b57a Inline one HasComponent overload 2021-12-03 12:18:21 +01:00
Vera Aguilera Puerto
86d05dfa1e Inline GetComponent 2021-12-03 11:55:25 +01:00
Vera Aguilera Puerto
e10bd576ff Inline SendNetworkMessage 2021-12-03 11:47:46 +01:00
Vera Aguilera Puerto
20ff1e86c0 Inline SendMessage 2021-12-03 11:47:24 +01:00
Vera Aguilera Puerto
9d2a2ef4ba Inline ToString 2021-12-03 11:46:53 +01:00
Vera Aguilera Puerto
70d2457514 Inline QueueDelete 2021-12-03 11:43:22 +01:00
Vera Aguilera Puerto
ba8deea700 Inline Delete 2021-12-03 11:43:03 +01:00
Vera Aguilera Puerto
f44d797057 Inline GetAllComponents 2021-12-03 11:42:24 +01:00
Vera Aguilera Puerto
e72d29a677 Remove Debug asserts 2021-12-03 11:39:36 +01:00
Vera Aguilera Puerto
5730465c36 Inline RemoveComponent 2021-12-03 11:34:00 +01:00
Vera Aguilera Puerto
19f50d60c9 Inline AddComponent 2021-12-03 11:33:40 +01:00
Vera Aguilera Puerto
bbf5e92f32 Inline IsValid 2021-12-03 11:32:53 +01:00
Vera Aguilera Puerto
419f4f36ab Inline Paused 2021-12-03 11:30:39 +01:00
Vera Aguilera Puerto
7769252109 Inline Deleted 2021-12-03 11:30:03 +01:00
Vera Aguilera Puerto
3785777983 Remove Initializing 2021-12-03 11:29:13 +01:00
Vera Aguilera Puerto
61aa73ffe3 Fix Prototype inline errors 2021-12-03 11:28:14 +01:00
Vera Aguilera Puerto
ce11bf4564 Inline Initialized 2021-12-03 11:24:56 +01:00
Vera Aguilera Puerto
0cf97780f0 Inline LastModifiedTick 2021-12-03 11:15:40 +01:00
Vera Aguilera Puerto
fc2f6d4910 Inline Description 2021-12-03 11:15:12 +01:00
Vera Aguilera Puerto
69158de99b Inline Prototype 2021-12-03 11:13:58 +01:00
Vera Aguilera Puerto
7bec76d8d1 Inline LifeStage 2021-12-03 11:13:18 +01:00
Vera Aguilera Puerto
6e86f98406 Inline MetaData 2021-12-03 11:12:35 +01:00
Vera Aguilera Puerto
f782e76671 Inline EntityManager 2021-12-03 11:11:52 +01:00
metalgearsloth
5a8464b518 Get rid of grid log spam 2021-12-03 21:08:01 +11:00
Vera Aguilera Puerto
5f1feb9bb1 Version 0.7.20 2021-12-03 11:02:48 +01:00
Vera Aguilera Puerto
196e2bb427 The End of Entity (Komm, Süsser Todd: Part 1.0) (#2295)
Co-authored-by: Paul Ritter <ritter.paul1@googlemail.com>
2021-12-03 11:01:59 +01:00
Acruid
f8bebee904 Remove Entity Transform/MetaData Component Cache (#2296)
Co-authored-by: Vera Aguilera Puerto <gradientvera@outlook.com>
2021-12-03 10:33:06 +01:00
Vera Aguilera Puerto
6515b08b41 Better ToPrettyString with EntityStringRepresentation (#2301) 2021-12-03 10:09:49 +01:00
Vera Aguilera Puerto
6e2f18d0d8 Add joints to RobustServerSimulation. 2021-12-02 12:33:40 +01:00
metalgearsloth
a2ecd63e9d Version: 0.7.19 2021-12-01 18:31:44 +11:00
metalgearsloth
6da9176410 Fixture 2 electric boogaloo (#2297) 2021-12-01 18:31:13 +11:00
metalgearsloth
ae9b771c8c Version: 0.7.18 2021-12-01 13:57:48 +11:00
metalgearsloth
d1e206864c Revert "Quick hotfix for fixtures"
This reverts commit 7316d9e950.
2021-12-01 13:56:32 +11:00
metalgearsloth
f812eb1e27 Revert "Move physics fixtures to its own component (#2220)"
This reverts commit ebc0fc9c60.
2021-12-01 13:54:32 +11:00
metalgearsloth
1dec0dd980 Version: 0.7.17 2021-12-01 13:07:10 +11:00
metalgearsloth
7316d9e950 Quick hotfix for fixtures 2021-12-01 13:06:54 +11:00
metalgearsloth
f7c2305bce Version: 0.7.16 2021-12-01 13:02:55 +11:00
metalgearsloth
ebc0fc9c60 Move physics fixtures to its own component (#2220) 2021-12-01 12:59:42 +11:00
metalgearsloth
d157aab786 Hotfix effect rotation (#2291) 2021-12-01 12:59:28 +11:00
Pieter-Jan Briers
70a5d1bad6 Return of ExpandPvsEvent
Paul has been declared irrational and is extremely coping rn.
2021-11-30 18:35:50 +01:00
Paul
2471bf8b4b we do a little trolling 2021-11-30 18:13:36 +01:00
Paul
e7c5706b04 comments out tests until i fix inventorycode 2021-11-30 18:09:19 +01:00
Paul
7b6d8a1465 fixes at least one test 2021-11-30 18:04:43 +01:00
Paul
31b750bd5b fixes that goddamn AngleSerializerTest 2021-11-30 17:50:52 +01:00
Paul
6ebd0eb4ae fuck mapmanager 2021-11-30 16:59:44 +01:00
Paul
37eac8c73f version 0.7.14 2021-11-30 15:19:13 +01:00
Paul Ritter
44649eea1c pvs refactor (#2247)
Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
2021-11-30 15:07:08 +01:00
Pieter-Jan Briers
caa0212282 Swap ANGLE-related CVars around.
ANGLE is now off by default, angle_custom_swap_chain on if you set ANGLE.
2021-11-29 18:36:14 +01:00
Pieter-Jan Briers
7f9d08c8f9 Fix duplicate GL init on ANGLE GL context. 2021-11-29 18:35:24 +01:00
Pieter-Jan Briers
1c128e6b74 Return of the VRAM command. 2021-11-29 13:23:58 +01:00
Pieter-Jan Briers
099e7c5c48 IDXGIFactory6::EnumAdapterByGpuPreference for GLContextAngle. 2021-11-29 13:14:59 +01:00
Pieter-Jan Briers
2f76908efb Remove PlatformTarget from WebView project.
Fixes a compiler warning.
2021-11-29 08:35:39 +01:00
Pieter-Jan Briers
5adde7d588 Version: 0.7.13 2021-11-29 00:20:45 +01:00
Pieter-Jan Briers
7b1bb7df47 Expand PVS event (#2287) 2021-11-28 23:43:05 +01:00
Pieter-Jan Briers
8e5eb6ebbb Version: 0.7.12 2021-11-28 23:14:42 +01:00
Pieter-Jan Briers
87ef010348 Remove another NativeLibrary.Load -> exception catch.
This time with Optimus stuff.
2021-11-28 23:13:50 +01:00
wrexbe
229d1c248b Make benchmark debuggable (#2285) 2021-11-28 23:11:58 +01:00
wrexbe
8db606c4e4 Remove duplicate PluralRules.Generator in RobustToolbox.sln (#2286) 2021-11-28 23:03:46 +01:00
Pieter-Jan Briers
6b5181269b Do some trimming for client publishes.
Almost completely removes TerraFX and OpenToolkit.Graphics from client publishes size wise. This cuts publish size in half.
2021-11-28 22:26:05 +01:00
Pieter-Jan Briers
17b84c3520 Update to latest TerraFX, compile custom swapchain ANGLE in. 2021-11-28 22:12:17 +01:00
Pieter-Jan Briers
42875fc101 Remove RobustTaskScheduler entirely.
No longer necessary thanks to #2263.
2021-11-28 15:09:01 +01:00
wrexbe
72a7bc2ae7 Unwrap ParsedMain (#2263) 2021-11-28 15:07:25 +01:00
Leon Friedrich
bef4f75419 Fix AudioParams DataDefinition (#2283) 2021-11-28 15:00:23 +01:00
metalgearsloth
216509f89d Fix multi-subscriber crash for PVS (#2282) 2021-11-28 13:22:13 +01:00
20kdc
b7991204f1 Cleanup NativeLibrary.Load usages by replacing them with TryLoad (#2259)
Co-authored-by: Paul Ritter <ritter.paul1@googlemail.com>
2021-11-28 00:41:53 +01:00
metalgearsloth
02987ac703 Update some hotpaths to use new transform method (#2281) 2021-11-28 00:41:08 +01:00
ike709
5cf8cb262f Updates cefglue (#2258)
Co-authored-by: ike709 <ike709@github.com>
2021-11-28 00:40:10 +01:00
metalgearsloth
49dfca169c Add scale command (#2256) 2021-11-28 00:38:41 +01:00
Acruid
33008a2bce Cannot use 'System.Runtime.CompilerServices.DefaultInterpolatedStringHandler' as a type argument 2021-11-26 19:24:31 -08:00
Acruid
c2e90132c0 Makes the scene command actually check for scene types instead of trying to instantiate random classes like ecs event args. 2021-11-26 08:30:18 -08:00
Vera Aguilera Puerto
9859b5b090 IConsoleCommands get dependencies injected by default now. (#2264)
As the DI gods intended.
2021-11-26 02:28:07 -08:00
metalgearsloth
20aec0a8f9 Add method to get worldpos and worldrot at the same time (#2226)
* Add method to get worldpos and worldrot at the same time

Somewhat of a gain because it halves the number of GetComponent<TransformComponent> + _parent.IsValid() calls

* Remove redundant methods

* Also inverse

* Test

* Import

* Add benchmark

* Delete benchmark
2021-11-26 01:47:51 -08:00
Vera Aguilera Puerto
a9ee78e40d MIDI player looping fix.
SetLoop sets the amount of times to loop a song. If you set it to 1, it'll loop once, if you set it to -1, it'll loop infinitely. This should have been 0 from the start, so it doesn't loop when disabled.
2021-11-25 15:06:55 +01:00
Vera Aguilera Puerto
69f36aac6f Add ToPrettyString method to EntityManager (#2257) 2021-11-24 12:04:18 +01:00
Pieter-Jan Briers
173b41ab9e Send level as log label again in loki. 2021-11-24 08:36:01 +01:00
Vera Aguilera Puerto
7796d7f065 IEntityManager.Clear() actually drops entity system as its xmldoc says. 2021-11-23 11:07:16 +01:00
metalgearsloth
175c111be9 Version: 0.7.11 2021-11-23 18:21:23 +11:00
Acruid
279cc0f83f AppearanceComponent Cleanup (#2253) 2021-11-23 18:16:37 +11:00
DrSmugleaf
b334d927a5 Version: 0.7.10 2021-11-22 19:02:28 +01:00
Vera Aguilera Puerto
bdb9b9af2b Remove PlayerHelpers static class. 2021-11-21 17:58:54 +01:00
Pieter-Jan Briers
5aa634b5eb Don't enable Lidgren UPnP support unless requested.
It wasn't being *used* but discovery was still happening, so...
2021-11-21 17:15:08 +01:00
Javier Guardia Fernández
60d7430fe7 Whitelist CallerArgumentExpressionAttribute, InterpolatedStringHandlerAttribute and IsByRefLikeAttribute (#2251) 2021-11-21 16:04:00 +01:00
Pieter-Jan Briers
a9aeff9b78 Version: 0.7.9 2021-11-21 15:20:41 +01:00
20kdc
e7a0409645 Status host uses net.port by default, add UPnP port forwarding option (#2237)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2021-11-21 15:19:39 +01:00
ShadowCommander
3e718575ff Change Button Pressed to work with non-focus keybinds (#1978) 2021-11-21 14:52:41 +01:00
Acruid
746ec9eab7 Marked PlayerSession find methods on PlayerManager Obsolete (#2244) 2021-11-21 14:51:17 +01:00
Pieter-Jan Briers
60e6ecb0cc Fix loading of command binds from keybinds file. 2021-11-21 14:48:17 +01:00
metalgearsloth
3a00e0d497 Expose physics contacts as an enumerable (#2250) 2021-11-21 18:41:12 +11:00
Leon Friedrich
24a5020b42 fix rotated box contains (#2248) 2021-11-19 22:59:49 -08:00
20kdc
bbb9e94ce9 Arbitrary occluder rotation (#2218)
* All forms of rotated occluders now work

* Utility getters for vector CW/CCW rotations
2021-11-19 15:09:45 -08:00
pointer-to-null
2bea9576f0 Public FpsCounter class. (#2246) 2021-11-19 15:00:14 -08:00
Tomeno
6e0be2b8c9 Clear placementManager when searching/clearing/closing window (#2245)
Co-authored-by: Tomeno <tomeno@lulzsec.co.uk>
2021-11-19 17:46:40 +01:00
Vera Aguilera Puerto
0a348dd1be Version 0.7.8 2021-11-18 19:34:43 +01:00
metalgearsloth
a95283913b Optimise broadphase a LOT for grids moving (#2243)
Previously it went through the entire movebuffer. Now it just uses the localbounds.
2021-11-18 15:40:28 +01:00
metalgearsloth
ebc73a71c2 Optimise GetBroadphases (#2242)
* Optimise GetBroadphases

Only used in public APIs. Should be significantly faster as it doesn't iterate every fixture on a grid.

* Fix the staged stuff
2021-11-18 15:24:18 +01:00
metalgearsloth
05321f0381 Miscellaneous fixes for thrusters (#2239) 2021-11-17 22:42:00 +01:00
Javier Guardia Fernández
6554144c42 Add CollectionsMarshal.AsSpan<T>(List<T>) to the sandbox whitelist (#2241) 2021-11-17 22:37:57 +01:00
20kdc
28e6cdc92f Clyde audio cleanup & fallback if audio device is not available (#2240) 2021-11-17 14:18:04 +01:00
metalgearsloth
2ec715b70e Remove fixture removal error
Client can predict these removals so it just spams the log.
2021-11-17 22:25:36 +11:00
Acruid
424e0768c8 Fixed some code that I forgot to change to help IoC instantiate protected constructors. 2021-11-17 03:10:12 -08:00
Acruid
e1b9327ec0 Misc Engine Tweaks (#2238) 2021-11-17 09:39:18 +01:00
Flipp Syder
80308a799f Adds collapsible widgets (#2199)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2021-11-16 19:09:59 +01:00
20kdc
e30f8f3e69 Async status host handlers to reduce ACZ stalling (#2235) 2021-11-16 13:27:29 +01:00
20kdc
302b910cf3 ACZ: Work around exception handling issues in ManagedHttpListener (#2236) 2021-11-16 13:26:10 +01:00
Pieter-Jan Briers
5a6a16e7dc Upgrade Loki sink to 4.0.0-beta3.
This fixes many bugs with it.
2021-11-15 13:42:19 +01:00
Pieter-Jan Briers
8d84c56a72 Remove testing profile opt stuff. 2021-11-15 11:32:51 +01:00
Pieter-Jan Briers
13f821be5f Grid entity deletion, attempt two.
Previous attempt broke an integration test.
2021-11-15 11:06:30 +01:00
Pieter-Jan Briers
d647ab1c61 Fix some warnings. 2021-11-15 10:53:39 +01:00
Pieter-Jan Briers
b902ef290a Fix directly deleting grid entities.
A bad return statement meant that the associated grid was not being properly deleted.

This fix means the game won't effectively crash PVS if a grid entity is directly deleted.
2021-11-15 10:49:05 +01:00
Pieter-Jan Briers
058d897529 Version: 0.7.7 2021-11-15 02:43:49 +01:00
Javier Guardia Fernández
8e173a7a18 Fix FormattedMessage serialization and add tests (#2233) 2021-11-15 02:42:47 +01:00
20kdc
5443f77526 Automatic Client Zipping (#2225) 2021-11-15 02:42:20 +01:00
20kdc
b406526592 Version update and tag script (#2234) 2021-11-15 02:18:20 +01:00
Pieter-Jan Briers
48697da450 Add version to Robust.Engine.props 2021-11-14 22:46:13 +01:00
Javier Guardia Fernández
06f20ea722 Add a method to get a FormattedMessage with markup tags included (#2223) 2021-11-14 19:42:36 +01:00
metalgearsloth
427378f94d Optimise physics broadphase cache (#2224) 2021-11-14 19:42:02 +01:00
Vera Aguilera Puerto
6cf5021efa Add Resolves to IoCManager and EntitySystemManager (#2231) 2021-11-14 19:41:34 +01:00
Tomeno
ad9bda2efe Adds setters on SS14Window for styling header & title (#2232)
Co-authored-by: T <tomeno@lulzsec.co.uk>
2021-11-14 19:19:12 +01:00
Pieter-Jan Briers
f0bf251acf Improve IUserInterfaceManager.RootControl comment 2021-11-14 19:08:14 +01:00
Pieter-Jan Briers
21f5fed32f Fix IsVisibleInTree calculation with secondary window roots 2021-11-14 19:08:14 +01:00
metalgearsloth
cc67a47c32 Pass around filter dependencies (#2228) 2021-11-14 02:08:09 +01:00
Javier Guardia Fernández
e78e7bacfe Add bool Contains(string, System.StringComparison) to the whitelist (#2230) 2021-11-14 01:37:33 +01:00
Vera Aguilera Puerto
6301008ac3 Revert "adds required check to the yamllinter (#2216)"
This reverts commit 772076826a.
2021-11-12 11:27:53 +01:00
Pieter-Jan Briers
dfd572a0aa Change Microsoft.Data.Sqlite reference to SQLitePCLRaw.bundle_e_sqlite, use version to fix .NET 6 build thing. 2021-11-11 18:23:16 +01:00
Pieter-Jan Briers
97fab99971 You can now bind console commands to keybinds. 2021-11-11 18:05:08 +01:00
Pieter-Jan Briers
25d6bd908b Remove BGRA32 uploads from Clyde.
BGRA uploads are not supported on GLES. Use a shader to swizzle WebViewControl contents instead.
2021-11-11 18:05:04 +01:00
Pieter-Jan Briers
fd5a8bf207 Fix GLContextAngle unbinding GL context when resizing secondary windows. 2021-11-11 18:05:03 +01:00
Paul Ritter
772076826a adds required check to the yamllinter (#2216)
Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
2021-11-11 17:39:41 +01:00
Vera Aguilera Puerto
52d669e032 Fixes exceptions on shutdown. (#2219) 2021-11-11 17:39:25 +01:00
metalgearsloth
75fc9089c3 Add weld joints and other misc changes for docking (#2197) 2021-11-11 19:54:08 +11:00
Kara D
0972601a43 Revert "entity creation crash fixes"
This reverts commit 603c252c48.
2021-11-10 12:09:31 -07:00
Paul
603c252c48 entity creation crash fixes 2021-11-10 18:57:47 +01:00
Paul
d5b1c044b7 fixes the crash for realsies 2021-11-10 18:34:21 +01:00
metalgearsloth
4600f0531d Fix centre of mass (#2212) 2021-11-10 17:25:38 +01:00
Leon Friedrich
c88498eca9 Add function to directly perform lookups using an EntityLookupComponent (#2200) 2021-11-11 01:12:49 +11:00
Paul Ritter
f15f1eb345 adds gridremovalevent (#2201)
Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
2021-11-10 23:27:11 +11:00
Pieter-Jan Briers
5be3ced05a UI scaling for WebViewControl. 2021-11-10 11:57:58 +01:00
Pieter-Jan Briers
7f03e88e97 OSWindow not adjusts SetSize when window is resized. 2021-11-10 11:57:12 +01:00
Pieter-Jan Briers
8e3fa3e52d Pass + as command line arg to client/server to execute commands after init. 2021-11-10 02:01:31 +01:00
metalgearsloth
f9ae3e1fc2 Significantly optimise server when PVS disabled (#2196) 2021-11-10 01:38:37 +01:00
mirrorcult
bf9e95fa8a Update README.md 2021-11-09 17:21:37 -07:00
ZorenZal
030a7d265b Added set English language checkbox (#2136) 2021-11-10 01:12:36 +01:00
Pieter-Jan Briers
df70e94743 ununupdated comment 2021-11-10 01:09:06 +01:00
metalgearsloth
d68cd4d7eb Add overlay for physics COM (#2210) 2021-11-10 01:05:08 +01:00
Pieter-Jan Briers
d098881bff Make BVH tree expansion exponential.
Fixes #2215
2021-11-10 00:59:53 +01:00
ike709
b8fbe32c27 Bump Robust.Client.WebView TargetFramework to .NET 6 (#2214) 2021-11-09 20:17:37 +01:00
Pieter-Jan Briers
02d2bd31e7 Update Lidgren submodule; re-enable encryption. 2021-11-09 19:34:55 +01:00
Pieter-Jan Briers
bd0dba0df0 Disable network encryption to bandaid it for .NET 6. 2021-11-09 18:07:59 +01:00
Pieter-Jan Briers
17164ead34 Fix release compile. 2021-11-09 15:35:37 +01:00
Vera Aguilera Puerto
079e099a3b Makes many things use OwnerUid instead of Owner.Uid 2021-11-09 15:11:02 +01:00
Javier Guardia Fernández
1c8ed1c5b2 Update to .NET 6 and C# 10 (#2211)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2021-11-09 14:59:19 +01:00
Vera Aguilera Puerto
d4cdb7ff3b Tumbler command uses EntityUid 2021-11-09 13:02:01 +01:00
Vera Aguilera Puerto
31d301b91f ActorSystem and PlayerSession partially use EntityUid
Non-breaking changes
2021-11-09 12:54:18 +01:00
Vera Aguilera Puerto
07c65474cb LocalPlayer EntityUid 2021-11-09 12:38:25 +01:00
Vera Aguilera Puerto
8c3c8fceea ViewSubscriberSystem uses EntityUid for everything 2021-11-09 11:37:31 +01:00
Vera Aguilera Puerto
ee894d8a8e Move the last responsabilities from Entity to EntityManager. 2021-11-08 16:09:12 +01:00
Vera Aguilera Puerto
ce169ed15e Move LastModifiedTick out of Entity and into MetaDataComponent. (#2209) 2021-11-08 15:56:49 +01:00
Vera Aguilera Puerto
9b215098e4 Remove ITransformComponent. 2021-11-08 12:49:55 +01:00
Vera Aguilera Puerto
78d01fd25d Remove every ITransformComponent usage. 2021-11-08 12:44:03 +01:00
Vera Aguilera Puerto
8e8bfbe0cc Obsolete ITransformComponent 2021-11-08 12:28:49 +01:00
Vera Aguilera Puerto
45b0a49ffb Fix build 2021-11-08 12:23:22 +01:00
Vera Aguilera Puerto
58638c9109 Make TransformComponent public, IEntity keeps a reference to TransformComponent. 2021-11-08 12:21:34 +01:00
Vera Aguilera Puerto
2f2a397ecf Fix TransformComponent access modifiers (#2207)
Part 1 of ITransformComponent removal.
2021-11-08 12:18:53 +01:00
Vera Aguilera Puerto
78c551d854 Remove DummyIconEntity, use actual entities instead. (#2206) 2021-11-08 12:17:13 +01:00
Azzy
679e07d9ea Fixes ViewVariables sprite rotation bug (#2202) 2021-11-07 18:47:27 +11:00
DrSmugleaf
fa5d0235ec Prepend Client and Server to tests ran message 2021-11-06 11:42:01 +01:00
Javier Guardia Fernández
04d029b9a2 Add test pooling (#2146)
* Add test pooling and global test setup

* WIP test pooling changes

* Make asynchronous tests the default again

* Finish fixing tests, make test threads background threads

* Un-pool tests with custom cvars

* Fix not changing FailureLogLevel cvar on instance return

* Fix error when overriding already overriden cvar

* Don't pool some physics integration tests

* Unpool engine tests, the technology just isn't there yet

* Remove explicit Pool = false from physics tests

* Change default pooling setting to false

* Didn't need this anyway

* Remove ConfigurationManager.ResetOverrides

* Bring back enum cvar override parsing

* Make integrationInstances name clearer > notPooledInstaces
Make clients ready and servers ready internal

* Add logging test instances

* Give more info on ran tests

* Show total clients and servers in test output

* Wipe LayerMap on SpriteComponent.AfterDeserialize

* Fix server not properly kicking clients

* Rider shut

* Make all test metrics report totals

* Format tests ran better

* Replace Console.WriteLine with TestContext.Out.WriteLine

* Fix two server test pooling info prints using total clients instead of total servers

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
2021-11-06 11:18:18 +01:00
Pieter-Jan Briers
6e84821233 Package CEF as NuGet package, does not need to be manually downloaded anymore. 2021-11-05 14:50:47 +01:00
Pieter-Jan Briers
881cfeb9a9 Small IRawInputControl doc. 2021-11-05 14:50:47 +01:00
Pieter-Jan Briers
0187e85700 Eye offset no longer offsets FOV.
This means camera recoil in SS14 won't clip into walls.
2021-11-04 17:37:00 +01:00
Pieter-Jan Briers
dee8a87acd Use headless WebViewManager on headless clients. 2021-11-03 15:26:52 +01:00
Pieter-Jan Briers
d4a7e8f3e0 Move CEF RequestResult to correct folder. 2021-11-03 15:14:46 +01:00
Pieter-Jan Briers
dae6424667 Allow swapping out internal WebViewManager implementation.
Everything moved to interfaces.
2021-11-03 15:12:49 +01:00
Pieter-Jan Briers
3770149cfc Update CefGlue 2021-11-03 15:03:25 +01:00
Alex Evgrashin
341c279265 Bandaid sprite animation in SpriteView (#2181) 2021-11-02 19:50:29 +01:00
metalgearsloth
37c20723ab Add WorldBounds as an arg for overlays (#2190) 2021-11-02 18:00:06 +01:00
ike709
c3e4a64ad7 Makes client connection timeout a cvar (#2186) 2021-11-02 17:56:17 +01:00
metalgearsloth
225446920a Make transform delete entity if parent invalid (#2193) 2021-11-02 17:54:48 +01:00
Saphire Lattice
9b2a50b1a8 Make camera lerp towards the grid rotation, and keep rotation when stepping off onto the world grid (#2187)
* Make camera lerp towards the grid rotation, and keep rotation when stepping off onto the world grid

* Fix lerp targeting, add a bunch of comments
2021-11-02 13:49:28 +01:00
metalgearsloth
b4ed513e8c Optimise anchor snap 2021-11-02 16:55:12 +11:00
20kdc
c28f2d77c3 Placement Manager: Spin Cycle 2 (#2184) 2021-11-02 16:21:03 +11:00
metalgearsloth
3e344d00a8 Move PVS to a system (#2189) 2021-11-02 16:19:11 +11:00
moonheart08
c321400347 Fix savemap/loadmap arguments. (#2055) 2021-11-02 16:07:31 +11:00
metalgearsloth
a4ff5d65ec Dirty changes (#2174) 2021-11-02 16:05:45 +11:00
Pieter-Jan Briers
97c70124a5 [CEF] properly close streams when loading from res:// and such. 2021-11-02 01:53:38 +01:00
Pieter-Jan Briers
cdcc5239ab Rename WebView control to WebViewControl to avoid namespace name clash. 2021-11-01 21:06:30 +01:00
Pieter-Jan Briers
ba2f464249 Restructure CEF stuff in preparation for launcher packaging.
Robust.Client.CEF Renamed to Robust.Client.WebView since CEF should really be an implementation detail.
Content is no longer responsible for initializing and managing the module, this is done automatically by the engine.
WebView is initialized by declaring it in a manifest.yml file in the game resources. In the future the launcher will read this same file to manage WebView module versions.
CefManager has been made private and the content-visible API is now IWebViewManager.
2021-11-01 21:03:51 +01:00
Paul
4210f30460 fixes positional audio not accounting for rotation 2021-10-31 22:49:05 +01:00
moonheart08
9fc95591d9 Introduce BQLv2, part 1 (#2170) 2021-10-31 20:23:13 +01:00
E F R
0a59079a4a Graphics: add a Font variant that supports font stacking (#2182) 2021-10-31 14:48:58 +01:00
20kdc
89f168c04d Improves PlacementManager (construction/etc.) handling of parent world rotation (#2165) 2021-10-31 14:47:18 +01:00
Visne
f11ac39cd5 Fix all warnings (#2171) 2021-10-31 12:22:58 +01:00
metalgearsloth
380de8c4c3 Expose OwnerUid on Component (#2183) 2021-10-31 11:35:21 +01:00
Vera Aguilera Puerto
539c161ea3 Fix client build when scripting is disabled. 2021-10-31 10:55:31 +01:00
metalgearsloth
b07187459b Fix physics for invalid parents 2021-10-31 15:24:12 +11:00
Pieter-Jan Briers
97fb54b6d7 Registry based HWIDs for Windows. 2021-10-30 14:21:23 +02:00
wixoa
fe30d974ca Add ImageSharp's Image.Load<>() to the sandbox (#2179) 2021-10-30 13:26:42 +02:00
E F R
884fade25a Add tab "completion" for the server-side C# console (#2176) 2021-10-30 13:26:23 +02:00
Pieter-Jan Briers
a3ab745121 Fix debug console not animating when dropping down for the first time. 2021-10-29 17:41:51 +02:00
ShadowCommander
4e0ad23272 Fix sound orientation when eye is rotated (#2177) 2021-10-29 16:49:16 +02:00
Vera Aguilera Puerto
b9b9cd0711 Revert "Fix PVS crash (#2173)"
This reverts commit b05b1a7c86.
2021-10-28 17:58:23 +02:00
metalgearsloth
b05b1a7c86 Fix PVS crash (#2173) 2021-10-29 01:26:39 +11:00
Visne
4ced901358 Remove SpriteComponent.Directional (#2172) 2021-10-28 13:20:06 +02:00
metalgearsloth
898d5a3ba5 Spaghettifix GetEntitiesIntersecting (#2167) 2021-10-27 08:55:24 +02:00
Visne
068c05c355 Use enum for access level in XamlUiPartialClassGenerator (#2161) 2021-10-27 08:52:09 +02:00
Saphire Lattice
cd693875e6 Fix resizing (#2160)
* Fix resizing moving the window beyond its minimum size and causing it to move visually

* Do a NaN-check the SetSize when resizing

* Use float instead to avoid conversion

As per PJB3005's suggestion

Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>

Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>
2021-10-27 12:45:36 +11:00
20kdc
e2723a83b3 Revert "Technically fixes lathes, but not properly, but doesn't make things worse." :D (#2166)
This reverts commit cb19430d5c.
2021-10-27 12:44:34 +11:00
20kdc
f6ac8fbe1f Expose the Box2Rotated intersecting function in IEntityLookup for Content use (#2164) 2021-10-26 00:27:55 +11:00
metalgearsloth
a1e0f18bd6 Add Box2Rotated support to EntityLookup (#2163) 2021-10-25 15:00:18 +02:00
moonheart08
1e7a481911 better spawn command (#2156)
* better spawn command

* Update Robust.Server/Console/Commands/SpawnCommand.cs

Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com>

* Update Robust.Server/Console/Commands/SpawnCommand.cs

Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com>

* ok help

this is a web edit, sue me!

Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com>
2021-10-24 22:15:47 -07:00
ShadowCommander
331f14b31a Fix audio warnings (#2158) 2021-10-24 23:43:04 +02:00
metalgearsloth
88660e1958 Use layer rotations for sprites (#2159) 2021-10-24 23:42:43 +02:00
Visne
d9af00c931 Make autogenerated XAML UI fields access level settable (#2148)
* Make autogenerated XAML fields public instead of protected

* Make field always public, remove stray commented out code

* Remove encapsulation for previously protected XAML UI fields

* Make access level settable

* Set access to public for DebugConsole LineEdit

* Address reviews and add documentation

* Remove documentation

* Address reviews
2021-10-24 23:20:27 +02:00
ShadowCommander
b8cb037151 Fix _enableAllKeybinds buttons breaking due to Use (#2157) 2021-10-24 01:43:46 -07:00
20kdc
32d8bd8600 Apply MIDI volume properly on initializtion of FluidSynth (#2153) 2021-10-24 00:12:30 +02:00
mirrorcult
f5a1e06f21 Merge pull request #2051 from Visne/sizeflags
Remove SizeFlags
2021-10-23 15:00:49 -07:00
Visne
48a5cb75d6 Restart tests 2021-10-23 23:54:55 +02:00
E F R
3e6b5a7739 UserInterfaceSystem: fail gracefully if the ClientUserInterfaceComponent goes away (#2155) 2021-10-23 19:38:44 +02:00
ShadowCommander
9ac0aa4cd6 Improve tpto (#2150)
Add teleporting other players to a target player
2021-10-23 10:22:40 -07:00
metalgearsloth
50fb8ca9e5 Fix sprite rounding issues (#2152)
* Fix sprite rounding issues

Should fix all of the issues at exactly 45 degrees

* Do Paul's review
2021-10-23 23:48:26 +11:00
metalgearsloth
7da89765ac Fix half of 45 degree sprite issues 2021-10-23 14:43:27 +11:00
Vera Aguilera Puerto
ce58c6688f Fix rare exception with QueueDelete modified collection
Now we use an actual queue for the deletion order, and the hashset for occupancy.
2021-10-23 00:08:04 +02:00
Vera Aguilera Puerto
2f03640200 Removing a component from an entity removes & deletes it immediately. (#2151) 2021-10-22 23:38:37 +02:00
20kdc
55fecc95a9 MIDI VolumeBoost property (#2141) 2021-10-22 09:09:24 +02:00
Alex Evgrashin
8b54ad79cf Int slider with input field (#2142) 2021-10-22 09:07:45 +02:00
Vera Aguilera Puerto
88dec23a03 Fix wrong logic with protected component removal, use fancy pattern. 2021-10-21 15:10:38 +02:00
20kdc
079702347d Show current rotation in entity spawn window (#2129) 2021-10-21 14:24:56 +02:00
metalgearsloth
d18bf3d5ac Force joint bodies awake
Woops
2021-10-21 20:47:17 +11:00
Pieter-Jan Briers
ed832748b1 list command now shows client commands again. 2021-10-21 01:39:16 +02:00
metalgearsloth
6491e51f3d Reduce FindGridsIntersecting allocations (#2119)
* Reduce FindGridsIntersecting allocations

I love struct enumerators

* Do slightly smarter pooling in EntityViewCulling

Even more alloc reductions

* Forgot to re-add this pooling

* Fix missing chunks
2021-10-19 13:30:52 +11:00
Pieter-Jan Briers
58e7fb3a17 Work around PEReader crashes on Linux.
Fixes #2130
2021-10-18 14:11:07 +02:00
mirrorcult
a9c7926226 Merge pull request #1942 from ShadowCommander/fix-sound
Change Audio to also use Grid Coordinates as a fallback
2021-10-18 00:28:11 -07:00
metalgearsloth
241dc0b752 Remove empty joint components (#2139) 2021-10-17 22:45:15 +02:00
Javier Guardia Fernández
566948f1c0 Add a virtual array of assemblies for SerializationTest to load so content can use it (#2137) 2021-10-16 15:38:18 +02:00
Javier Guardia Fernández
dbba440f7e Fix deserializing null structs (#2138)
* Fix deserializing null structs

* Fix deserializing for not nullable structs

* Add tests
2021-10-16 15:38:06 +02:00
Vera Aguilera Puerto
5b1e9eec27 Fixes component deletion/removal not being synced with clients. (#2128) 2021-10-15 23:52:09 +02:00
Pieter-Jan Briers
8ef95f0199 Update Lidgren 2021-10-15 15:59:44 +02:00
Leon Friedrich
b71e8f140a fix GridTileToWorldPos (#2134) 2021-10-15 22:59:44 +11:00
metalgearsloth
f8397099de Add a good GetCollidingEntities method that takes in body 2021-10-15 13:40:08 +11:00
metalgearsloth
5bbf1703ac Hack to avoid eye flicker on parent change 2021-10-15 11:55:47 +11:00
metalgearsloth
1357e38759 Fix controlmob crash (#2133) 2021-10-15 11:01:35 +11:00
Pieter-Jan Briers
655ecbab45 Update Lidgren submodule 2021-10-14 19:18:35 +02:00
Vera Aguilera Puerto
a0ef63bd4a Makes RemoveComponentImmediate more like RemoveComponentDeferred. (#2126)
- Exception tolerance added
- UID is now passed in the arguments
- Is able to remove protected components if needed.
- Actually calls `ComponentDependencyManager` to let it know the component has been removed.
2021-10-14 00:41:57 +02:00
Pieter-Jan Briers
f34763f11e Don't pack natives with engine client builds.
These are never used by the launcher due to the deployment model, so removing these saves quite a few megabytes.
2021-10-13 20:13:59 +02:00
Pieter-Jan Briers
b1f6b4cbe0 Remove .appveyor.yml
I doubt we'll ever use appveyor again, so...
2021-10-13 15:56:32 +02:00
Pieter-Jan Briers
94708881b3 Update Lidgren.
Optimizes Socket usage to remove allocations, minor bugfixes.
2021-10-13 15:55:04 +02:00
metalgearsloth
0f6dbac51c Fix gridbuffer broadphase (#2116)
It's for shuttle movement; it's getting bulldozed someday anyway but this fixes it.
2021-10-13 11:16:06 +11:00
metalgearsloth
e67de121ca Use spans for chunk mesh (#2124) 2021-10-11 17:06:21 +02:00
20kdc
17979db216 Technically fixes lathes, but not properly, but doesn't make things worse. (#2123)
I am aware this PR is terrible, but you saw what happened to the proper fix.
2021-10-11 16:10:38 +02:00
Pieter-Jan Briers
8d0070b5c3 Add IsUiOpen helper to UISystem. 2021-10-11 01:50:34 +02:00
Pieter-Jan Briers
034c392cbe Add GetComponentOrNull extension method. 2021-10-11 01:37:19 +02:00
Pieter-Jan Briers
160bbc3a72 Fix layout of entity spawn window. 2021-10-11 01:36:59 +02:00
metalgearsloth
3a4d228e94 Fix container manager deserialization 2021-10-11 02:56:37 +11:00
metalgearsloth
57f57f9d9f Fix PVS dumbdumb (#2122)
Was wondering why this was showing up on the profiler, woops
2021-10-11 02:27:04 +11:00
ShadowCommander
0592444252 Merge branch 'fix-sound' of github.com:ShadowCommander/RobustToolbox into fix-sound 2021-10-10 02:26:00 -07:00
ShadowCommander
d8499f2e60 Merge branch 'master' into fix-sound 2021-10-10 02:24:55 -07:00
metalgearsloth
476b5182f8 Fix y-sorting on rotated grids 2021-10-10 17:36:51 +11:00
metalgearsloth
6c7ab1bd82 Add AABBs to the physics debug drawing 2021-10-10 16:54:22 +11:00
metalgearsloth
526ed31b0d Re-parent unanchored entities (#2046) 2021-10-10 14:27:19 +11:00
metalgearsloth
3ac5552276 Cache more broadphase stuff internally (#2071)
* Don't generate physics contacts for non-predicted bodies

These are all just handled on the server anyway so it's a significant waste of performance on the client for busy scenes.

* Significantly optimise broadphase updates

Cache all of the broadphase data properly now and also save the cache for physics step to boot.

* Fix cross-map broadphases

* Remove unnecessary clear

* fix

* Fixes

* Numerous ray fixes
2021-10-10 14:18:10 +11:00
Flipp Syder
7a51c22514 Fixes SpriteComponent.AddLayer for specific RSI definition (#2115) 2021-10-09 20:21:12 +02:00
metalgearsloth
aa339eb504 Add component that toggles collision on anchoring (#2113) 2021-10-09 18:27:31 +02:00
mirrorcult
ffb3800664 Opt out of shadow casting for some lights (#2085)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2021-10-09 18:21:22 +02:00
Pieter-Jan Briers
39eb1a7d75 Clyde RenderOverlays now calls FlushRenderQueue.
This fixes association of API calls with the correct debug groups, and reduces (error prone) boilerplate.
2021-10-09 18:20:37 +02:00
20kdc
c25ab2fcb1 Fix FOV wall shadowing not working properly due to broken fov-lighting (#2114) 2021-10-09 17:27:36 +02:00
Vera Aguilera Puerto
22e0fbc6c1 The descendants of my friends are also my friends! Improves FriendAnalyzer.
In short, if you specify a shared type as a friend, any inheriting types will also count as friends, automatically. This could be abused but... That's why "sealed" exists, r-r-right?
2021-10-09 16:04:09 +02:00
Paul Ritter
72071826a4 fix placement grid (#2072) 2021-10-09 15:19:06 +02:00
Pieter-Jan Briers
8b9c1ab9a1 Fix warnings in Robust.Client 2021-10-09 15:08:08 +02:00
Vera Aguilera Puerto
16d5da5414 Check that parent uid is valid before dirtying oneself. 2021-10-09 12:41:57 +02:00
mirrorcult
39f82694bf Merge pull request #2111 from 20kdc/krakensbane-for-workgroups-8p6-focus
Stop spinning from messing as much with shadows
2021-10-08 16:28:50 -07:00
20kdc
79c3c09851 Stop spinning from messing as much with shadows
Shadows now seem to remain pretty stable up to the point where nothing is stable.
Sounds good to me.

Now, I know what you're going to say. "But, but, Kraken *fren*!"
*sighs* No. Kraken BAD. Kraken harm spesspeople.
2021-10-08 21:08:42 +01:00
Leon Friedrich
ad7370f0b3 Add option to make ScrollContainer return size. (#2107) 2021-10-08 16:01:01 +02:00
Pieter-Jan Briers
75cd8a0a12 Fix primitive restart on GLES3.
Was detected as incorrect version and didn't distinguish the difference between FixedIndex and not.
2021-10-08 14:54:53 +02:00
Ygg01
915a812832 Add extra helpers to Direction (#2093) 2021-10-08 13:34:45 +02:00
metalgearsloth
c8e7fe9f1f Reduce angular sleep tolerance even more 2021-10-08 18:34:48 +11:00
metalgearsloth
9803ed9cad Bandaid entity deletion entitylookup (#2102) 2021-10-08 09:14:19 +02:00
Leon Friedrich
f5f8a59c86 Add can-see / visibility function to ContainerHelpers (#2105) 2021-10-08 09:12:34 +02:00
20kdc
f4e3dfa601 Fix FOV shader to allow for s p i n (#2103) 2021-10-08 09:04:21 +02:00
metalgearsloth
9305b261bb Decrease angular sleep tolerance 2021-10-08 14:15:54 +11:00
ike709
3a161af4a5 Changes cefglue to use our fork (#2097)
Co-authored-by: ike709 <ike709@github.com>
2021-10-07 22:08:22 +02:00
Vera Aguilera Puerto
0447d8d3b9 Fix typo in BaseServer comment 2021-10-07 11:17:40 +02:00
ike709
c2eed5c007 Update the comments related to the CEF binary (#2098) 2021-10-07 09:53:14 +02:00
metalgearsloth
d9464e2621 Fix rotated grid collision (#2100) 2021-10-07 13:29:13 +11:00
Swept
1a70813f3c Merge pull request #2099 from 20kdc/oh-my-goodness-were-doomed 2021-10-06 18:45:20 -07:00
20kdc
a3a69f821f Revert "Fix stuck lathes properly. (#2091)" b/c of "Tried to overwrite a protected component." errors
This reverts commit a60993c60d.
2021-10-07 02:23:57 +01:00
Pieter-Jan Briers
c72988b05b Fix TickUpdate not firing on client when prediction is off. 2021-10-06 23:09:49 +02:00
ike709
11bc9c0fe4 Adds everything else OpenDream needs to the sandbox (#2060) 2021-10-06 22:50:37 +02:00
Pieter-Jan Briers
98593b7b33 NetListAsArray uses span instead of array now. 2021-10-05 15:22:46 +02:00
Vera Aguilera Puerto
4b30a94126 EntityManager SpawnEntity overloads consistently run map init on entities.
Fixes #2092
2021-10-05 14:44:43 +02:00
Pieter-Jan Briers
1c8958d312 Reduce .ToArray() in PVS with NetListAsArray<T>. 2021-10-05 14:37:39 +02:00
Pieter-Jan Briers
ef2f81a77a Update NetSerializer and Lidgren submodules.
Lidgren has slightly better buffer management, NetSerializer has NetListAsArray<T>.
2021-10-05 14:37:39 +02:00
Vera Aguilera Puerto
3935c63a80 EntityManager Initialized set by Initialize() method and not InitializeComponents() 2021-10-05 11:40:19 +02:00
Vera Aguilera Puerto
76ab68dc3d SharedContainerSystem proxy methods use UID to add components.
- Also disables logging missing comps on TryX methods.
2021-10-05 11:34:59 +02:00
Vera Aguilera Puerto
a986292aa2 Fix EntityManager.InitializeEntity being static for no reason at all.
- Also fixes `EntityInitialized` not being invoked on many cases. (On the client, on entities created by `ClientGameStateManager`, for example...)
2021-10-05 10:59:15 +02:00
Vera Aguilera Puerto
082fac52cd Remove redundant deleted entity check. 2021-10-05 10:14:25 +02:00
20kdc
a60993c60d Fix stuck lathes properly. (#2091) 2021-10-04 12:33:35 +02:00
Vera Aguilera Puerto
97ffc9ecc2 Resolves now log errors for missing components. (#2088) 2021-10-04 12:29:39 +02:00
Vera Aguilera Puerto
ab4f2c91b4 Move LifeStage and Paused data to MetaDataComponent. (#2068) 2021-10-04 12:29:13 +02:00
Vera Aguilera Puerto
5f2cc942cb Update UserInterfaceSystem proxies to use resolves. 2021-10-04 12:20:03 +02:00
metalgearsloth
5a343477a9 Joints refactor (#1954)
* feex

* Cleanup

* Remove unneeded matrix

* Fixes

* Fix preprocessor

* localanchor cleanup

* Break this build so I remember to fix it later.

* Fixes

* Woops

* Fixes

* Fixup merge

* Stuff

* Update debug drawing

* Also dis thanks fork

* fren

* More colors

* Default drawing

* Fixes

* reviews
2021-10-04 15:34:15 +11:00
Pieter-Jan Briers
7bc847c9a4 Multithread game state serialization, fix some possible thread bugs.
This won't help too much because serialization is extremely alloc-heavy and it causes tons of GC pressure, so GC will drastically reduce the effectiveness of parallelization. Still helps a bit though.
2021-10-04 02:20:13 +02:00
Pieter-Jan Briers
cfc7f26100 Kick command now handles kick reason better. 2021-10-04 01:45:33 +02:00
Vera Aguilera Puerto
6eb3989362 EyeComponent VisibilityMask is set to 1 by default. 2021-10-03 21:02:27 +02:00
20kdc
04fd324e4a Expose LocalBounds in IMapGrid (for space-wizards/space-station-14#4745 ) (#2090) 2021-10-03 23:49:02 +11:00
Vera Aguilera Puerto
c9e999d024 Adds Write/Copy TypeSerializer methods for base SpriteSpecifier. (#2089) 2021-10-03 13:41:41 +02:00
Vera Aguilera Puerto
243f405bab Add Filter for getting players from entities.
- Also adds method to merge two filters.
2021-10-03 11:57:44 +02:00
metalgearsloth
2353f0ed6f Debugdraw enhancements (#2080)
* Debugdraw enhancements

* Fix up the overlays

* Changes

* Box2D licence

* Update Robust.Client/Console/Commands/PhysicsOverlayCommands.cs

Co-authored-by: Paul Ritter <ritter.paul1@googlemail.com>

* Fix dependency

Co-authored-by: Paul Ritter <ritter.paul1@googlemail.com>
2021-10-03 17:58:08 +11:00
Vera Aguilera Puerto
8be4b39449 Adds utility "PrototypeFlags" collection. (#2074) 2021-10-02 12:14:24 +02:00
Vera Aguilera Puerto
e2c7d95519 Don't make SubscriptionsEnumerator nullable for no good reason. 2021-10-02 11:28:38 +02:00
Vera Aguilera Puerto
0e6c00573f EventTables' "TryGetSubscriptions" doesn't throw anymore when it can't find the uid on the event tables. 2021-10-02 11:26:38 +02:00
Vera Aguilera Puerto
fdcaa83b63 AudioSystem uses TryGet for ITransformComponent. 2021-10-01 12:48:24 +02:00
metalgearsloth
cb1b93e89c Revert this because it makes contacts look like shit 2021-09-30 22:49:37 +10:00
ike709
7d271a83b1 Updates cefglue (#2083)
Co-authored-by: ike709 <ike709@github.com>
2021-09-29 21:35:08 +02:00
Visne
58ea614c1f Specify defaults for alignment explicitly 2021-09-29 19:12:17 +02:00
metalgearsloth
ebaba35e8b Aggressively sleep physics bodies (#2078)
* Aggressively sleep physics bodies

* Fix tests

* Also buff angular damping
2021-09-29 20:06:56 +10:00
Vera Aguilera Puerto
35f4a4b011 Adds OwnerUid property to components. 2021-09-29 11:23:48 +02:00
metalgearsloth
0eebfe6931 Optimise anchored entity states for PVS (#2067) 2021-09-29 10:47:30 +02:00
metalgearsloth
9dafe46552 Don't generate physics contacts for non-predicted bodies (#2070)
These are all just handled on the server anyway so it's a significant waste of performance on the client for busy scenes.
2021-09-29 10:45:43 +02:00
metalgearsloth
b5d3772ef4 Fix items getting stuck awake 2021-09-29 13:59:12 +10:00
metalgearsloth
9baa2e6469 Slight grid fixtures optimisation (#2075) 2021-09-29 00:11:20 +10:00
Vera Aguilera Puerto
87f5c059c4 Remove IComponentManager entirely. 2021-09-28 13:40:48 +02:00
Vera Aguilera Puerto
fbcdd63988 Gets rid of most ComponentManager usages. (#2076)
- Obsoletes more `ComponentManager` fields/properties.
2021-09-28 13:36:18 +02:00
Vera Aguilera Puerto
07542ff6eb Further IComponentManager warning cleanup. 2021-09-28 12:56:12 +02:00
Vera Aguilera Puerto
56dd3ff03b Clean up BaseServer slightly.
- It doesn't CullRemovedComponents twice anymore.
- Remove IComponentManager from it.
2021-09-28 12:42:25 +02:00
Vera Aguilera Puerto
15778d3af4 Fix some warnings regarding IComponentManager. 2021-09-28 12:41:49 +02:00
Vera Aguilera Puerto
0fce2e438a Add EntityUid overloads for SoundSystem, AudioSystem. 2021-09-28 11:41:15 +02:00
Vera Aguilera Puerto
7d39e130f4 Fix bug involving the MapCoordinates SpawnEntity overload.
When you tried to spawn an anchored entity, it wouldn't spawn it in the position you specified, as the entity is anchored...
Now, we forcibly disable anchoring just for moving the entity, and restore the old anchor state when we're done.
Yes, this is a bad solution. No, I don't regret it: We need to get our shit together and have a way to forcibly teleport/move entities that are anchored for things like this.
2021-09-27 20:16:23 +02:00
Vera Aguilera Puerto
85249e7be7 Add Filter overloads for EntityUid. 2021-09-27 14:59:22 +02:00
metalgearsloth
e91ce4c5ad Fix animation crash 2021-09-27 15:29:43 +10:00
metalgearsloth
09fb921f38 Fix occluder edges for grid rotation (#2054) 2021-09-27 14:53:09 +10:00
metalgearsloth
1acad96eff Optimise animations a bit (#2006)
* Optimise animations

L'il bit of ECS at the time.

* Add pointlight event too

* System methods

* Bool flag

* Fix perf problem

* Use RQ
2021-09-27 14:51:10 +10:00
metalgearsloth
3dac144bef Remie is in engine now (#2066) 2021-09-27 14:38:41 +10:00
metalgearsloth
bccda8d87c Fix deleting grid crashing 2021-09-27 09:57:07 +10:00
metalgearsloth
5af8732054 Optimise ServerMapManager GetStateData
Free 4% performance on PVS
2021-09-26 17:10:48 +10:00
metalgearsloth
6f057e0c85 Set capacity for containermanager getcompstate 2021-09-26 16:52:02 +10:00
Paul
d18743a3cc improves vectorserializer copypasta 2021-09-26 02:13:40 +02:00
ike709
c785311a74 Adds support for "1x2" Vector2i serializing (#2065) 2021-09-26 02:04:47 +02:00
Vera Aguilera Puerto
949a584325 Fix missing using directive when EXCEPTION_TOLERANCE is enabled. 2021-09-25 18:31:18 +02:00
Vera Aguilera Puerto
c7461221b9 Merge ComponentManager into EntityManager. (#2064)
* Merge ComponentManager into EntityManager.

* Obsolete IComponentManager.
2021-09-25 18:23:11 +02:00
Pieter-Jan Briers
cd2942a0da Fix splitcontainer layout calculations. 2021-09-25 18:18:33 +02:00
Vera Aguilera Puerto
0b8cb5e3b6 Add proxy methods to SharedContainerSystem. (#2061) 2021-09-25 18:18:11 +02:00
metalgearsloth
aa3992255e Use approximate bounds for sprite rendering (#2052) 2021-09-23 23:53:37 +10:00
metalgearsloth
6d0cf375d0 Hotfix centroids
Not the permanent solution given it doesn't handle offset vertices but good enough for now.
2021-09-23 13:19:38 +10:00
Pieter-Jan Briers
52ad027854 Increase display.blur_light_factor to 0.001f 2021-09-21 08:09:02 +02:00
metalgearsloth
60ac47fad7 Fix rendertexture for rotated eyes (#2053) 2021-09-20 18:19:05 +02:00
metalgearsloth
8b462cc099 Remove 2 unused field dependencies 2021-09-21 00:18:33 +10:00
metalgearsloth
e918e40cd2 Fix ShapeTest warnings 2021-09-21 00:01:49 +10:00
metalgearsloth
39656f6810 Fix fixture mass setter crash 2021-09-20 22:30:31 +10:00
metalgearsloth
68576ace72 Accurate grid bounds (#2027)
* Fright night

* Shitty bounds working

* No more fixture leak

* Optimise TryFindGridAt

Should be O(1) now instead of the previous O(n) for number of fixtures

* ambush

* Merge stuffies

* Merge to master

* Fixes I guess

* Fix client sync

* Fix grid deserialization

* Jank test

* Fix deferral shitfuckery

* Optimise and remove

* Fixes

* Just werk dam u

* Optimisations

* Bunch of fixes

* FINALLY IT'S DONE

* Fixes

* Fix

* Comment
2021-09-20 21:07:31 +10:00
Vera Aguilera Puerto
ac21e24f33 Proper xmldocs for Resolves. 2021-09-20 11:06:42 +02:00
Vera Aguilera Puerto
843b8e69ef EntitySystem Resolve helper methods. (#2047)
* EntitySystem Resolve helper methods.

* Debug assert for component ownership

* Fix assert
2021-09-20 11:03:24 +02:00
metalgearsloth
a827bbec2b Add a debug system for showing anchored ents (#2030) 2021-09-20 11:00:30 +02:00
Visne
a5be8e723e Remove some unused obsolete stuff (#2049) 2021-09-20 10:59:50 +02:00
metalgearsloth
bac3ff969b Don't sleep items parented to map (#2031) 2021-09-20 10:58:44 +02:00
Javier Guardia Fernández
bfabc8e51a Fix deleting empty containers on the client deleting their previous contents (#2036) 2021-09-20 10:58:14 +02:00
Paul Ritter
c116cd6d8b new xaml error for invalid root node type (#2038)
Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
2021-09-20 10:57:43 +02:00
Visne
30f39dfb66 Remove MarginContainer (#2050) 2021-09-20 10:43:12 +02:00
Pieter-Jan Briers
6b81c283f5 Light blur experiment. 2021-09-20 10:40:46 +02:00
Pieter-Jan Briers
c91170b50e Explicit GL debugger detection to fix ANGLE console spam. 2021-09-20 10:40:30 +02:00
Pieter-Jan Briers
831dd0e5bb Flush render queue after WorldSpaceBelowFOV()
Fixes FOV appearing below atmos in SS14.
2021-09-20 10:14:49 +02:00
Swept
028dea2819 Updates documentation link in comment 2021-09-20 01:25:57 +00:00
Visne
5cbad8b3d9 Remove SizeFlags 2021-09-20 02:15:14 +02:00
Pieter-Jan Briers
9117f8c776 These IRenderHandle APIs are going public, deal with it. 2021-09-19 23:37:47 +02:00
mirrorcult
a46c539462 Merge pull request #2048 from Visne/vbox-hbox-remove
Remove VBoxContainer/HBoxContainer completely
2021-09-19 13:03:17 -07:00
Visne
c9cbeadc9e Trigger tests 2021-09-19 21:37:42 +02:00
Visne
8f1386cb19 Remove VBoxContainer/HBoxContainer completely 2021-09-19 18:41:10 +02:00
Vera Aguilera Puerto
3b902e0557 IMetaDataComponent implements IComponent 2021-09-19 10:46:09 +02:00
ike709
3142dcbfda Adds some OpenDream things to the sandbox whitelist (#2042) 2021-09-18 22:40:22 +02:00
Vera Aguilera Puerto
29ffd07712 MapCoordinates Offset overload that takes two floats. 2021-09-18 13:01:30 +02:00
Vera Aguilera Puerto
afd687e392 Add Offset method to MapCoordinates. 2021-09-18 12:49:54 +02:00
Vera Aguilera Puerto
72341a25af VV attribute for ViewSubscriptions in PlayerSession. 2021-09-18 11:14:44 +02:00
Vera Aguilera Puerto
6d03840fbd Makes BoundUserInterfaces partially ECS. (#2033) 2021-09-18 10:41:06 +02:00
metalgearsloth
ea2d63b404 Add test for lookup anchoring (#2035)
* Add test for lookup anchoring

* Updates

* Fix test
2021-09-17 01:43:41 +10:00
metalgearsloth
42a137d106 Raise anchoring broadcasted 2021-09-17 00:06:02 +10:00
metalgearsloth
8f8c1eccc3 hotfix eyes 2021-09-16 17:42:30 +10:00
metalgearsloth
b91fa6ba75 Reduce position approx tolerance 2021-09-16 14:03:33 +10:00
metalgearsloth
e270f4f06c Reduce velocity approx tolerance 2021-09-16 13:57:18 +10:00
metalgearsloth
56b7957878 Receive testbed from content (#2034) 2021-09-16 13:02:43 +10:00
metalgearsloth
209eb5fea0 Fix 90% of grid rotation bugs (#2003)
* View box2rotated

* Changes

* Stash someday

* Sync

* Grid rotation in a commit

* SIMD comment

* Minor TryFindGridAt optimisation

* More fixes

* Optimise rays a tad

* Reduce code duplication

* Fix anchoring

* More fixes woopsie

* Eye matching parent

* Centre of mass stuffsies

* Remove TODO

* Add TODO

* Revert anchor crash

* Fix master merge-in whoopsie

* Fixes

* Woops

* Fixed viewport transform

* Re-fix rendering
2021-09-16 12:59:16 +10:00
Javier Guardia Fernández
417954e66c Simplify how some serialization expression trees return values (#2040) 2021-09-15 21:00:42 +02:00
Visne
e4fb860985 Fix licenses (#2041) 2021-09-16 00:18:51 +10:00
Pieter-Jan Briers
d70481aedd Update Linguini
This fixes several compiler warnings.
2021-09-15 16:17:52 +02:00
Pieter-Jan Briers
52eb581b56 Fix some compiler warnings. 2021-09-15 15:55:27 +02:00
Pieter-Jan Briers
918fa8e3b9 Fix handling of key names GLFW returns as null. 2021-09-15 13:37:24 +02:00
Visne
1c7f19bf67 Add OptionButton margin (#2020) 2021-09-15 01:49:49 +02:00
Javier Guardia Fernández
0cbff8dee1 Change serialization reading to only do type checks once per type (#2018)
* Change serialization reading to only do type checks once per type

* Optimize for sealed types in arrays

* Oops the context

* Fix ISelfSerialize node type and null values

* Add int read test

* Remove nullability from constructor and property of DeserializedValue

* Add clearing readers to serialization shutdown

* Fix struct populate default values
Remove some notnull constraints

* Replace robust gen with normal il generator
2021-09-13 18:14:52 +02:00
metalgearsloth
e7e08e5dd6 Merge branch 'master' into fix-sound 2021-09-13 20:39:42 +10:00
metalgearsloth
670ff54ef0 Fix SetAsBox 2021-09-13 19:46:31 +10:00
metalgearsloth
8f519c52b6 Fix multi-viewer PVS crash 2021-09-13 15:59:18 +10:00
Javier Guardia Fernández
fbd29afbd8 Fix data definitions sometimes not being found in tests (#2026) 2021-09-12 11:47:50 +02:00
Javier Guardia Fernández
2bbdb23716 Fix tests getting stuck until terminated (#2025) 2021-09-12 11:42:46 +02:00
Javier Guardia Fernández
e2dda67eef Add test for IPopulateDefaultValues (#2024) 2021-09-12 10:07:59 +02:00
metalgearsloth
699615df97 Remove Snapus Gridus (#2014) 2021-09-12 16:34:51 +10:00
Javier Guardia Fernández
e804994a5b Fix serialization manager shutdown (#2011) 2021-09-11 00:00:31 +02:00
metalgearsloth
24f7ecccc0 Remove AppearanceTestComponent (#2015) 2021-09-10 23:59:42 +02:00
Javier Guardia Fernández
21d43350f0 Add benchmark for serializing arrays of strings, ints and definitions (#2017)
* Add benchmark for serializing arrays of strings, ints and definitions

* Add sealed elements array benchmark
2021-09-10 17:57:16 +02:00
Javier Guardia Fernández
63eb7847a1 Add test for serializing nullable ints (#2016) 2021-09-10 17:50:02 +02:00
metalgearsloth
4a4f07a10c StopPlaying won't throw if already disposed (#2013) 2021-09-09 12:53:33 +02:00
Javier Guardia Fernández
1c816941ec Change serialization writing with serializers to use expression trees (#2010)
* Change serialization writing with serializers to use expression trees

* Add test
2021-09-08 13:05:34 +02:00
Javier Guardia Fernández
2143c9abc3 Change serialization reading with serializers to use expression trees (#2009)
* Change serialization reading with serializers to use expression trees

* Add test

* Eliminate lambda capture
2021-09-08 12:07:17 +02:00
Vera Aguilera Puerto
4b6ceed586 Adds FileNotFoundException to the sandbox whitelist. 2021-09-08 09:52:20 +02:00
metalgearsloth
49c6c0c9d8 Fix anchoring crashes 2021-09-08 10:55:44 +10:00
metalgearsloth
54f6143be3 Quick audio fix nothing to see here 2021-09-07 18:17:58 +10:00
metalgearsloth
b83e09c214 Add method to apply impulse from a point (#1992) 2021-09-07 08:25:28 +02:00
metalgearsloth
caa9b442d5 Use arrays for polygon vertices (#1958)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2021-09-07 08:24:58 +02:00
Javier Guardia Fernández
69921da034 Change serialization copying with serializers to use expression trees (#2008) 2021-09-07 08:09:26 +02:00
metalgearsloth
552893f1b7 Audio enhancements (#1997)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2021-09-07 08:08:49 +02:00
metalgearsloth
c5c10caaf1 Chunk streaming (#1985)
* The real lookup flags

* Don't get anchored entities for PVS query

* Finish that implementation

* Immediate anchoring changes

* Woops some anchoring slippy

* Fix stupidity

* More gradual

* Remove thread-unsafe stuff

In case anyone notices I'm stupid

* Some day I'll stash instead lol

* Fix thread issue

* Werk

* Cvar for range too

* Explanation

* More comments

* Fix merge
2021-09-07 07:59:22 +02:00
metalgearsloth
98de046977 Avoid unnecessary TransformComponent cast in PVS (#2007)
* Avoid unnecessary TransformComponent cast in PVS

Haven't profiled if it's faster but it supports EntityUid better so whenever we deprecate IEntity we would've had to do this anyway.

* Avoid unnecessary MapPosition call

LocalToChunkIndices already checks for this and saves the additional conversion from EC -> map -> EC again

* Doc fixes
2021-09-07 07:57:54 +02:00
Pieter-Jan Briers
6328bddb52 Fix GridContainer looking at Size in its ArrangeOverride()
This fixes tests.
2021-09-07 07:47:17 +02:00
Pieter-Jan Briers
003c910c66 Make some icky reflection APIs internal. 2021-09-07 07:43:24 +02:00
Pieter-Jan Briers
1d7f4b4501 Improve comments on BoxContainer a bit. 2021-09-07 02:27:56 +02:00
Pieter-Jan Briers
2f6fb22473 Remove obsolete layout APIs. 2021-09-07 01:38:13 +02:00
Pieter-Jan Briers
96d66c57c1 Comments for Control.Layout.cs. 2021-09-07 01:24:10 +02:00
metalgearsloth
35741524a3 Significantly reduce debug allocations (#2005)
* Significantly reduce debug allocations

I know it's debug but it's number 1 on entity spawning

* Nothing to see here
2021-09-06 13:32:09 +02:00
metalgearsloth
d5855fa805 Sync PointLight data between client and server. (#1995)
* Sync PointLight data

* ECS GetComponentState

* Nothing to see here
2021-09-06 17:31:06 +10:00
metalgearsloth
36a9d06381 Fix Robust tests (#2004)
Not the greatest of solutions but at least it's fixed for now.
2021-09-06 01:27:37 +10:00
Pieter-Jan Briers
3bfb3a5ef7 Fix GLES3 sRGB detection.
Forgot to set the variable, epic.
2021-09-04 21:07:20 +02:00
metalgearsloth
83b031cab4 Optimise GetTileRef (#1998)
* Optimise GetTileRef

Used in movement code a lot to check weightless and most of the time they're parented to the grid.

* More optimisations
2021-09-04 12:09:04 +02:00
Pieter-Jan Briers
6197352fca Try GLES3 anyways on compat mode. 2021-09-01 18:29:58 +02:00
Pieter-Jan Briers
0fd210481a Multithread SerializationManager initialize. 2021-09-01 13:38:34 +02:00
Pieter-Jan Briers
74eea847e2 Compact LOH on initial startup GC.
LOH gets fragmented heavily, currently, so this helps.
2021-09-01 01:29:20 +02:00
Pieter-Jan Briers
6938787863 Fix compat mode, fullscreen, more work on ANGLE swap chain. 2021-09-01 01:13:32 +02:00
Pieter-Jan Briers
4ba5654253 Allow modifying selection/cursor colors on LineEdit 2021-08-30 23:34:28 +02:00
Pieter-Jan Briers
15ff120b97 Add Control.StylePropertyDefault() helper method. 2021-08-30 23:34:14 +02:00
Pieter-Jan Briers
942a550687 Fix clearColor not being passed through by RenderInRenderTarget.
This fixes background colors for non-main WindowRoots
2021-08-30 23:24:21 +02:00
Pieter-Jan Briers
acff35f4bf Fix multi-window rendering deadlock. 2021-08-30 23:07:26 +02:00
Pieter-Jan Briers
4e7039e09b StyleBoxFlat can now draw simple rectangular borders 2021-08-30 23:01:51 +02:00
Pieter-Jan Briers
4a0b3793e4 Add IUserInterfaceManager.GetWindowRoot 2021-08-30 23:01:38 +02:00
Pieter-Jan Briers
928ae19249 Fix styling not applying to root controls. 2021-08-30 15:17:43 +02:00
Pieter-Jan Briers
a7f85b53f8 Background color for UIRoot. 2021-08-30 02:14:22 +02:00
Pieter-Jan Briers
5fac83c697 Fix GLFW_SCALE_TO_MONITOR not being specified for self-managed context windows. 2021-08-30 01:45:56 +02:00
Pieter-Jan Briers
577b2b0f62 Remove OutputPath overrides for shared.
Pretty sure this will reduce recompilation when switching between debug and release in rider, so sounds like a good idea to me.
2021-08-30 01:38:28 +02:00
Pieter-Jan Briers
cd3a7ef91e ANGLE+DXGI experiment, window/GL init rewrite (#1982) 2021-08-30 01:35:07 +02:00
Vera Aguilera Puerto
051d47f4ff Adds ComponentGetState ECS event (#1988) 2021-08-29 17:23:40 +02:00
metalgearsloth
b982b94c83 Port TestPoint from Box2D (#1991)
Rather than having the methods on the shapes themselves (whenever we eventually get them as structs) I just put them on a shapemanager instead as it seemed cleaner?
2021-08-29 17:10:46 +02:00
Vera Aguilera Puerto
84b7742656 Adds by-ref and struct event support to ComponentEvents (#1987) 2021-08-29 16:52:38 +02:00
metalgearsloth
1585cd111f Don't dirty appearance if state is identical (#1990)
Avoids unnecessary visualizer calls and bugs from duplicate animations or the likes.
2021-08-29 16:00:06 +02:00
metalgearsloth
766f6dc93d EntityLookup flags for PVS optimisations (#1983)
* The real lookup flags

* Don't get anchored entities for PVS query

* Finish that implementation

* Immediate anchoring changes

* Woops some anchoring slippy

* Address review
2021-08-29 14:03:45 +10:00
ShadowCommander
9ac8db37cc Add invalid check 2021-08-28 02:37:20 -07:00
ShadowCommander
2d6eebfae2 Rename GridCoordinates to FallbackCoordinates and move GetFallbackCoordinates to shared 2021-08-28 02:29:47 -07:00
Vera Aguilera Puerto
59af9451be Various improvements to midi
- MidiEvent control is now an int
- Instead of hardcoding the channel count, we check the count on the synth itself.
- Do nothing for event 0x51
2021-08-26 15:01:34 +02:00
metalgearsloth
80e4f69f29 PVS Anchoring take 2 (#1959)
* PVS is now aware of entity anchoring.
Misc PVS perf improvements.

* Fix master merge

* Optimise chunks intersecting

* Ensure anchored entity chunks are always sent

* Remove silly pool by me

* Hotfixes?

* Chunk sending

* Optimise assert

* Assert updates

* Remove AME debug

* Fixes

* Add back in including map eye

* Update Robust.Server/GameStates/EntityViewCulling.cs

Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com>

* Update Robust.Shared/Map/MapChunk.cs

Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com>

Co-authored-by: Acruid <shatter66@gmail.com>
Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com>
2021-08-26 12:48:44 +10:00
Pieter-Jan Briers
98060f2056 Fix closing child window minimizing parent on windows. 2021-08-26 00:30:56 +02:00
Vera Aguilera Puerto
f0bfb6a69a Adds deflate compression to MsgState. (#1981) 2021-08-25 23:54:15 +02:00
Pieter-Jan Briers
ac38748280 Fix GridContraction_Test doing bad entity access and causing test failure. 2021-08-25 23:30:38 +02:00
Pieter-Jan Briers
18fe34c041 Do not send all entities on fromTick = 0.
This doesn't seem to be necessary anymore and it massively improves load performance.
2021-08-25 23:19:34 +02:00
Pieter-Jan Briers
6a0cb6a5af Rework entity storage to remove CullDeletedEntities.
Now we only use the dictionary for storing entities, similar to components.

This means creating/deleting entities while enumerating them will throw, but that's probably fine since GetEntities() is barely used nowadays, and we have QueueDelete().
2021-08-25 22:47:33 +02:00
Pieter-Jan Briers
310aebaee2 Make prediction CVars NOT ARCHIVE.
I want to disable them in OpenDream and this would make that impossible.
2021-08-25 22:47:32 +02:00
Paul Ritter
f25d67da55 dynamically adjusts divisions in worlddrawhandles drawcircle (#1980)
Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
2021-08-25 22:23:59 +02:00
metalgearsloth
eac36e917f Fix showrays (#1979) 2021-08-26 00:12:56 +10:00
ShadowCommander
c64fa8f2cc Fix Box2Serializer and tests 2021-08-24 22:58:43 -07:00
Vera Aguilera Puerto
63c1707581 Adds new helpful filter methods. (#1962)
- AddWhereAttachedEntity and RemoveWhereAttachedEntity methods
- AddInGrid and AddInMap methods
- BroadcastGrid and BroadcastMap static methods
2021-08-24 16:11:38 +02:00
metalgearsloth
914a7fb130 Fix box2 serializer (#1966)
There's some existing content with invalid bounds so this is going to be fun.
2021-08-24 18:30:42 +10:00
Pieter-Jan Briers
41d3495e29 Some stubs for JS execution queuing.
Definitely gonna be necessary but eeeeeeh feeling lazy.
2021-08-24 10:05:35 +02:00
Pieter-Jan Briers
2ae426b8e5 Allow file filters in save file dialogs. 2021-08-24 09:24:49 +02:00
Pieter-Jan Briers
eb45e16739 BrowserControl now allows hooking the BeforeBrowse API.
This is necessary to be able to cancel navigation (OpenDream Topic()).
2021-08-24 08:32:44 +02:00
Pieter-Jan Briers
79c952a871 Make MouseFilterMode.Stop default for BrowserControl 2021-08-24 08:01:22 +02:00
Pieter-Jan Briers
827c4b32fd Double check that CefManager is initialized in BrowserControl.
Otherwise it would throw with a nullref somewhere in CefGlue.
2021-08-24 07:35:28 +02:00
Pieter-Jan Briers
033e20cbf1 Add Closed (past tense) event to OSWindow.
Change a bunch of window event stuff up.
2021-08-24 04:49:04 +02:00
Pieter-Jan Briers
3ff46d40fa UsedImplicitly for IConsoleCommand 2021-08-24 04:42:09 +02:00
Pieter-Jan Briers
5ab6aba20b More implicit use attributes.
This means that entity systems and IoC managers should no longer need [UsedImplicitly] to suppress "object never instantiated" warnings.
2021-08-24 03:13:23 +02:00
Pieter-Jan Briers
e6be04cb83 OSWindow control to make OS windows much easier. 2021-08-24 02:05:25 +02:00
Pieter-Jan Briers
627b2f4d0d Change WindowCreateParameters.HideCloseButton to a more general purpose Styles system. 2021-08-24 02:05:25 +02:00
Pieter-Jan Briers
ffff42cc95 Add owner window parameter to window creation.
And also CenterOwner placement rule.

Currently owner windows are only implemented on Win32. Linux and macOS will need implementing still.
2021-08-24 02:05:25 +02:00
Pieter-Jan Briers
ce420ac8ab Set GLFW_SCALE_TO_MONITOR true on window creation. 2021-08-24 02:05:25 +02:00
Paul Ritter
d3cdfbe3cb ratio's rects (#1970)
Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
2021-08-23 20:33:38 +02:00
Paul Ritter
726bfd58f6 adds some helpers to robustrandom (#1969)
Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
2021-08-23 20:32:51 +02:00
Paul Ritter
05827d01d0 Datafield now implies readonly VVAccess (#1968)
Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
2021-08-23 20:32:25 +02:00
metalgearsloth
6cb7641c07 Fix GetEntitiesInRange
A lot of lookup needs cleaning up but this is technically brokeded.
2021-08-23 22:40:47 +10:00
metalgearsloth
d72185933a Add support for grid chunk removals (#1941)
* Add support for grid chunk removals

Also allows grids to be removed when they have no more chunks remaining.

* No more crashing pog

* Slightly better

* Minor optimisations and fix bounds

* Avoid creating new chunks for anchoring

* chucky

* comment

* Tests

* Remove some logs

* Remove another log

* Review
2021-08-23 16:00:07 +10:00
metalgearsloth
80a9a82278 Fix client-side physics bodies getting stuck awake (#1946)
* Fix client-side physics bodies getting stuck awake

Wasn't a huge perf hit but it could leak a bit. Also there's a bunch of E/C stuff in here and I'll deal with it later.

* Fix broadphase leak

* Fix robust server sim
2021-08-23 15:01:08 +10:00
metalgearsloth
99c8ce2cc8 Attach to parent before inserting into container (#1965)
tl;dr is that throwing on content needs to be able to have IsInContainer return the correct result when checking for it in EntInsertedIntoContainer
2021-08-22 21:46:20 -07:00
Pieter-Jan Briers
f137a6e3a5 Add InheritChildMeasure bool to LayoutContainer 2021-08-22 11:32:15 +02:00
Pieter-Jan Briers
73e62414a7 Update Lidgren and NetSerializer submodules 2021-08-22 11:08:43 +02:00
Pieter-Jan Briers
ef7ef3ca9f Replace usages of NET5_0 preprocessor with NET5_0_OR_GREATER 2021-08-22 11:08:05 +02:00
Pieter-Jan Briers
da26e86f5e Merge branch 'robust-client-CEF' 2021-08-22 10:51:44 +02:00
Pieter-Jan Briers
d2a1815d7b Allow GameControllerOptions to change the startup branding. 2021-08-22 10:43:41 +02:00
Pieter-Jan Briers
4894888339 Dev window has UI tab now with UI tree. 2021-08-22 02:07:42 +02:00
Pieter-Jan Briers
3fd55733bb Add child added/removed/moved events to Control.
Intended for UI dev window
2021-08-22 02:07:42 +02:00
Pieter-Jan Briers
bebd638412 Make SplitContainer properties VV. 2021-08-22 02:07:42 +02:00
Pieter-Jan Briers
328b3cc715 Add IUserInterfaceManager.OnPostDrawUIRoot.
Intended for UI dev window highlighting.
2021-08-22 02:07:42 +02:00
Pieter-Jan Briers
b523cfddb7 Fix some layout calculation bugs.
1. Fix a copy paste typo in ApplySizeConstraints().
2. Fix negative sizes passed to MeasureCore() causing exceptions.
2021-08-22 02:07:42 +02:00
Pieter-Jan Briers
4fea277541 Make some SplitContainer stuff [ViewVariables] 2021-08-22 02:07:42 +02:00
Pieter-Jan Briers
3417f00650 Give main window UI root a good name 2021-08-22 02:07:42 +02:00
Pieter-Jan Briers
db4b190498 guidump command now shows all UI roots. 2021-08-22 02:07:38 +02:00
Pieter-Jan Briers
7d2bbc2ca7 Add an OnResized event to controls 2021-08-22 01:29:24 +02:00
Pieter-Jan Briers
553278fdb3 Fix x:Class directives in XamlUI. 2021-08-22 01:29:10 +02:00
Vera Aguilera Puerto
e5013d9e3f Add support for struct directed events, add by-ref directed/broadcast events. (#1931)
* Add support for struct directed events.
- Turn transform events into readonly structs

* TransformComponent events have readonly fields.

* Reduce boxing allocations, add DirectedRegistration readonly struct.

* Use typeof in a few places instead of GetType

* Add overloads to allow passing directed events by ref.

* Raise transform events by ref.

* Fix occluder AnchorStateChangedEvent subscription

* Fix broadphase subscriptions

* Fix bug oops

* Fix transform system raising moveevents by value

* Don't reflect the test entity systems.

* Directed EventBus uses ref everywhere, internally
Deduplicates a bunch of code. Whoo!

* Add broadcast by-ref events

* Fix by-ref events bug using Unsafe, add new tests for sorted by-ref events.

* Port broadcast events to by-ref.

* Speed, more correctness, reduce generics bloat.

* Clean up subscription code some.

* Remove bad test.

Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2021-08-21 11:37:02 +02:00
Vera Aguilera Puerto
679f8f24c9 Cleans up EntityCoordinates, split coordinates into their own files. (#1956) 2021-08-20 15:48:43 +02:00
metalgearsloth
1a547b946c Fix anchoring parent changes
Problem was coordinates were updated first and then it was clearing the snapgrid cell.
2021-08-20 14:14:17 +10:00
metalgearsloth
5594bd7203 Revert "PVS is now aware of entity anchoring. (#1845)"
This reverts commit 820d988e0a.

# Conflicts:
#	Robust.Server/GameStates/EntityViewCulling.cs
2021-08-19 22:34:06 +10:00
metalgearsloth
8cbe48c94f Use all chunks for PVS culling
Temporary attempt at fixing the server issue with PVS.
2021-08-19 22:30:05 +10:00
metalgearsloth
b04b9fc9cd Fix timer crash 2021-08-19 22:18:31 +10:00
Acruid
820d988e0a PVS is now aware of entity anchoring. (#1845)
* PVS is now aware of entity anchoring.
Misc PVS perf improvements.

* Fix master merge

* Optimise chunks intersecting

* Ensure anchored entity chunks are always sent

* Remove silly pool by me

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
2021-08-19 21:48:44 +10:00
metalgearsloth
1ad5122b5d Fix y-sorting (#1952) 2021-08-18 17:49:54 +02:00
metalgearsloth
456ac03870 Add RevoluteJoint (#1953) 2021-08-18 17:48:52 +02:00
metalgearsloth
f647d00dc4 Add short-circuit for TryDistance (#1951)
* Add short-circuit for TryDistance

90% of the uses probably have the same parent hence we can avoid the more expensive ToMap calls for these.

* InRange too
2021-08-17 08:56:16 +02:00
metalgearsloth
2fd3bbf58b Optimise TryFindGridAt (#1945) 2021-08-16 21:06:31 +02:00
metalgearsloth
5ed49d51d3 Add vertices simplifier (#1935) 2021-08-15 19:15:23 +02:00
metalgearsloth
758d5eedef Add WorldPoint to StartCollideEvent (#1943)
Some stuff may want the actual collision point.
2021-08-15 16:45:42 +02:00
metalgearsloth
96d15929e6 Optimise GetMapChunks (#1948)
Don't need to check every chunk's bounds when you can just do dictionary lookups. Should be an okay bonus for PVS and grid rendering on larger grids. Didn't make tests yet because all of the existing ones are mocked and painful to change.
2021-08-15 16:45:30 +02:00
metalgearsloth
2a062dbf53 Cleanup TimerComponent when none are running (#1949)
The ToList was showing up on a profiler.
2021-08-15 16:45:00 +02:00
metalgearsloth
6d66bc66e4 Minor grid traversal optimisation (#1950)
Avoids running duplicate events, mainly for client, but also avoids the additional GetEntity call as well.
2021-08-15 16:29:14 +02:00
Pieter-Jan Briers
5cc056100b Remove unused MsgEntity parameter packing helpers.
These were originally for when messages were passed around as an object[] args list, I believe. This isn't used so this code should just go honestly.
2021-08-12 14:35:56 +02:00
Visne
5eee22b034 Make no rotation work when eye is rotated (#1927) 2021-08-12 13:12:02 +02:00
DrSmugleaf
7f5beab259 Add the component type to the unknown component linter error message 2021-08-12 12:21:52 +02:00
ShadowCommander
5540d643ef Change from MapCoordinates to GridCoordinates 2021-08-12 01:45:07 -07:00
metalgearsloth
46aead639b Allow VirtualControllers to be retrieved by content (#1937)
Useful in SS14 for MoverController to cache some work that SharedTileFrictionController can re-use.
2021-08-12 17:55:34 +10:00
Visne
488d060595 Fix map deletion not working because of deleted entity referencing map (#1933)
* Fix map deletion not working because of deleted entity referencing map

* Change fix

* Update Robust.Shared/GameObjects/Components/CollisionWakeComponent.cs

Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
2021-08-12 14:00:12 +10:00
metalgearsloth
b1bab1f38e Significantly reduce default volume range
Now it's actually unified instead of being 25 sometimes and 62.5 (the godot default) at other times.
2021-08-11 19:53:15 +10:00
ShadowCommander
76c1d9f97b Change Audio to also use MapCoordinates as a fallback 2021-08-10 20:42:46 -07:00
metalgearsloth
feba2a23ad Fix grid collisions (#1934)
* Fix grid collisions

* Fix this silliness

* Add test for grid collisions

* Fix FlagSerializer not working with 1 << 31

Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>
2021-08-10 00:04:19 +10:00
Javier Guardia Fernández
e1ff29744e Fix FlagSerializer not working with 1 << 31 (#1940) 2021-08-09 23:56:43 +10:00
Javier Guardia Fernández
f6216e63b0 Add tests for serializing flags (#1939) 2021-08-09 13:07:42 +02:00
Javier Guardia Fernández
0b3ecf2168 Add benchmarks for serializing flags (#1938)
* Add benchmarks for serializing flags

* Add type definitions
2021-08-09 13:03:24 +02:00
Vera Aguilera Puerto
9f29bf6349 Merge branch 'master' into robust-client-CEF 2021-08-09 12:02:15 +02:00
metalgearsloth
d12a238ecc Fix tests
Woops
2021-08-09 19:42:34 +10:00
Vera Aguilera Puerto
d62a64029d Merge branch 'master' into robust-client-CEF 2021-08-09 11:13:56 +02:00
metalgearsloth
ac46a7845d Fix container bounds 2021-08-09 18:46:51 +10:00
Vera Aguilera Puerto
17662aaad9 Merge branch 'master' into robust-client-CEF 2021-08-09 08:08:29 +02:00
metalgearsloth
60b526f653 Dirty physics bodies on new fixtures 2021-08-08 15:59:59 +10:00
metalgearsloth
d58e380dd9 MapManager now uses accurate bounds for grids (#1918)
* MapManager now uses accurate bounds for grids

Instead of using the old WorldBounds (which was dirty for multiple reasons) it goes through physics instead using the actual fixtures attached to the grid.

* Fix nuke

* Test time

* AABB tests

* feex

* how is this failing aaa

* feex tests

* slightly better

Co-authored-by: metalgearsloth <metalgearsloth@gmail.com>
2021-08-06 22:25:14 +10:00
Visne
96a098a0c2 Fix outline when eye is rotated (#1929) 2021-08-06 09:53:14 +02:00
Vera Aguilera Puerto
c0d4e34089 Add Friend classes to C# with the help of Analyzers and Attributes. (#1928)
* Add Friend classes to C# with the help of Analyzers and Attributes.

* Revert to netstandard2.0

* Use LINQ instead of ^1 for array

* Address review.
Oops, forgot to push.
2021-08-06 09:50:22 +02:00
ShadowCommander
e16e0f4bd0 Fix containers with entities that do not exist yet (#1892)
* Fix containers that hold entities not on client

* Delete from ExpectedEntities when entity removed

* Fix ContainerSystem not registering on the server

* Move container state to entity system
Move client code to client

* Fix removal and clean up code

* Add test

* Add more checks to test

* Remove unneeded deletion event handler

When the child is deleted, if the entity does not exist on the client,
then HandleComponentState runs. If the entity does exist, then
HandleEntityInitialized would have run. Either way HandleEntityDeleted
is not needed.

* Renamed unexpected to removedExpected
2021-08-04 19:00:14 -07:00
metalgearsloth
d31ffd2794 Update broadphase every frame on client (#1925)
There was a reason I didn't do this prior to refactor but that reason is no longer relevant soooooo
2021-08-04 00:43:32 +10:00
metalgearsloth
04d94f87fc Fix movement lerping (#1924) 2021-08-04 00:11:04 +10:00
metalgearsloth
f809375389 Cache broadphase on PhysicsMap (#1923) 2021-08-03 22:24:01 +10:00
metalgearsloth
530ea5f4e6 Remove BroadphaseMapid from physicscomp
Was made redundant in the broadphase refactor
2021-08-03 19:08:45 +10:00
Visne
590a23d540 Make it possible to set lighting per map (#1921) 2021-08-03 09:55:54 +02:00
Vera Aguilera Puerto
52351e8b11 Clyde can now render multiple viewports with different maps. (#1917)
* Clyde can now render multiple viewports with different maps.

* remove todo comment
https://tenor.com/view/emoji-disintergrating-meme-emoji-disintegrating-meme-gif-21239978

* Fix tests
2021-08-03 13:24:11 +10:00
metalgearsloth
f75a764ff3 Multi-thread physics solver (#1905) 2021-08-02 13:50:26 +02:00
metalgearsloth
d14f4f0ce3 Use structs for position constraints (#1919)
Co-authored-by: metalgearsloth <metalgearsloth@gmail.com>
2021-08-02 21:47:57 +10:00
Vera Aguilera Puerto
5367570c7f Log simple human-readable error message when PVS mail generation throws an exception. 2021-08-02 12:29:37 +02:00
Vera Aguilera Puerto
e523a733c8 TestLogHandler logs exception, too. 2021-08-02 12:29:37 +02:00
metalgearsloth
06af61106c Fix grid rendering for rotation (#1881)
* Fix grid rendering

* Actually feex

* spellcheck

* Add a test for chunk bounds

* Revert that
2021-08-02 16:41:24 +10:00
metalgearsloth
2239c30924 Fix potential contact crash 2021-08-02 16:19:40 +10:00
Vera Aguilera Puerto
f9f55b6862 Transform sets GridId before raising EntParentChangedMessage event. 2021-08-01 13:35:58 +02:00
Vera Aguilera Puerto
83a5560850 Transform EntMapIdChangedMessage is raised directed. 2021-08-01 12:20:45 +02:00
Visne
9a8f139fb9 Make ScreenToMap not default to main viewport (#1916) 2021-07-31 23:45:08 +02:00
Pieter-Jan Briers
20dae60fd4 Add NumericsHelpers add method. 2021-07-31 16:52:24 +02:00
Pieter-Jan Briers
b4098668bb Use ring buffer for IGameTiming._realFrameTimes.
List.RemoveAt(0) is inefficient.
2021-07-31 16:06:08 +02:00
mirrorcult
9397cc4a6b Fix serv warnings (#1915) 2021-07-31 15:01:18 +10:00
Pieter-Jan Briers
1601e75879 Forgot the debug code oops. 2021-07-31 04:21:37 +02:00
Pieter-Jan Briers
a7b9c87926 Save 0.4% Windows server CPU. 2021-07-31 04:20:50 +02:00
metalgearsloth
8fea42ff9a Fix GetTilesIntersecting for circles (#1912) 2021-07-30 10:01:14 +02:00
metalgearsloth
86d20a0ef1 Bump up light radius
The ones around the singularity are 32 radius for whatever reason
2021-07-30 17:22:23 +10:00
metalgearsloth
09012ea4ff Change velocity constraints to structs (#1906) 2021-07-29 22:14:01 +02:00
metalgearsloth
e68297eb93 Multi-thread physics contacts (#1897) 2021-07-29 22:13:42 +02:00
Pieter-Jan Briers
47af668cda Fix overriding unregistered-but-known config vars.
The default value would be set to 0 as a placeholder from when the config var is first tracked as unregistered, which means that when we try to override it tries to parse it as an int always.
2021-07-29 20:29:08 +02:00
metalgearsloth
c1a2e23ce2 Fix mission-critical typo 2021-07-30 00:08:17 +10:00
metalgearsloth
f208f6bfa9 Use ref var for manifold points (#1911) 2021-07-29 15:38:12 +02:00
Pieter-Jan Briers
ae526e2e10 FixedArray helpers.
May your stack allocations be fast and your GCs infrequent.
2021-07-29 15:37:43 +02:00
metalgearsloth
25549869b1 Use more values by reference in Collision (#1910)
Also a sneaky Span<ClipVertex> I forgot
2021-07-29 14:49:50 +02:00
metalgearsloth
f71e81d204 Use circle.Position for collisions. (#1909) 2021-07-29 14:49:18 +02:00
Vera Aguilera Puerto
757143be84 Merge branch 'master' into robust-client-CEF 2021-07-29 13:36:16 +02:00
metalgearsloth
e67812fdb4 Add shutdowns to VirtualControllers (#1887) 2021-07-29 13:31:34 +02:00
Vera Aguilera Puerto
aa44b1cb8a RaiseLocalEvent non-generic overload that checks for GetType() (#1907)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>
2021-07-29 13:30:29 +02:00
Vera Aguilera Puerto
8ec75be244 Minor ViewSubscriber cleanup, remove all mentions of PVS eye 2021-07-29 13:29:54 +02:00
Vera Aguilera Puerto
48746b7bd3 Adds ViewSubscriberComponent and ViewSubscriberSystem (#1900) 2021-07-29 13:16:25 +02:00
metalgearsloth
a9791d2033 Fix potential SetTile crash when it unanchors entities (#1903) 2021-07-29 13:15:50 +02:00
Vera Aguilera Puerto
709f1f4284 EntityLookup now uses ILookupWorldBox2Component for getting entities' world AABB. 2021-07-29 13:01:24 +02:00
metalgearsloth
907094a5c8 Minor solver optimisation for invmass 2021-07-29 18:57:35 +10:00
Pieter-Jan Briers
a35a5e1645 Add EntitySystem.Subs property to aid helper methods. 2021-07-29 01:51:51 +02:00
Pieter-Jan Briers
ad8a59a72f Revert "Adds SetButtonDisabledRecursive() method to Control" (#1902)
This reverts commit e93c0f76a9.
2021-07-27 21:44:31 +02:00
Visne
e93c0f76a9 Adds SetButtonDisabledRecursive() method to Control (#1901) 2021-07-27 20:08:24 +02:00
metalgearsloth
7bac32d18e Don't use DeferMoveEvent if the position is NaN (#1896)
The issue is that currently moving around means any non-anchored entities have their positions updated to / from NaN. As you can imagine this is a performance nightmare for anything subscribing to it, especially considering it leads to the broadphase getting desynced for physics.

Realistically we need one of the alternatives Acruid has laid out because flooding the eventbus with NaNs will kill performance.
2021-07-28 00:28:07 +10:00
Pieter-Jan Briers
b6b1d46892 Ignore "CON" in DebugConsoleLogHandler. 2021-07-27 09:38:08 +02:00
Vera Aguilera Puerto
30fcc6b729 Merge branch 'master' into robust-client-CEF 2021-07-27 09:02:29 +02:00
Vera Aguilera Puerto
6f0bc3822e InputComponent is now public. 2021-07-27 08:51:02 +02:00
Vera Aguilera Puerto
b7c8452285 Use EntitySystem dependencies in a few places that cached systems before. 2021-07-26 12:57:39 +02:00
Vera Aguilera Puerto
49e2d567cd Merge branch 'master' into robust-client-CEF 2021-07-26 12:14:11 +02:00
Paul Ritter
8c1e075c91 EntitySystem DependencyCollection & EntitySystem dependencies (#1890)
* started work

* tests

* namespace

* working

* thonk

Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
Co-authored-by: Vera Aguilera Puerto <gradientvera@outlook.com>
2021-07-26 12:10:03 +02:00
metalgearsloth
b340e40c99 Cache physics transforms internally (#1873)
* Cache physics transforms internally

3 main points to cache them for:
1. Contact updates
2. Physics Islands solving
3. GetWorldManifold (though this is primarily for ss14).

Whenever multi-threading is done it will need adjustments to make sure no race conditions on accessing the transforms dictionary

* Also cache position and angle for GetWorldAABB

* Fix boogs

* woops
2021-07-26 18:23:10 +10:00
metalgearsloth
c4b124f48d Cleanup physics contacts a bit (#1895)
Removed a lot of the listener comments as we use the eventbus instead in this house.
2021-07-25 23:40:45 +10:00
metalgearsloth
7efae8fbc1 Remove IStartCollide (#1875)
* Remove IStartCollide

Needs several content PRs to be merged as well.

* Feex
2021-07-25 23:06:34 +10:00
Pieter-Jan Briers
7feeeb2f6f OOps 2021-07-25 14:50:14 +02:00
mirrorcult
f90462cf82 Improve RSI error messages (#1894) 2021-07-25 12:06:36 +02:00
metalgearsloth
b19ae9e69e Add AABB VVs for debugging 2021-07-25 19:04:25 +10:00
Vera Aguilera Puerto
9bf69db0ef Merge branch 'master' into robust-client-CEF 2021-07-24 10:06:54 +02:00
metalgearsloth
2132d6cbae Comment out the contactmanager crash safeguard for now 2021-07-24 13:50:27 +10:00
Ygg01
d2d6f9d08e Update Linguini to latest to fix escaping text literals (#1880) 2021-07-23 17:43:14 +02:00
metalgearsloth
4b58fcbff2 Fix anchoring on moved grid (#1885) 2021-07-23 10:16:19 +02:00
metalgearsloth
f83f6a8cd6 Remove manifolds from collision events
Nothing uses em anymore.
2021-07-23 13:06:24 +10:00
metalgearsloth
dfd7711506 Stop EndCollision from throwing exceptions
Won't fix the underlying problem but will log it and handle it more gracefully at least until I can reproduce it.
2021-07-23 13:03:54 +10:00
Pieter-Jan Briers
78f9d92c07 Add exception tolerance to DispatchEntityNetworkMessage. 2021-07-22 23:27:39 +02:00
Paul
3a86c827ea made xamlil errors show up in msbuild 2021-07-22 20:01:15 +02:00
metalgearsloth
325f25c547 Fix occluders for moved grid (#1878)
* Refactor occluders

* Copy pasting

* Reduce bounds

* Clear system updates on shutdown
2021-07-22 13:07:45 +10:00
Pieter-Jan Briers
be57b5d20b Add AnyCommandExecuted callback to IConsoleHost.
Intended use case here is for content to listen to ConCmds for AFK detection.
2021-07-21 21:32:32 +02:00
Pieter-Jan Briers
7124d86f94 Allow localization to pass through TimeSpan values. 2021-07-21 18:58:43 +02:00
Pieter-Jan Briers
229380a71d Add TimeSpan read/write helpers to NetMessageExt 2021-07-21 16:25:15 +02:00
metalgearsloth
e9eb536df5 Don't get fixture pairs if they're deleted 2021-07-21 23:08:10 +10:00
metalgearsloth
22297ef6d8 Out of the way System.Numerics 2021-07-21 21:14:41 +10:00
metalgearsloth
7f2e433087 Broadphase refactor (#1848)
* Broadphase refactor

* Stuff

* Working

* TODO

* Changes

* Which fucking madman came up with this shit

* Known gud state

* Kinda shitcodey but it works so fuck it doin it live

* Shuttle jankiness

* Refactor entitylookups to be 30% more based

* Refactor gucci

* Done?

* Fix most tests

* nothing suss

* Vera single-handedly saving shuttles

* fex

* Fix renderingtreecomp for relativity

* Fix IEntityLookup

* Fixes

* Testing jank please revert some of it before merging

* Fix the remaining bugs

* Fix crash

* Fix grid physics initialization

* Shuttle collisions working

* Fixes

* Fixes

* Velocity on transfers

* Velocity on parent change

* Fixes

* world angular velocity too

* Slightly faster map velocities

* showbb revert

* Sketch grids kinda workin

* Fix PVS contact crash

* Cleanup gridfixture updates 0.1%

* Grid fixtures

* AAAAAAAAAAAAAAA

* a

* termp

* Fixes

* Test reversion reversion?

* Tests

* Fix Equals

* Slight box2i cleanup

* Better initializer

* Fix merge issues

* Shuttles go BRRT

* Remove MoveProxy from DynamicTreeBroadphase

* Optimise a shit tonne

* Approx

* fix showbb

* clean

* Slightly more optimised

* My almonds are activating

* Contact transform caching

* Avoid duplicates

* Typo

* Logger

* Jitter 1% better

* Okay shit maybe that's not it.

* Contact fixes

* Move check thingy up front

* Revert some jank caching

* Contact filtering

* Fix master merge

* Test fixes

* Re-fix MapLoaderTest

* Use proxies instead

* uhh wtf?

* Woops

* Fix collisions

* Fix grid fixture generation

* Fix deserializing

* Tile window fix

* Cleanup broadphase

* Bit more cleanup

Co-authored-by: metalgearsloth <metalgearsloth@gmail.com>
2021-07-21 21:12:58 +10:00
Pieter-Jan Briers
18c32a0258 Don't ServerSendToAll to channels without completed handshake. 2021-07-21 03:06:32 +02:00
Pieter-Jan Briers
72314a102d EventBus improvements
Can do ordered session event subscription.

Can subscribe to "All" in one call, to reduce shared boilerplate.
2021-07-21 00:56:42 +02:00
Pieter-Jan Briers
719ea26a31 IConfigurationManager.UnsubValueChanged. 2021-07-20 17:26:52 +02:00
metalgearsloth
5cb8fe1897 End IEndCollide (#1874) 2021-07-20 17:01:30 +02:00
metalgearsloth
f35a52fc24 Change KinematicControllerCollision to use WorldNormal instead (#1872)
Content cares about the WorldNormal and not the LocalNormal so this fixes pushing bugs.
2021-07-19 10:17:39 +02:00
metalgearsloth
6bdb0cef47 Fix IMapGrid WorldToLocal + LocalToWorld (#1871) 2021-07-19 10:17:15 +02:00
Pieter-Jan Briers
fe3c9fe28f Fix late nwVar warning on connect. 2021-07-19 10:16:24 +02:00
Pieter-Jan Briers
6085671f22 Fix memory leak with physics islands and contact solvers.
They were doing config OnValueChanged for every instance and, as such, never getting released.
2021-07-19 10:06:20 +02:00
Visne
a2398da324 Replace most VBox/HBoxContainers with BoxContainers (#1867) 2021-07-18 18:42:08 +02:00
Pieter-Jan Briers
b27304cc58 Add System.Index and System.Range to sandbox whitelist. 2021-07-17 23:51:57 +02:00
Swept
3bf851a6cf FPS Counter no longer shows a decimal 2021-07-17 16:46:09 +00:00
Pieter-Jan Briers
cef92efd0f NetManager now enforces that only specific messages can be sent before serializer handshake completes. 2021-07-17 14:37:40 +02:00
Pieter-Jan Briers
c5961a5ab1 Fix possible race condition in net var handling and improve logging. 2021-07-17 14:37:35 +02:00
Pieter-Jan Briers
8ddd92993d Don't do initial net var stuff on server. 2021-07-17 02:03:37 +02:00
Pieter-Jan Briers
da253a5f34 Log user ID correctly on connection approval 2021-07-17 02:02:59 +02:00
Pieter-Jan Briers
ca9400a1ff Don't log encryption secrets on auth handshake. 2021-07-17 01:24:39 +02:00
Pieter-Jan Briers
f232195ceb Fix audio log warning not using interpolated string correctly. 2021-07-17 01:17:23 +02:00
Pieter-Jan Briers
b54a803519 Add ToString to NetChannel.
Some things already try to log like this so let's just go with it.
2021-07-17 01:16:47 +02:00
Vera Aguilera Puerto
a0d3d2108f Use ResourcePath instead of Path.Join 2021-07-16 21:48:19 +02:00
Vera Aguilera Puerto
977e4a017b Fixes tile window hardcoding tile sprites. 2021-07-16 08:21:58 +02:00
Swept
2d8b159016 Updates the dumb shit stupid path for tile window 2021-07-16 05:38:19 +00:00
Visne
9caa0dde4b Remove unused IEntityManager parameter from EntityCoordinates.FromMap() (#1866) 2021-07-15 18:51:11 +02:00
Pieter-Jan Briers
7a5a8c5eb1 Remove unused Process.WaitForExitAsync helper.
.NET 5 has its own implementation so we use that now.
2021-07-15 10:07:52 +02:00
Swept
95ba58f0a4 Fixes SpriteComponent error reporting 2021-07-14 22:41:51 +00:00
metalgearsloth
f780f04784 Deprecate PhysShapeGrid (#1862)
* Grid fixtures

* termp

* Fixes

* Test reversion reversion?

* Tests

* Fix Equals

* Slight box2i cleanup

* Better initializer

* Also add static grid assert
2021-07-14 18:47:17 +10:00
Pieter-Jan Briers
695b4ce8f2 Merge branch 'master' into robust-client-CEF 2021-07-13 17:22:20 +02:00
Pieter-Jan Briers
85782bda92 Make Split- and BoxContainer orientation adjustable, obsolete subtypes. 2021-07-13 17:21:21 +02:00
metalgearsloth
14a01df5b1 Add physics stacking tests (#1865)
Ported from content; only reason for PR is to make sure remote tests are also gucci.
2021-07-13 18:43:09 +10:00
metalgearsloth
644da60bfc ContactCount VV (#1864) 2021-07-13 14:11:27 +10:00
Pieter-Jan Briers
8c83999ad2 Make window creation synchronous.
The async code path isn't really async and if we ever make it so (by using a non shit rendering API) I'll just make it implicitly asynchronous.
2021-07-13 03:39:38 +02:00
Pieter-Jan Briers
24b9fc9eec Add ImageSharp to script console assemblies. 2021-07-12 17:26:54 +02:00
metalgearsloth
ba40185179 Make entitylookup grid-relative (#1849)
* Refactor entitylookups to be 30% more based

* Refactor gucci

* Done?

* Fix most tests

* nothing suss

* Vera single-handedly saving shuttles

* fex

* Copy lookup from shuttles

* sys

* comp recursion
2021-07-12 13:39:02 +02:00
Vera Aguilera Puerto
8b013cb424 Fix engine integration tests not generating Net IDs. 2021-07-12 10:42:38 +02:00
Vera Aguilera Puerto
b67d24efee ITileDefinition now has a Path string that ClydeTileDefinitionManager uses (#1860) 2021-07-12 10:29:13 +02:00
mirrorcult
d992e47f30 Remove NetMessage deprecated boilerplate entirely (#1830)
* Remove NetMessage boilerplate in favor of virtual properties

* forgot some stuff
2021-07-12 10:28:46 +02:00
Acruid
dadd7b4cc3 Remove Static Component NetIds (#1842)
* ComponentNames are not sent over the network when components are created.

* Removed ComponentStates array from EntityState, now the state is stored directly inside the CompChange struct.

* Remove the unnecessary NetID property from ComponentState.

* Remove Component.NetworkSynchronizeExistence.

* Change GetNetComponents to return both the component and the component NetId.

* Remove public usages of the Component.NetID property.

* Adds the NetIDAttribute that can be applied to components.

* Removed Component.NetID.

* Revert changes to GetComponentState and how prediction works.

* Adds component netID automatic generation.

* Modifies ClientConsoleHost so that commands can be called before Initialize().

* Completely remove static NetIds.

* Renamed NetIDAttribute to NetworkedComponentAttribute.

* Fixing unit tests.
2021-07-12 10:23:13 +02:00
Paul Ritter
baef2bc7f8 some misc serv3 fixes (#1861)
adds a typeserializer
adds null parser to read
adds another overload for deserializationresult.value

Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
2021-07-11 15:44:12 +02:00
metalgearsloth
e0b1a7d64a Add Contains Vector2 method to Box2Rotated (#1851) 2021-07-11 22:49:59 +10:00
metalgearsloth
aea5f83002 Preserve world velocities on parent change (#1859)
* Preserve world velocities on parent change

* Faster func

* Test

* lag

* uhh LAAAGGG
2021-07-11 12:25:02 +10:00
Swept
7df2d1f430 Fixes console loc string (#1858) 2021-07-09 15:13:30 +02:00
Vera Aguilera Puerto
d7ecc0883f Merge branch 'master' into robust-client-CEF 2021-07-08 10:00:46 +02:00
Vera Aguilera Puerto
d216c3a1f6 VV command can now get IoC services that don't have an interface. 2021-07-07 18:03:20 +02:00
Vera Aguilera Puerto
44b17edff6 Fix failing unit test. 2021-07-06 10:38:48 +02:00
Pieter-Jan Briers
6366c2383a Request handling API. 2021-07-06 02:07:17 +02:00
Pieter-Jan Briers
ddbbe22bda Make RobustCefApp internal. 2021-07-05 23:41:01 +02:00
Pieter-Jan Briers
6880af0d8b Lifetime management for BrowserControl
Correctly shuts down all resources when removed fromt ree.
2021-07-05 23:35:16 +02:00
Vera Aguilera Puerto
6f258b1822 Fix multi process mode on Linux. 2021-07-05 23:10:19 +02:00
Pieter-Jan Briers
2cf3ed8a70 External window lifetime management. 2021-07-05 21:58:43 +02:00
Pieter-Jan Briers
c6f10a1321 Don't make a RobustCefApp in CEF sub processes. 2021-07-05 20:26:16 +02:00
Vera Aguilera Puerto
41ab9b106f Add RobustCefApp, CefManager no longer inherits CefApp. 2021-07-05 20:22:00 +02:00
Pieter-Jan Briers
0d97569576 Implement mouse modifiers. 2021-07-05 20:18:54 +02:00
Pieter-Jan Briers
0a21d402b2 Apparently I didn't disable disable GPU properly. 2021-07-05 20:16:50 +02:00
Pieter-Jan Briers
c6827fe8ae Merge remote-tracking branch 'origin/robust-client-CEF' into robust-client-CEF 2021-07-05 18:23:05 +02:00
Pieter-Jan Briers
0c94956be1 Various degrees of work on input stuff. 2021-07-05 18:21:47 +02:00
Pieter-Jan Briers
1e7a193d5e Raise scroll speed 2021-07-05 11:44:42 +02:00
Vera Aguilera Puerto
eb4ea8aa63 Adds a few APIs to IBrowserControl and implements them where needed 2021-07-05 11:23:44 +02:00
Pieter-Jan Briers
af1a3d965d Actually shut down loaded modules on client 2021-07-05 10:27:21 +02:00
Pieter-Jan Briers
26fed40ad4 Remove fixed TODO comment 2021-07-05 10:24:10 +02:00
Pieter-Jan Briers
c6c6309eff Disable disable GPU 2021-07-05 10:05:10 +02:00
Pieter-Jan Briers
7188eeb0c8 Add external window creation API 2021-07-05 09:37:04 +02:00
Pieter-Jan Briers
d74b22a4e8 Engine API for fetching win32 HWND. 2021-07-05 09:05:59 +02:00
Pieter-Jan Briers
75de717b4e Enable CEF multi-process mode. 2021-07-05 08:00:16 +02:00
Pieter-Jan Briers
a00fc75b61 BrowserControl less inefficient rendering 2021-07-05 07:59:56 +02:00
Pieter-Jan Briers
dcbb6608df Improve clyde SetSubImage.
1. better perf.
2. code cleaned up
3. span-based API.
2021-07-05 07:55:52 +02:00
Pieter-Jan Briers
e4d0e50000 Add Robust.Client.CEF to InternalsVisibleTo 2021-07-05 07:46:59 +02:00
Pieter-Jan Briers
e5a2ab284b Merge branch 'master' into robust-client-CEF 2021-07-04 19:56:41 +02:00
metalgearsloth
986ec3ef06 Do showbb transforms in the iterator (#1847) 2021-07-04 19:52:21 +02:00
Vera Aguilera Puerto
3ac1506f17 Add correct license header to BitmapBuffer 2021-07-04 18:22:04 +02:00
metalgearsloth
60cec9cb84 Make showbb awakeness binary (#1846)
Makes it easier to spot mapping issues because otherwise it might have a massive sleep timer and not be easily visible.
2021-07-04 22:31:34 +10:00
Vera Aguilera Puerto
c06707d519 Adds ServerOptions, improve GameControllerOptions, fix engine integration tests (#1844)
* Adds ServerOptions, improve GameControllerOptions, fix engine integration tests

* Do component auto-registration in engine integration tests by default

* Fix integration tests on content, register components ONLY if not contentstarted or options are null

* Add integration test for engine integration tests working correctly

* Move cvar overrides out of content and into engine.
2021-07-03 15:19:46 +02:00
Pieter-Jan Briers
63128324ab Stop RunTicks overriding tick deltas in integration tests.
Now listens to game timing tick rate.
2021-07-03 13:06:19 +02:00
Vera Aguilera Puerto
c85bb81606 Add initial CEF integration to engine. 2021-07-02 23:31:37 +02:00
Pieter-Jan Briers
abea3024b4 Raise event when entity paused state changes. 2021-07-02 17:19:34 +02:00
Pieter-Jan Briers
07dafeb6cd Can now rotate anchored entities 2021-07-02 01:16:25 +02:00
Pieter-Jan Briers
a726d42ae3 Fix ResetPredictedEntities applying data early in some cases.
FullState was getting updated before ResetPredictedEntities ran instead of after. So ResetPredictedEntities was applying data to stuff like containers that depends on entities that hadn't been made yet.
2021-07-01 12:16:18 +02:00
metalgearsloth
d02d186a2f Fix light pop-in 2 (#1798)
* Fix light pop-in

Doh

* Uniqueness

* Refactor to be less bad

* Better perf

* Fix perf problems

* Hide debug commands under preprocessor

Can't imagine anyone using this during live-game.

* CVars
2021-06-29 22:29:47 +10:00
Vera Aguilera Puerto
a6be66949d Fix segfault when MIDI renderer is disposed.
Apparently? You need to dispose of the sequencer BEFORE the synth or a funny segfault will occur... T-Thanks libfluidsynth.
Also unregisters the sequencer clients before disposing, just for cleanliness.
2021-06-28 10:59:20 +02:00
Galactic Chimp
0dfd3b7443 #1462 extracted MapGrid's HasGravity property to separate Content component (#1835) 2021-06-27 15:01:58 +10:00
metalgearsloth
6f90e9a76e MapGridSystem for grid initialization (#1838)
* MapGridSystem for grid initialization

Doesn't seem to be a clean way to hook into grids being initialized (can't duplicate directed bus events and a few systems need to EnsureComponent) hence the event.

* Address reviews
2021-06-27 14:59:38 +10:00
Galactic Chimp
9246b88560 #1607 deprecate IEntityQuery (#1837)
* #1607 partial progress

* #1607 almost done

* #1607 small test tweak

* #1607 PR suggestions

* #1607 PR suggestions

* #1607 indentation tweaks
2021-06-27 13:40:00 +10:00
Vera Aguilera Puerto
61af9db362 Fix bug where anchored entities would be spawned at 0,0 always.
This is because the parent was attached first, and then the Entity Coordinates are set, but position doesn't change because the parent is the same and the entity is anchored.
NOTE: I only fixed the EntityCoordinates overload. Unsure if this is even a problem with MapCoordinates.
2021-06-24 21:41:39 +02:00
Vera Aguilera Puerto
5aa950e7f7 GetTilesIntersecting yield returns instead of creating, populating and returning a list of tiles. 2021-06-23 12:40:31 +02:00
Pieter-Jan Briers
b8903af52f Make public DrawingHandleScreen.DrawString helper method.
This method was copy pasted into 4 separate overlays already.
2021-06-23 01:42:47 +02:00
Pieter-Jan Briers
5b35c4e82b Fix disposed exception on client shutdown (I think?). 2021-06-23 01:26:16 +02:00
metalgearsloth
06db80780c Filter contacts for joints properly (#1836)
If you're colliding with something you obtain a joint with it should be filtered correctly now.
2021-06-21 02:27:07 +02:00
Acruid
e5fd4f5700 DependencyCollection Children (#1833)
Adds a new register function for registering a simple Type without an interface.
2021-06-21 02:15:23 +02:00
Galactic Chimp
e1a199e060 Removed old Loc.GetString() use instances (#1814)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2021-06-21 02:12:53 +02:00
Pieter-Jan Briers
22ac34c7a1 Are you for real, .NET CLI. 2021-06-21 02:01:55 +02:00
Pieter-Jan Briers
04fa6901b1 Fix ordering of command arguments.
Dumb CLI.
2021-06-21 01:57:09 +02:00
Pieter-Jan Briers
8f7d4211e3 Try server GC for content integration tests. 2021-06-21 01:53:40 +02:00
Pieter-Jan Briers
1147d6fd9a Do not cache injector delegates for entity system creation. 2021-06-21 01:44:36 +02:00
Pieter-Jan Briers
e4449c4901 Cache data definitions statically.
Significantly improves integration test times.
2021-06-21 01:31:13 +02:00
Pieter-Jan Briers
dc8963faa5 Use a no-op mapped string serializer in integration tests.
Serialization never happens in integration tests, so...
2021-06-21 01:29:51 +02:00
Pieter-Jan Briers
f9cf9a8fd4 Single-threaded integration tests experiment.
This didn't really seem to improve performance, so it's not enabled, but I'm not deleting the code.
2021-06-21 00:38:37 +02:00
Pieter-Jan Briers
393bdc04bc ItemList doesn't render things outside its clip region. 2021-06-20 19:48:24 +02:00
Pieter-Jan Briers
db4d787b49 use a struct enumerator for EventTables GetReferences. 2021-06-20 18:50:43 +02:00
Pieter-Jan Briers
cd802d6a66 Fix more nullrefs due to dummy sprite IEntity. 2021-06-20 18:50:29 +02:00
Pieter-Jan Briers
be2281a5b3 Remove glue code to allow components to subscribe to EventBus.
No. Just no.
2021-06-20 18:10:21 +02:00
Pieter-Jan Briers
e717396b33 MapManager uses directed remove event instead of hooking global ComponentRemoved event. 2021-06-20 18:07:24 +02:00
Pieter-Jan Briers
db0e49f5dd Defer SpriteComponent.IsInert updates.
Prevents O(n^2) behavior in many cases.
2021-06-20 17:57:45 +02:00
Pieter-Jan Briers
d3b94aa6af Fix name generator xaml file locating logic.
It would do .EndsWidth(), so DropDownDebugConsole and DebugConsole would get confused.

It now properly checks for path separators and also will report an error if there are two candidate XAML files.

Also, fixed the AXN0003 diagnostic having the wrong name.
2021-06-20 15:48:48 +02:00
Acruid
713f702064 Engine Entity Anchoring (#1829)
* Added unit tests for the new anchor system design.

* Amend ME!

* SnapGridComponent now anchors the entity when added or removed.
TransformComponent.Anchored properly replicates it's state to clients.

* Converted all SnapGridPositionChangedEvent subscriptions to AnchorStateChangedEvent.
Removed SnapGridPositionChangedEvent.
Obsoleted SnapGridComponent.

* Allows setting Transform.Anchored in prototypes.

* Changing tile to empty under anchored ents unanchors them.

* More unit testing.

* Migrated transform gamestate tests to RobustServerSimulation.

* Fixed nasty off-by-one error when sending a full server state.

* Adds lifetime stages to Component.

* More test fixing.

* Review changes.
2021-06-19 17:26:18 -07:00
Pieter-Jan Briers
d0b6a9b28c Replace usages of OperatingSystem.IsOSPlatform with OperatingSystem.IsXXX(). 2021-06-19 03:14:39 +02:00
Pieter-Jan Briers
4003781a1b Manually load libEGL.dll to fix ANGLE in dev builds. 2021-06-19 03:05:15 +02:00
Acruid
40586a8f0e Removes all engine component events. (#1832) 2021-06-18 10:44:21 +02:00
metalgearsloth
f4d427f5c5 Pre-reqs for multithreaded physics (#1784)
* Tanks off guard

* Medic

* Diamondback

* Gaming

* Gamingo

* Finalise

* Doh

* Bullet licence

* Marginal cleanup

* Physics licences

* Apply reviews
2021-06-17 16:01:41 +10:00
metalgearsloth
ce2a4282f3 Bandaid GridTileLookup containers (#1789)
* Bandaid GridTileLookup containers

I'm hoping tile entities deprecates this system but this should fix our problems for now.

* Fix stupid
2021-06-16 16:18:23 +02:00
Ygg01
0cc78c1402 Add missing types to type conversion (#1828) 2021-06-15 10:22:24 +02:00
Pieter-Jan Briers
fa0d4da6d1 Implement subscription ordering into EventBus. (#1823)
* Implement subscription ordering into EventBus.

* Topological helpers, rest of code uses shared topological sort, fix bugs.

* Fix tests.

Didn't realize that multi-subscriptions are allowed on input handlers like that??

* Improve and use topological sort helpers more.
2021-06-14 21:34:30 +02:00
Ygg01
33334d6f5c Upgrade Linguini to latest (prevents IDE issue with SG) (#1826) 2021-06-13 22:16:12 +02:00
ShadowCommander
55aba93faf Revert "Update Linguini"
This reverts commit 4f49296a94.
2021-06-13 08:38:01 -07:00
ShadowCommander
4f49296a94 Update Linguini 2021-06-13 08:34:57 -07:00
Vera Aguilera Puerto
65357ee8da ComponentHandleState event (#1778) 2021-06-12 15:50:27 +02:00
Vera Aguilera Puerto
bfcad4001b Adds public methods to ActorSystem. (#1824) 2021-06-12 15:50:01 +02:00
DrSmugleaf
5a3000febb Add directed events for player attach/detach (#1815) 2021-06-12 01:45:43 +02:00
DrSmugleaf
2d236670ab Add SetAndDirtyIfChanged extension method (#1816) 2021-06-12 01:44:28 +02:00
20kdc
796f1480a8 Add more tolerance for if player sessions are connected to dead entities (#1818)
* Add more tolerance for if some calamity causes a player session to be connected to a dead entity

* Fix build issues w/ previous commit (oops)
2021-06-10 09:29:25 +02:00
Ygg01
a8ee7be844 Add linguini loc (#1760)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>
2021-06-09 19:44:18 +02:00
metalgearsloth
60b506cb2a Fix GetWorldAABB again (#1802)
No weird-ass bug this time. There was also an issue where occasionally the AABB on the client would disappear if you had a bunch of objects and used showbb but I think it's fixed now.
2021-06-09 12:25:08 +10:00
metalgearsloth
66117e35ba Don't store lights in rendertree if not enabled (#1803) 2021-06-09 01:37:40 +02:00
metalgearsloth
22cfee4f01 Don't store non-visible / occluded sprites in rendertree (#1805)
Sister commit to the point-light one.
2021-06-09 01:33:24 +02:00
metalgearsloth
d9355e576f Remove PhysicsManager (#1812)
Goodnight sweet prince
2021-06-09 01:26:51 +02:00
Vera Aguilera Puerto
e54e33edb0 Client Networked event subscriptions can now take in EntitySessionEventArgs (#1817) 2021-06-09 01:22:20 +02:00
mirrorcult
25881ce343 MapInit ECS event (#1813)
* MapInit ECS event

* allocs
2021-06-08 22:33:21 +02:00
Acruid
f64197c189 Removes the map and grid entity pivot hack from clientside map networking. (#1811) 2021-06-08 02:45:02 -07:00
metalgearsloth
a7ec907f1d Remove mass from physics comp state (#1810)
Deprecated by fixtures storing mass
2021-06-07 13:56:21 +10:00
metalgearsloth
81272b0bc8 Reduce rendertree allocs (#1806) 2021-06-06 14:50:31 +02:00
metalgearsloth
25c1c6ef91 Fix rendertree updatequeued (#1804)
Woulda pushed directly but I cooked my git so ya know, nothing to see here
2021-06-06 19:25:27 +10:00
ShadowCommander
d1a83134e3 Fix SpriteView when UI is scaled 2021-06-05 19:47:26 -07:00
metalgearsloth
71c2993d20 Add joint support for CollisionWakeComponent (#1794)
* Add joint support for CollisionWakeComponent

* Less bad

* Fix heresy
2021-06-05 18:16:06 +10:00
Galactic Chimp
14fa616723 #1224 removed obsolete FloatMath class (#1800) 2021-06-03 00:11:19 +02:00
metalgearsloth
d46ea9c9ba Add gridtilelookup debugger back in (#1792)
Was reverted from the broadphase PR.
2021-06-01 11:58:44 +10:00
ShadowCommander
ea00ccb34f Fix window not calling OnMouseExited 2021-05-31 18:56:23 -07:00
Pieter-Jan Briers
8e416bb3cb Fix error in RenderingTreeSystem.
Seems related to #1754? Doesn't seem to fix it though.
2021-06-01 00:01:36 +02:00
Galactic Chimp
8e0a26073d #1765 - replaced 3 try-catch clauses with if-else clause + VS autoformat of affected files (#1796) 2021-05-31 22:49:23 +02:00
metalgearsloth
9fa24948ea Fix EntitySystemManagerOrderTest (#1793) 2021-05-31 13:20:09 +02:00
metalgearsloth
b9a9cc4b0f Revert "Immediate broadphase updates (#1687)" (#1790)
This reverts commit ee6aee57bd.
2021-05-31 20:33:29 +10:00
Pieter-Jan Briers
a67345f9bf Add debug log for runtime/OS info on game start. 2021-05-31 10:48:30 +02:00
Pieter-Jan Briers
2a022f39bd Add system for loading extra serializer strings.
"fixture-0" comes up a LOT so we load this manually now.
2021-05-31 10:48:30 +02:00
Vera Aguilera Puerto
a3ba969589 Container modified events are raised directed to the container owner. 2021-05-31 10:14:02 +02:00
metalgearsloth
21e1b75f5d Remove ICollideSpecial entirely (#1782)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2021-05-31 09:41:11 +02:00
metalgearsloth
1f6ddd96a6 Optimise the shit out of showpos (#1788) 2021-05-31 09:11:29 +02:00
metalgearsloth
b4d2cd26aa Named joints (#1787)
1 step closer to ECS physics.
2021-05-31 09:01:02 +02:00
metalgearsloth
ee6aee57bd Immediate broadphase updates (#1687) 2021-05-31 08:58:23 +02:00
DrSmugleaf
ac1705e41f Make NetMessage name and group virtual to remove required boilerplate (#1770) 2021-05-31 08:53:46 +02:00
metalgearsloth
196a6047f1 Use Box2D FindMaxSeparation (#1786) 2021-05-31 08:52:01 +02:00
ShadowCommander
b98b36a461 Add loglevel command line arg (#1769) 2021-05-31 08:41:34 +02:00
mirrorcult
9980a98a94 Add new fluent functions for words that change based on gender (#1775) 2021-05-31 08:41:06 +02:00
Pieter-Jan Briers
5a1a1d0420 Add component names to string serializer. 2021-05-30 22:55:33 +02:00
ShadowCommander
1c99678fe9 Change other physics awake event calls to RaiseLocalEvent 2021-05-30 12:16:17 -07:00
ShadowCommander
4049f10faa Make awake dispatch local events (#1785) 2021-05-30 21:05:16 +02:00
metalgearsloth
331c0bd43f Fix PreventCollideEvent (#1781)
With directed bus it's better to raise it both ways for a collision.
2021-05-30 18:38:28 +02:00
metalgearsloth
604cd2f93d Fix physics nullrefs (#1780)
* Fix physics nullrefs

* woops
2021-05-30 05:15:22 -07:00
Vera Aguilera Puerto
a87db2e57c EntitySystemManager uses IRuntimeLog for exception logging. 2021-05-30 12:27:36 +02:00
ShadowCommander
4c7f0a8d6b Add container helper for entity storage interaction (#1777) 2021-05-29 11:40:36 +02:00
20kdc
9eaf52886a Make RenderingTreeSystem handle parent recursion properly, fixing space-station-14#4040 and possibly other bugs (#1776) 2021-05-29 11:39:35 +02:00
Vera Aguilera Puerto
fce6f6c714 Adds ActorSystem to handle Attaching/Detaching players to/from entities sanely. (#1774) 2021-05-29 11:37:34 +02:00
DrSmugleaf
c04d51d489 Add test for YAML hot reloading (#1773)
* Add test for YAML hot reloading

* Perhaps test the event firing as well
2021-05-27 15:50:44 +02:00
Vera Aguilera Puerto
d310871aa6 CVar for MIDI volume. 2021-05-26 19:27:02 +02:00
Vera Aguilera Puerto
5fa422865f AudioSystem warning now prints audio stream name, if any. 2021-05-26 18:56:30 +02:00
Vera Aguilera Puerto
c137823355 Proper cleanup when detaching player from a deleted entity. 2021-05-26 18:44:37 +02:00
Vera Aguilera Puerto
0a0026b9ae Add formatted message newline helper method. 2021-05-26 10:18:27 +02:00
Pieter-Jan Briers
97a2a5cfae Block loading of R2R'd .NET assemblies in sandboxing. 2021-05-25 16:57:54 +02:00
Pieter-Jan Briers
a266e21d9e Add single-type IoC register call. 2021-05-24 22:05:15 +02:00
Pieter-Jan Briers
ad8bbe6401 Clyde audio improvements:
1. Allow loading audio directly from a sample buffer
2. SetVolumeDirect that takes a 0 -> 1 scale similar to OpenAL's AL_GAIN.
3. Fix OpenAL threading bugs with logging by caching the sawmill.
2021-05-23 22:58:32 +02:00
Pieter-Jan Briers
71ce4749fe Show active input context on DebugInputPanel. 2021-05-23 22:58:32 +02:00
Pieter-Jan Briers
1e33c3c843 MIDI renderer debugging code. 2021-05-23 22:58:32 +02:00
Vera Aguilera Puerto
b3f3ca9725 MIDI renderer uses NumericsHelpers to convert stereo audio to mono. 2021-05-23 13:40:06 +02:00
Vera Aguilera Puerto
33c37393ba Fixes incorrect comment in MidiRenderer.
Pain.
2021-05-23 13:15:31 +02:00
metalgearsloth
ae36529744 Emit line for mapping node exceptions (#1764)
Makes it a billion times more useful when I dun screwed up
2021-05-22 11:36:28 +02:00
20kdc
ed2be48864 Fix Coordinates setter destroying local position during a parent change by migrating parent changes to it (#1763)
This fixes computer boards going missing. (Seriously.)
2021-05-22 11:36:18 +02:00
Vera Aguilera Puerto
7ad5ce302e Directed event improvements (#1761)
* IComponentManager holds a reference to IComponentFactory.

* Directed events for a same <TComp, TEvent> can be duplicated, component references of a component are added to the entity's event tables.

* Fix tests.

* Improvements, duplicated subscriptions are no more

* Cache component factory for faster access

* when the
2021-05-21 17:38:52 -07:00
Vera Aguilera Puerto
647f1a6808 Fixes bug where deleting things causes their sprite to appear and pile on 0,0.
- Cleans up an unneeded event.
2021-05-20 21:17:20 +02:00
metalgearsloth
6c44dd9665 RenderingTreeSystem cleanup (#1759)
* RenderingTreeSystem cleanup

10% less bad but 100% still boilerplate

* Slight changies

* Even better

* New shit just got made

* Apply revews
2021-05-20 18:57:29 +10:00
Acruid
c81413b0b4 Fixes bug where the net_entityreport red PVS range square was drawn at half the actual range. 2021-05-19 15:52:44 -07:00
Vera Aguilera Puerto
88b3a557da Fixes bug with PrototypeIdListSerializer where lists wouldn't be copied at all. 2021-05-19 12:12:13 +02:00
Vera Aguilera Puerto
572eb01290 Opens SCSI window centered
- Kinda fixes it getting NaN'd on resize... This isn't a proper fix, however.
2021-05-19 11:11:35 +02:00
Vera Aguilera Puerto
9dab74c9d5 Fixes SS14Window going off-screen. 2021-05-19 10:55:41 +02:00
Paul
e1cb1e1b9c fixes xamlui nuking itself when one (1) (singular) partial declaration is missing 2021-05-18 20:19:50 +02:00
Vera Aguilera Puerto
a23da702b1 MidiManager now has a Volume property which changes the general midi volume.
- Adds VV attributes to MidiManager and MidiRenderer.
2021-05-18 20:03:20 +02:00
Vera Aguilera Puerto
ae9c2423ff Fixes EntityLookup not being restarted correctly on reconnect. 2021-05-18 17:55:24 +02:00
metalgearsloth
a6dae8e30a GridId caching (#1678)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2021-05-17 11:43:22 +02:00
Pieter-Jan Briers
96c0a4ae1f Automatically unsubscribe event bus registrations in entity system shutdown. (#1758)
* Automatically unsubscribe event bus registrations in entity system shutdown.

* Fix incorrect unsubscription of local events, obsolete unsubscribe methods.

That's what we got tests for.

* = null instead of .Clear()
2021-05-17 11:01:22 +02:00
Vera Aguilera Puerto
c26ebcbc78 QueueDelete method for entities (#1757) 2021-05-17 09:20:55 +02:00
Vera Aguilera Puerto
8334050411 MIDI improvements (#1756) 2021-05-16 19:28:14 +02:00
Vera Aguilera Puerto
cc67edfc2c Unsubscribe from directed event in UI System. 2021-05-15 12:40:35 +02:00
Vera Aguilera Puerto
943ea9e6c8 Shutdown and dispose of BoundUserInterfaces correctly when the UI component gets shutdown. 2021-05-14 14:25:53 +02:00
Pieter-Jan Briers
3aa5cefe03 Stop using component messages in bound UI code. 2021-05-13 03:29:38 +02:00
Pieter-Jan Briers
c5b34bab69 More obsoletions component messages. 2021-05-13 02:24:35 +02:00
Pieter-Jan Briers
e4f24ec125 Remove IPlayerSession on client. 2021-05-13 02:16:55 +02:00
Pieter-Jan Briers
250971ade7 Remove anchored APIs from physics. 2021-05-13 02:13:18 +02:00
Pieter-Jan Briers
718adf9740 Deprecate component messages harder. 2021-05-13 01:24:20 +02:00
20kdc
5d63aa8c95 Deferred Input Context Switches (fixes spawn entities menu while moving) (#1755) 2021-05-12 18:40:26 +02:00
Vera Aguilera Puerto
17af3612a5 Remove IActorComponent, rename BasicActorComponent to ActorComponent. (#1752)
Rename playerSession to PlayerSession.
2021-05-12 13:40:16 +02:00
Pieter-Jan Briers
d2ecf6b9b1 Remove CollidesOnMask
Only usage was a unit test.
2021-05-12 01:58:12 +02:00
Pieter-Jan Briers
2a1eda0d38 Fix tests 2021-05-12 01:57:03 +02:00
Pieter-Jan Briers
f0180abeb0 Missed a spot while fixing warnings. 2021-05-12 00:26:47 +02:00
Pieter-Jan Briers
720f1b1d05 Fix a bunch of compiler warnings. 2021-05-12 00:16:12 +02:00
ShadowCommander
ae45a96753 Fix error when someone else is shooting outside client PVS 2021-05-11 13:21:30 -07:00
ShadowCommander
74257c72ee Add yaml linting for entity prototype parent (#1749)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2021-05-11 21:54:51 +02:00
ShadowCommander
cea088f4b4 Change maxlinvelocity and maxangvelocity to take tickrate (#1746) 2021-05-11 21:53:36 +02:00
Pieter-Jan Briers
88678e7d58 Entity localization refactoring (#1753) 2021-05-11 21:52:54 +02:00
Pieter-Jan Briers
d222e25d22 Remove outdated comment. 2021-05-11 20:58:21 +02:00
Pieter-Jan Briers
f0d7fbb6f2 Allow enumeration of monitor video modes.
Basically I kept dumping debugging code for this into Clyde startup to test multi-monitor stuff with GLFW so I guess I'm making it official now.
2021-05-11 20:57:27 +02:00
Pieter-Jan Briers
adec0e71ec I can't believe Zumorica would clean up this class in the last 24 hours. 2021-05-11 13:30:38 +02:00
Pieter-Jan Briers
86d9067d62 Report error if prototype has invalid parent ID. 2021-05-11 13:24:42 +02:00
Vera Aguilera Puerto
b989c9dbee Remove unused IEntityQuery methods from EntitySystem. 2021-05-10 20:35:52 +02:00
Vera Aguilera Puerto
3101ec1985 Mark IEntityQuery and implementing classes as obsolete. 2021-05-10 20:25:54 +02:00
Vera Aguilera Puerto
9ec2da1777 PlayerSession comment cleanup. 2021-05-10 20:20:44 +02:00
Vera Aguilera Puerto
0acd28e8f4 Slight PrototypeManager cleanup. 2021-05-10 20:18:08 +02:00
Vera Aguilera Puerto
c340f50ee5 Remove unused dependencies. 2021-05-10 20:14:15 +02:00
Vera Aguilera Puerto
2b589215aa Improves the Filter API. (#1747)
- Recipients is now of type `IEnumerable<ICommonSession>`.
    - This way, people need to use the Filter API to modify the recipients, instead of being allowed to modify the underlying collection directly.
- Underlying collection is now a HashSet.
    - We want no duplicates at all. This will ensure that while being quite performant.
- Removes `IFilter`.
    - Let's face it, everyone is gonna end up using `Filter` instead as it has a much more convenient API, and nothing else will EVER implement `IFilter`. For this reason, I've just gone ahead and removed it. Every method used `Filter` already, anyway.
- Adds EntitySystem `RaiseNetworkEvent` overload that takes in a `Filter`.
    - This deduplicates a lot of code that enumerated the recipients and raised a network event per each one.
- Made AddPlayersByPvs aware of `net.pvs` and `net.maxupdaterange`, has a range multiplier parameter.
    - Now it will simply add all players to the filter if PVS is disabled, and add all players in range if it's enabled.
    - The range multiplier parameter allows us to make the PVS filter a bit more permissive, and generally better. The range is doubled by default, as it was already before.
- Adds `AddInRange` method to filters.
    - This is useful for the AudioSystem, and the PVS methods use it, too!
- Adds `RemoveByVisibility` method to filters.
    - This will remove all recipients that don't have a visibility flag in their entity's EyeComponent from the filter.
    - (This will be VERY useful for Ghost Pointing, for example)
- Adds `Clone` method to filters.
    - This is useful in cases where methods take in a filter and want to modify it without modifying the original instance. (See AudioSystem)
2021-05-08 22:27:47 +02:00
Vera Aguilera Puerto
490a567ad4 Makes some PlayerManager methods thread-safe. (#1744) 2021-05-08 22:27:26 +02:00
DrSmugleaf
32f0c49484 Fix missing Attribute suffix from some serialization attributes (#1741)
* Fix missing Attribute suffix from some serialization attributes

* Rename DataDefinition namespace to Definition
2021-05-07 14:23:21 +02:00
DrSmugleaf
61113d2434 Fix comments on serialization PropertyAndFieldDefinitionTest 2021-05-04 14:33:29 +02:00
DrSmugleaf
6ba1baa88c Add summary to seed data definition in Robust.Benchmarks 2021-05-04 14:26:07 +02:00
DrSmugleaf
07867acb9a Add serialization writing benchmark, optimize writing (#1739)
* Add serialization write benchmark

* Add baseline test and rename AddNode to Add in mapping extensions

* Optimize serialization writing

* Make reader delegate private

* Unhardcode baseline test
2021-05-04 14:25:13 +02:00
DrSmugleaf
3e28b083b9 Cleanup serialization markdown, add extensions for easier mapping node manipulation (#1738) 2021-05-04 13:01:07 +02:00
DrSmugleaf
68d9e13edf Fix nullability in ViewVariablesInstance onValueChanged tuple action 2021-05-04 12:08:53 +02:00
Pieter-Jan Briers
a0c0a722c9 Don't crash if window creation fails due to selected renderer. 2021-05-03 23:37:41 +02:00
Pieter-Jan Briers
bf4aead1e8 Fix margins on debug console background 2021-05-03 12:43:21 +02:00
Pieter-Jan Briers
39f0d2e974 Fix positioning and size handling when the game started in fullscreen and exited it later.
It now actually makes the non-fullscreen windows sized and placed sanely so it isn't placed offscreen and too big.
2021-05-02 23:30:50 +02:00
Pieter-Jan Briers
b20ae98f21 quit command now does soft exit, hardquit command added. 2021-05-02 23:30:50 +02:00
Acruid
7899780543 Unsubscribing from a directed entity event does not require a delegate argument anymore. 2021-05-02 14:23:48 -07:00
Pieter-Jan Briers
0c9e322b3e Fix macOS builds. 2021-05-02 21:48:58 +02:00
Pieter-Jan Briers
6005208285 Use Fluent localization for key names. 2021-05-02 21:48:50 +02:00
Pieter-Jan Briers
2b15831349 Fix fullscreen startup crashing. 2021-05-02 21:36:08 +02:00
Pieter-Jan Briers
1b2450d1cb Make debug.target_fps cvar for frame graph.
So 60 FPS isn't hardcoded anymore.
2021-05-02 20:55:46 +02:00
DrSmugleaf
5f31036ab2 Cleanup serialization code (#1735)
* Cleanup serialization code

* Merge fixes

* american codebase
2021-05-02 14:23:39 +02:00
Pieter-Jan Briers
8efffc471d Multi-window support (#1713) 2021-05-02 14:05:50 +02:00
DrSmugleaf
eb9e842027 Make SpecificPropertyInfo not return attributes on the backing field by default (#1734) 2021-05-02 13:47:32 +02:00
DrSmugleaf
f9cd9ac12a Add serialization copy benchmark, optimize copying and reading with IL generators (#1729)
* Create serialization copy benchmark

* Optimize copy generic method call

Before
|                             Method |         Mean |      Error |     StdDev |       Median |
|----------------------------------- |-------------:|-----------:|-----------:|-------------:|
|                   CreateCopyString |     43.54 ns |   0.918 ns |   0.859 ns |     43.74 ns |
|                  CreateCopyInteger |     19.33 ns |   0.388 ns |   0.860 ns |     19.24 ns |
| CreateCopyDataDefinitionWithString |  3,971.42 ns |  78.974 ns | 213.512 ns |  3,902.54 ns |
|       CreateCopySeedDataDefinition | 49,916.69 ns | 264.992 ns | 221.280 ns | 49,950.53 ns |

After
|                             Method |         Mean |      Error |     StdDev |
|----------------------------------- |-------------:|-----------:|-----------:|
|                   CreateCopyString |     43.15 ns |   0.917 ns |   1.766 ns |
|                  CreateCopyInteger |     17.91 ns |   0.366 ns |   0.305 ns |
| CreateCopyDataDefinitionWithString |    544.20 ns |   8.137 ns |   7.611 ns |
|       CreateCopySeedDataDefinition | 18,233.34 ns | 357.861 ns | 397.761 ns |

* Change populate delegate to use IL

|                       Method |        Mean |     Error |    StdDev |
|----------------------------- |------------:|----------:|----------:|
|                   ReadString |    190.7 ns |   3.48 ns |   5.63 ns |
|                  ReadInteger |    218.8 ns |   4.29 ns |   6.01 ns |
| ReadDataDefinitionWithString |    677.5 ns |  13.34 ns |  24.06 ns |
|       ReadSeedDataDefinition | 11,067.0 ns | 219.19 ns | 260.93 ns |

|                             Method |         Mean |      Error |     StdDev |
|----------------------------------- |-------------:|-----------:|-----------:|
|                   CreateCopyString |     42.69 ns |   0.926 ns |   1.414 ns |
|                  CreateCopyInteger |     18.02 ns |   0.268 ns |   0.237 ns |
| CreateCopyDataDefinitionWithString |    556.80 ns |  11.206 ns |  21.589 ns |
|       CreateCopySeedDataDefinition | 13,797.07 ns | 256.011 ns | 367.163 ns |

* Make copying use IL to get values

|                               Method |        Mean |      Error |     StdDev |
|------------------------------------- |------------:|-----------:|-----------:|
|                     CreateCopyString |    42.55 ns |   0.889 ns |   1.357 ns |
|                    CreateCopyInteger |    18.72 ns |   0.394 ns |   0.740 ns |
|   CreateCopyDataDefinitionWithString |   398.98 ns |   7.853 ns |  12.682 ns |
|         CreateCopySeedDataDefinition | 5,996.60 ns | 118.724 ns | 181.304 ns |
| BaselineCreateCopySeedDataDefinition |   340.85 ns |   6.811 ns |  12.281 ns |

* Rest in peace the fast path
For now

* Fix serialization copying not passing the target ref properly

* Fix field assigners for structs
2021-05-02 12:09:12 +02:00
Pieter-Jan Briers
8fd98c75a9 Fix finalizer stutter from post-process shaders. 2021-05-02 11:23:48 +02:00
Pieter-Jan Briers
7c008e857d Rewrite FileDialogManager to remove #if from it. 2021-05-02 09:35:38 +02:00
Pieter-Jan Briers
4de2e35e66 Add macOS CI for build-test 2021-05-02 09:25:26 +02:00
metalgearsloth
d4467acf93 Fix filedialogmanager 2021-05-02 17:16:27 +10:00
Silver
f3babcc39f Update FileDialogManager.cs 2021-05-01 19:30:45 -06:00
Silver
f491bb5571 Update FileDialogManager.cs 2021-05-01 19:20:40 -06:00
Pieter-Jan Briers
b201f10c76 Reduce some dictionary allocations in RSI loading. 2021-05-02 01:08:51 +02:00
Pieter-Jan Briers
a9208c0d29 Reduce allocations in RSIResource.LoadRsiMetadata somewhat.
Using stackallocs for the meta.json file.
2021-05-02 00:55:01 +02:00
Pieter-Jan Briers
b8cc01d872 Remove unecessary array allocation from ResourcePath constructor. 2021-05-02 00:16:52 +02:00
Pieter-Jan Briers
2d827890e9 Fix nullable errors reported by Rider. 2021-05-02 00:00:40 +02:00
Pieter-Jan Briers
f86d6ccd3c Remvoe unused .dll.config and app.config. 2021-05-02 00:00:04 +02:00
Vera Aguilera Puerto
967b76483a Fix rendering tree system crash involving nullspace.
Nullspace is a valid map, so we need to account for that!
2021-04-30 01:11:16 +02:00
Vera Aguilera Puerto
ef2c0ad8cf Fix the comp lifetime ComponentRemove event
Now, event tables DispatchComponent takes in the component reference directly.
2021-04-30 01:09:50 +02:00
metalgearsloth
9ae1352030 Enable nullables as errors in Robust (#1732) 2021-04-29 15:56:05 -06:00
SweptWasTaken
d8d9b271cc Updates sandbox.yml 2021-04-28 14:31:46 -07:00
Acruid
122acc5fd5 SnapGridComponent Removal (#1720)
* Removed SnapGridOffset, there is only center now.

* SnapGridComponent methods are now static.

* Removed SnapGridComponent.OnPositionChanged.

* Refactored static functions off SnapGridComponent to MapGrid.
Refactored away usages of SnapGridComponent.Position.

* Added Transform.Anchored for checking if an entity is a tile entity.
More refactoring for static MapGrid functions.

* Static snapgrid methods on MapGrid are no longer static.

* Removed IMapGrid.SnapSize, it is now always equal to the IMapGrid.TileSize.

* Add setter to ITransformComponent.Anchored.
Removed direct references to SnapGridComponent from content.

* Grid functions now deal with EntityUids instead of SnapGridComponents.
Began renaming public API functions from SnapGrid to Anchor.

* Add some unit tests.

* SnapGridComponent now anchors itself in startup, instead of Initialize (sending directed events in init is an error).
2021-04-28 10:24:11 -07:00
metalgearsloth
32dea84196 Fix physics build warnings (#1731) 2021-04-28 15:29:51 +02:00
DrSmugleaf
91d58dbca4 Make serialization work with backing fields automatically (#1727)
* Make serialization work with backing fields automatically

* Fix not taking priorities into account, make the test fail when that is the case

* Turn fieldDefs back into a list

* Format it better

* Remove GetInheritanceBehaviour, expose immutable array of base field definitions
2021-04-27 14:11:06 +02:00
MehimoNemo
c54b1572f5 Unbuckling Closes Inventory UI (#1723)
* pain

* Add test for parent changed when not at 0,0

* Fix map loading of grids

Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com>
2021-04-26 12:26:29 -07:00
DrSmugleaf
1fa979c0f6 Add serialization manager shutdown method and initialize benchmark (#1728) 2021-04-25 13:00:31 -07:00
metalgearsloth
760599171d Obsolete collision interfaces (#1725) 2021-04-25 12:58:30 -07:00
metalgearsloth
10d295d535 Basic Collisionmanager tests (#1722)
* Add some unit tests for CollisionManager
2021-04-25 12:49:45 -07:00
ShadowCommander
0047c5000f Fix placement of grid tiles on the edge of a grid (#1724)
* Fix placement of grid tiles on the edge of a grid
2021-04-25 12:48:26 -07:00
metalgearsloth
810a6d190f Add MapId error to tp command (#1726)
Previously it would just dump the exception
2021-04-25 04:12:28 -07:00
metalgearsloth
197227dcf6 Fix showbb
matrices momento
2021-04-25 19:03:19 +10:00
Swept
fa23ec8fc6 Updates the README.md 2021-04-23 19:23:54 +00:00
Vera Aguilera Puerto
6506171ea0 Server ContentStart.StartLibrary method.
This will skip the FULL_RELEASE check on games specifically using RobustToolbox as a library.
2021-04-23 20:37:45 +02:00
Vera Aguilera Puerto
8bd1e72e9f Adds GameController options for games using RobustToolbox as a library. (#1711) 2021-04-23 00:05:42 +02:00
Acruid
4ce6629ace RSIs fail to load if they have duplicate states defined in their JSON. (#1701) 2021-04-22 15:21:34 -06:00
Vera Aguilera Puerto
f9ef605903 Add optional AwaitEvent methods that take a Type instead of using generics. 2021-04-21 15:29:43 +02:00
Vera Aguilera Puerto
c6b74e998f Use System.Numerics in a few Box2 methods to speed them up (#1708) 2021-04-19 17:18:09 +02:00
Vera Aguilera Puerto
c4946b8466 Viewport Improvements (#1528)
Co-authored-by: 20kdc <asdd2808@gmail.com>
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2021-04-19 09:47:20 +02:00
Pieter-Jan Briers
ffa908bf27 More workarounding for Rider Avalonia faking 2021-04-19 01:47:33 +02:00
Pieter-Jan Briers
0d37ff3f20 Fix reporting of fatal GLFW errors on window creation. 2021-04-19 01:44:00 +02:00
Pieter-Jan Briers
7aecdcf70a Improved soft shadows. 2021-04-19 01:42:59 +02:00
Vera Aguilera Puerto
70f82d6db8 Add directed start/end collision events. (#1710) 2021-04-17 13:08:11 +02:00
Vera Aguilera Puerto
20b7870739 PlayerSession is now correctly setup on singleplayer 2021-04-17 01:52:07 +02:00
Vera Aguilera Puerto
172639baea Fix bug where TickUpdate is never ran in singleplayer mode. 2021-04-16 13:37:01 +02:00
metalgearsloth
6038483b1e DebugDrawing for DistanceJoints (#1703) 2021-04-16 10:55:31 +02:00
Vera Aguilera Puerto
39d98d591c Adds singleplayer support (#1704) 2021-04-16 10:53:59 +02:00
Vera Aguilera Puerto
01c2fc0730 ClydeTileDefinitionManager no longer throws when uninitialized, or when there are no tile definitions. (#1705) 2021-04-16 10:53:49 +02:00
ike709
1884bb0067 Fixes DateTimeOffset sandbox whitelisting (#1706) 2021-04-16 01:39:18 +02:00
Vera Aguilera Puerto
1c368bbaa8 Remove useless debug prototypes. 2021-04-15 20:44:25 +02:00
metalgearsloth
d16078a35f Don't reset sleeptimer on building physics islands 2021-04-15 23:18:05 +10:00
Vera Aguilera Puerto
4dd04207ac Shared GameTiming no longer depends on INetManager (#1697)
Adds ClientGameTiming with prediction and local/server time methods.
2021-04-14 11:40:02 -07:00
Vera Aguilera Puerto
02af42da30 Refactors EntityManager to not do any networking. (#1695)
* Refactors EntityManager to not do any networking.
ServerEntityManager and ClientEntityManager now do the networking instead.

* Rename property for "backwards compat."

* Remove comented out code in robust server simulation
2021-04-14 11:39:21 -07:00
Vera Aguilera Puerto
2c75c8b36d Refactors MapManager to not do any networking. (#1696)
* Refactors MapManager to not do any networking.
Now, ServerMapManager and ClientMapManager handle any networking.

* it's christmas in april!

* Remove comented line

* Remove useless seal

* Fix incorrect semicolon

* Event is no longer overriden, has a protected Invoke method instead
2021-04-14 11:13:58 -07:00
Vera Aguilera Puerto
013e6f7ce4 Move INetManager dependency from PrototypeManager to Server/ClientPrototypeManager 2021-04-14 14:55:40 +02:00
Acruid
cbd7b62ad7 Component Lifetime Events (#1660)
* Events are now raised for component OnAdd/Initialize/Startup/Shutdown/OnRemove.
Code cleanup in the Component class.
2021-04-13 17:16:41 -07:00
metalgearsloth
c1396f1c50 Named fixtures (#1684)
* Add named fixtures

Useful for getting specific collisions.

* Final cleanup

* More cleanup
2021-04-13 20:47:13 +10:00
Vera Aguilera Puerto
3ec9e7a734 Remove a few (now irrelevant) comments mentioning Godot. 2021-04-12 20:10:05 +02:00
Vera Aguilera Puerto
3a1e6e84b1 Remove Unused sharer params enum from the Godot era. 2021-04-12 20:09:22 +02:00
Vera Aguilera Puerto
7224419f77 Remove unused AudioMixTarget 2021-04-12 20:03:57 +02:00
Vera Aguilera Puerto
056e4de0c1 Appearance System cleanup.
Removes a nearly 4 years old unused visualizer that had a hardcoded update method in the appearance system, for some reason.
2021-04-12 19:59:25 +02:00
Vera Aguilera Puerto
aa90f22e23 Adds abstract class for entity events that can be cancelled. (#1688) 2021-04-11 18:51:07 +02:00
metalgearsloth
071234095d Don't use linked-list for contact pooling (#1683)
Always seemed icky to me. Aether uses a linked-list (like world contacts) and Farseer just uses a Queue.
2021-04-10 18:33:01 +02:00
Vera Aguilera Puerto
5b06391159 Fix objects of a server-only type not correctly showing up as such in VV. 2021-04-10 17:32:56 +02:00
Vera Aguilera Puerto
8edd44086b AudioSystem and DebugPhysicsIslandSystem unsubscribe from events on shutdown now. 2021-04-09 16:07:44 +02:00
Vera Aguilera Puerto
ccf212e9cb GridTileLookupSystem unsubscribes from events on shutdown. 2021-04-09 13:51:12 +02:00
Vera Aguilera Puerto
493011d1f9 SnapGridSystem uses directed MoveEvent, unsubscribes on shutdown. 2021-04-09 13:24:21 +02:00
Vera Aguilera Puerto
40e193df33 Adds directed/broadcast event for SnapGrid component position change. 2021-04-09 13:21:15 +02:00
Vera Aguilera Puerto
5068294d38 Makes a bunch of TransformComponent events directed. (#1682) 2021-04-08 20:42:46 +02:00
metalgearsloth
24054b5e2f Optimise showbb some more 2021-04-08 18:37:22 +10:00
Paul Ritter
17869c16cd when the bool 2021-04-06 11:58:17 +02:00
metalgearsloth
d8aad89c2f Split entity management from entity queries (#1665)
* Split entity lookups from entitymanager

* Helps if you subscribe dingus

* Handle map changes

* Stacks instead

* Make mapchanges use a queue because it's probably better

Moves likely only care about the latest position

* IoC what you did there

* IoC refactor

* Minor optimisations

* Apply feedback

* My IQ dropped 3 sizes that day

* Rest of acruid's feedback

* final_no_actual commit

* enlightenment?

* Liftoff

* final_commit_v2_actual

Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-04-06 13:29:48 +10:00
DrSmugleaf
2a349eb023 Optimize serialization reading, create benchmarks (#1679)
* Add Robust.Benchmarks and read string benchmark

* Separate serialization manager methods, use compiled lambdas to call manager read

4 us > 200 ns

* Add int and data definition with string benchmarks

* Make serialization population use expressions to create definitions

* Make benchmark classes internal and create seed data definition

* Add complex data definition read benchmark

* Create primitive serializers, remove primitive special case

|                 Method |        Mean |     Error |    StdDev |
|----------------------- |------------:|----------:|----------:|
|             ReadString |    227.1 ns |   4.47 ns |   5.65 ns |
|            ReadInteger |    245.4 ns |   4.82 ns |   6.26 ns |
|  ReadDataDefWithString |    804.7 ns |  15.27 ns |  16.34 ns |
| ReadSeedDataDefinition | 15,846.8 ns | 312.89 ns | 773.39 ns |

* Remove testing code

* Setup delegates during initialize

* Revert "Setup delegates during initialize"

This reverts commit 7ff4d4eaaa.

* Store delegates in a concurrent dictionary because I really cannot be arsed to generate them on initialize at this point
2021-04-05 14:50:33 +02:00
Vera Aguilera Puerto
47ad07b3d2 Adds directed event for when an entity's BodyType changes. (#1681)
Removes old Anchored C# event.
2021-04-05 13:17:09 +02:00
ShadowCommander
aacf6522b4 Remove NetId requirement for local event subscriptions (#1675) 2021-04-02 18:45:59 -07:00
ShadowCommander
c73d27b9ae Add RSI path to error log (#1676) 2021-04-02 16:45:21 -07:00
Vera Aguilera Puerto
f068b30a7c Adds Prototype Id Validator for Dictionaries whose keys are prototype IDs. (#1673) 2021-04-02 15:47:48 +02:00
Vera Aguilera Puerto
5400dddcfc Fix ComponentDependencies tests for debug & release 2021-04-02 13:56:42 +02:00
metalgearsloth
6cf5fdc5d6 Grid-trees for rendering (#1666) 2021-04-02 20:25:16 +11:00
Vera Aguilera Puerto
5d46663881 Fix ComponentDependencies tests 2021-03-31 22:17:55 +02:00
Acruid
8e0f227940 PVS Bugfixes 1: The Debuggening (#1671)
* Wrapped the parallel GetMail function in a try/catch.
Added a hack to the ViewCulling leave message that skips ents that don't exist.
Always send ALL map and grid entities to the client.
More info logging about adding/removing maps/grids.

* Will now still send required map critical entities even if client is not attached to an entity.
PvsEnabled and PvsRange are now writeable.
2021-03-31 21:56:11 +02:00
metalgearsloth
73a13fff9a Fix grid bounds upon deserialization 2021-03-31 19:33:19 +11:00
DrSmugleaf
de2e505a12 Make content able to choose which log level leads to test failures (#1670)
* Make content able to choose which log level leads to test failures

* Now make it make sense
2021-03-31 19:26:38 +11:00
DrSmugleaf
a9f7c7a76f Fix no HWId userdata error in integration tests (#1667) 2021-03-30 15:39:43 +02:00
Vera Aguilera Puerto
37401c26c9 Adds a custom editor for Prototypes to ViewVariables. (#1663)
Also improves VV a bit.
2021-03-30 15:33:15 +02:00
Vera Aguilera Puerto
528cd1e0e5 Fix fullscreen crash 2021-03-30 15:32:15 +02:00
Pieter-Jan Briers
2959456bec Fix integration test networking. 2021-03-30 13:28:26 +02:00
Metal Gear Sloth
8951712495 Add NaN guards to physics 2021-03-30 21:59:15 +11:00
metalgearsloth
d8612aff64 Re-implement inertia (#1652)
* Implement inertia

* actual SPEEN

* Sync mass

* bitcoin miner

* I am le dumb

* also dis

Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-03-30 21:42:05 +11:00
Acruid
e16732eb7b Network View Bubble (#1629)
* Adds barbones culling.

* Visibility culling and recursive parent ent additions.
DebugEntityNetView improvements.
Visibility moved from session to eyecomponent.

* Multiple viewport support.

* Perf improvements.

* Removed old netbubble system from ServerEntityManager.
Supports old NaN system for entities leaving view.
Supports old SendFullMap optimization for anchored, non-updating Entities.

* Fixes size of netView box.

* Remove empty EntityManager.Update method.
Switching ViewCulling back to PLINQ.
2021-03-29 16:17:34 -07:00
Acruid
91f61bb9de Reverts component NetId storage in ComponentManager back to the way Acruid originally designed it.
Removes NetId methods from IEntity, content does not need to be messing with them.
Fixes bug in DeleteComponent where the ComponentDeleted event was not being raised if a component did not have a NetId.
2021-03-29 03:40:48 -07:00
Pieter-Jan Briers
ddc91d05ec Some work towards multi-monitor support in Clyde.
Most of this was me experimenting with GLFW, but I figured I'd still commit it.
2021-03-28 21:23:38 +02:00
Acruid
ef22842b90 Fixes bug where FirstTimePredicted was not being set properly for the first predicted frame. 2021-03-27 20:16:04 -07:00
Pieter-Jan Briers
303e2152d2 UIScale now updates dynamically.
So if you move the window between different monitors with different scaling, the game updates.
2021-03-28 01:55:35 +01:00
Vera Aguilera Puerto
37fc0d0d2a Set correct class constrains for prototype id list serializers 2021-03-27 22:47:24 +01:00
Vera Aguilera Puerto
53987e1e5d Adds prototype "Variant" helper methods to IPrototypeManager (#1662) 2021-03-27 22:40:07 +01:00
metalgearsloth
3216d7770b Fix net.rate cvar warning (#1659)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-03-27 02:14:45 -07:00
Acruid
3203ca2ff4 Removed Control.Update from the UI system. UI Controls have no business running code in simulation updates.
Refactored the client update loop so that the GameStateManager is in full control of the simulation update.
2021-03-26 17:46:34 -07:00
metalgearsloth
e22254cd51 Clear velocities on container insertion (#1653)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-03-26 22:39:11 +01:00
Acruid
7ed722f669 Visibility moved from session to EyeComponent (#1657) 2021-03-26 22:38:45 +01:00
DrSmugleaf
4864096b2a Add prototype id list serializer and tests (#1658)
* Add prototype id list serializer and tests

* Bring old .Value code back

* Paul made me do this
2021-03-26 20:52:22 +01:00
Acruid
5161385de4 Removed unused Update and Resize code from GameStates. Presenters can get resize events from the interface manager (hint: you won't ever need to), and there is no reason for a UI Presenter to do anything in simulation ticks (UI should be event driven, not polling data every frame). 2021-03-25 14:01:51 -07:00
Acruid
98e009b38f Removed the GameController dependency from Clyde.
Removed the ConfigurationManager dependency from FontManager.
2021-03-25 11:36:57 -07:00
Vera Aguilera Puerto
3863ab8f62 Adds PrototypeIdHashSetSerializer for HashSet<string> prototype ID validation (#1656)
* Adds PrototypeIdHashSetSerializer for HashSet<string> prototype ID validation

* Paul changes

* cleanup, better stuff
2021-03-25 14:26:14 +01:00
Metal Gear Sloth
f576eb5125 Optimise showbb 2021-03-25 23:32:06 +11:00
Acruid
314742ccd8 NullableHelper tests now properly set up their required DI container instead of reusing the container from whatever test was ran before it. Service Locator anti-pattern :( 2021-03-25 02:02:09 -07:00
Acruid
f9074811f9 Adds constructor injection to the IoCManager & DependencyCollection. 2021-03-25 01:16:08 -07:00
Pieter-Jan Briers
5f3e1eb378 Frame graph now shows when GCs occur. 2021-03-25 02:24:38 +01:00
Pieter-Jan Briers
3c1ee20ca1 A 2021-03-25 02:05:28 +01:00
Pieter-Jan Briers
3768f5e68e Remove allocs from ContainerSlot.ContainedEntities. 2021-03-25 01:56:06 +01:00
Pieter-Jan Briers
765a560380 Fix integer overflow breaking Lidgren metrics. 2021-03-25 01:47:45 +01:00
Metal Gear Sloth
39ae3ac653 Optimise physics do not research 2021-03-24 22:35:17 +11:00
Pieter-Jan Briers
e48f4027e5 Probably fix running Robust directly for some people. 2021-03-23 21:28:36 +01:00
ShadowCommander
2fa1e98faf Fix CopyWithTypeSerializer not copying when null (#1651) 2021-03-22 11:02:32 +01:00
Pieter-Jan Briers
cedfa0ee2f Nothing to see here. 2021-03-21 20:37:10 +01:00
Acruid
92f44b390e SoundSystem Improvements (#1649) 2021-03-21 16:35:52 +01:00
Pieter-Jan Briers
65a42f9209 Prototype reloading now fires an event. 2021-03-21 16:25:52 +01:00
Acruid
ebf53248cf TestLogHandler now fails the test if a warning or higher is logged. 2021-03-19 13:42:13 -07:00
Acruid
289f637e8a Entity Lifetime Levels (#1644)
* Added an entity lifetime levels property.
Added exception when recursively deleting an entity.

* Add a directed event 'EntityTerminatingEvent' for right before an entity is deleted.

* Added MapInit lifestage to entities.
2021-03-18 22:53:05 -07:00
metalgearsloth
d7c13f30c8 Fix showbb awake (#1632)
* Fix showbb awake

* Slight tweak

Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-03-17 13:58:26 -07:00
Vera Aguilera Puerto
0dac17ae5e ConfigurationManager.OnValueChanged's invokeImmediately now accounts for overriden values correctly. 2021-03-17 20:22:44 +01:00
Pieter-Jan Briers
9a19a774fa Use stencil test to cull FOV-hidden lights early.
Massive shader optimization.
2021-03-17 13:16:47 +01:00
Pieter-Jan Briers
81f49d5eb2 Fix moving to the end of a textbox. 2021-03-17 01:22:45 +01:00
DrSmugleaf
4f3b4ac2d2 Changes for content server nullability (#1642) 2021-03-16 15:47:49 +01:00
Pieter-Jan Briers
e428056b52 Rldrsc now works with textures. 2021-03-16 12:39:19 +01:00
DrSmugleaf
8dc9d2989a Fix not being able to use shared entity systems in update order (#1638) 2021-03-16 12:38:31 +01:00
Paul
fd8c90dcbb reverting cringe (moved controller metrics cvar get to server) 2021-03-16 12:05:56 +01:00
Vera Aguilera Puerto
ffe4e5a8ab Add Enabled property to CollisionWake component. (#1641)
* Add Enabled property to CollisionWake component.

* Set property in HandleComponentState
2021-03-16 11:38:46 +01:00
Paul Ritter
6e5026d270 adds prometheus logging to physicscontrollers (#1640) 2021-03-16 11:32:46 +01:00
metalgearsloth
946c4166dc Move RootControl frameupdate to after queue (#1625)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-03-16 09:15:18 +01:00
Paul Ritter
7d2fb85a04 adds custom typeserializers (#1636)
retires DataFieldWithConstantAttribute & DataFieldWithFlagAttribute in favor of new customtypeserializers
adds prototypeidvalidation, just needs to be added to the corresponding fields
fixes some behaviour in yamllinter
2021-03-15 13:24:29 +01:00
metalgearsloth
d6ec078519 Fix static sleeping crash (#1630)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-03-14 12:44:49 +11:00
DrSmugleaf
32256fc4d9 Remove printing ticks in integration tests (#1627) 2021-03-13 20:12:49 +01:00
DrSmugleaf
37bbdfe7ff Fix serialization logging not printing messages (#1628) 2021-03-13 20:12:41 +01:00
metalgearsloth
c906675cdf Set collidable on CollisionWake removal (#1626)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-03-13 20:13:00 +11:00
DrSmugleaf
90bb5574c1 Add a CVar to disable texture preloading for tests (#1623) 2021-03-13 13:25:10 +11:00
Acruid
7b50dcd969 Removed IEntityManager.SpawnEntityNoMapInit. Every entity spawned into an uninitialized map does not have mapinit ran, so this is useless. 2021-03-11 22:17:31 -08:00
Pieter-Jan Briers
8d82f48a8f Various GLES fixes. 2021-03-11 13:06:30 +01:00
Pieter-Jan Briers
469f9fd219 Remove #line directives from shaders.
They hurt debugging more than they helped.
2021-03-11 13:06:18 +01:00
Pieter-Jan Briers
1a5783ab4e Probably fix tests 2021-03-11 11:47:58 +01:00
Clyybber
3d25886d79 Set velocity for audio sources, enabling doppler effect (#1622) 2021-03-11 11:44:01 +01:00
Pieter-Jan Briers
516b2cd372 Handle surrogate pairs correctly in LineEdit. 2021-03-10 16:55:12 +01:00
Pieter-Jan Briers
3cfcfa0be2 Render fallback character for unavailable characters. 2021-03-10 16:54:52 +01:00
Pieter-Jan Briers
69328087bd Added AsRune property to TextEventArgs 2021-03-10 16:54:13 +01:00
Pieter-Jan Briers
1bf8b2a52b Use Rune for rendering text instead of char.
Fixes crashes with surrogates.
2021-03-09 23:25:27 +01:00
Pieter-Jan Briers
fc6dc6f4e1 Add/fix Rune APIs for sandbox. 2021-03-09 23:24:33 +01:00
Pieter-Jan Briers
31c1feca4e Debug console history improvements.
No longer blows up if history cannot be read/written thanks to file locking.

Made it more async so it won't waste main thread init time.
2021-03-09 22:28:58 +01:00
Pieter-Jan Briers
3ed1eef2ab Fix build. 2021-03-09 21:44:46 +01:00
Pieter-Jan Briers
1394a017bb Fix IL verification throwing if a verifier error does not need to be formatted. 2021-03-09 21:41:50 +01:00
metalgearsloth
6b0670d5f1 Break joints on container insertion; semi-related to break pulling on container insertion (#1620)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-03-09 11:51:57 -08:00
metalgearsloth
f573331541 Fix physics joint disconnect spam (#1619)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-03-09 11:51:35 -08:00
metalgearsloth
a7218cd3b8 Make Visible a Shared Property for sprites (#1615)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-03-09 11:51:16 -08:00
Acruid
f7e8178736 Added new ComponentEvents system in IEventBus. (#1601)
* Added new ComponentEventBus, combined it with IEventBus.

* Removed all traces of IEntity from ComponentDependencies.
Removed IEntityManager dependency from ComponentManager.

* Added entity create/delete events to IEntityManager.

* ComponentEvents now use EntitySystemMessages instead of their custom ComponentEvent class.

* Component events are now just overloads of entity events.

* Removed obsolete EntitySystemMessage, now everything uses the base EntityEventArgs.

* Add a bool argument for if the message should be broadcast as well as directed.
Fix ordering and init issues of events in EntityManager.

* Changed names from Component/Entity events to Directed/Broadcast.

* Fix bugs and unit tests.
2021-03-09 11:02:24 -08:00
Pieter-Jan Briers
31f921e4aa Use ProfileOptimization to speed up startup. 2021-03-09 12:29:59 +01:00
Pieter-Jan Briers
aa1c25637c Allow disabling nvidia optimus via env var. 2021-03-09 12:29:59 +01:00
Pieter-Jan Briers
71f2c48463 Call GC.Collect after game init.
Cleans up any gen 2 garbage from init and the stutter shouldn't be the end of the world.
2021-03-09 12:29:59 +01:00
Pieter-Jan Briers
d65f4ca898 RSI & texture preloading.
All RSIs and textures are now loaded ahead of time in client startup. This is well threaded and is extremely fast.
2021-03-09 12:29:59 +01:00
Pieter-Jan Briers
b35568ffe5 Disable path case checks by default.
The idea was that these are Task.Run'd so don't influence performance. That was before we started threading the hell out of startup.

We're getting more stuff like YAML linting now which should hopefully be able to catch 99% of this. And louder because it was always just a warning before.
2021-03-09 12:29:59 +01:00
Acruid
a0d241e551 Removes some things that should not have been in the last PR. 2021-03-09 02:06:13 -08:00
GraniteSidewalk
33a6934582 Large number of changes to Shaders and Overlays (#1387)
* AAAAAAAAAAAAA

* Organization

* Still doesnt work

* Formatting

* It works!!

* More changes to everything

* Beginning of changes to overlays

* Makes the overlay manager GUID based (also it was very messy, still messy but i fixed some of it)

* Stencils are easy

* Questionable changes to overlays

* Minor change to HLR

* Fixed duplicate overlays when calling some commands (Like showbb)

* Fixes misleading message

* Adds a variety of worldspaces for overlays to choose from

* Caching

* Address reviews

* Merging pains

* ah.

* ahhhhh

* minor overlaymanager changes

* Work

* fix

* Merge??

* Fixes null errors

* Force update

* Delete whatever the fuck this is?

Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2021-03-09 01:52:16 -08:00
metalgearsloth
f237a8bbbc Optimise static body sleeping (#1618)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-03-09 19:47:51 +11:00
Pieter-Jan Briers
4bc775c01c RSI loader improvements:
1. Stop using NJsonSchema, it didn't do anything useful.
2. Use System.Text.Json instead of Newtonsoft.Json.
3. General cleanup of the code, using arrays instead of lists, etc...
2021-03-08 11:18:19 +01:00
Pieter-Jan Briers
93b4d81505 Optimize ImageSharp blitting. 2021-03-08 11:15:33 +01:00
Pieter-Jan Briers
0afb85a09e Fix some missing re-pooling of ImageSharp images. 2021-03-08 09:45:22 +01:00
Metal Gear Sloth
7b9315cea4 Significantly lower physics speedcap 2021-03-08 15:46:50 +11:00
Metal Gear Sloth
dc3af45096 Fix anchored message 2021-03-08 15:00:08 +11:00
metalgearsloth
00ce0179ae Allow kinematic controllers to have an impulse applied (#1612)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-03-08 12:10:20 +11:00
ShadowCommander
81947ba3d8 Fix buckling (#1611) 2021-03-07 15:25:11 -08:00
DrSmugleaf
49327279d0 Fix nullability errors in physics ContactHead code (#1609) 2021-03-07 23:15:55 +01:00
Metal Gear Sloth
0936cf3c7f Fix CanCollide serialization 2021-03-08 04:06:21 +11:00
Metal Gear Sloth
43b75a69c2 Fix contact overlap 2021-03-08 03:48:30 +11:00
metalgearsloth
c17c8d7a11 Physics (#1605)
* Physics worlds

* Paul's a good boy

* Build working

* Ingame and not lagging to hell

* Why didn't you commit ahhhhh

* Hard collisions working

* Solver parity

* Decent broadphase work done

* BroadPhase outline done

* BroadPhase working

* waiting for pvs

* Fix static PVS AABB

* Stop static bodies from awakening

* Optimise a bunch of stuff

* Even more broadphase stuff

* I'm fucking stupid

* Optimise fixture updates

* Collision solver start

* Building

* A is for Argumentative

* Fix contact caching island flags

* Circle shapes actually workeded

* Damping

* DS2 consumables only

* Slightly more stable

* Even slightlier more stablier

* VV your heart out

* Initial joint support

* 90% of joints I just wanted to push as I'd scream if I lost progress

* JOINT PURGATORY

* Joints barely functional lmao

* Okay these joints slightly more functional

* Remove station FrictionJoint

* Also that

* Some Box2D ports

* Cleanup mass

* Edge shape

* Active contacts

* Fix active contacts

* Optimise active contacts even more

* Boxes be stacking

* I would die for smug oh my fucking god

* In which everything is fixed

* Distance joints working LETS GO

* Remove frequency on distancejoint

* Fix some stuff and break joints

* Crashing fixed mehbeh

* ICollideSpecial and more resilience

* auto-clear

* showbb vera

* Slap that TODO in there

* Fix restartround crash

* Random fixes

* Fix fixture networking

* Add intersection method for broadphase

* Fix contacts

* Licenses done

* Optimisations

* Fix wall clips

* Config caching for island

* allocations optimisations

* Optimise casts

* Optimise events queue for physics

* Contact manager optimisations

* Optimise controllers

* Sloth joint or something idk

* Controller graph

* Remove content cvar

* Random cleanup

* Finally remove VirtualController

* Manifold structs again

* Optimise this absolute retardation

* Optimise

* fix license

* Cleanup physics interface

* AHHHHHHHHHHHHH

* Fix collisions again

* snivybus

* Fix potential nasty manifold bug

* Tests go snivy

* Disable prediction for now

* Spans

* Fix ShapeTypes

* fixes

* ch ch changeesss

* Kinematic idea

* Prevent static bodies from waking

* Pass WorldAABB to MoveEvent

* Fix collisions

* manifold structs fucking WOOORRKKKINNGGG

* Better pushing

* Fix merge ickies

* Optimise MoveEvents

* Use event for collisions performance

* Fix content tests

* Do not research tests

* Fix most conflicts

* Paul's trying to kill me

* Maybe collisions work idk

* Make us whole again

* Smug is also trying to kill me

* nani

* shitty collisions

* Settling

* Do not research collisions

* SHIP IT

* Fix joints

* PVS moment

* Fix other assert

* Fix locker collisions

* serializable sleeptime

* Aether2D contacts

* Physics is no longer crashing (and burning)

* Add to the TODO list

Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-03-08 03:19:01 +11:00
Paul
223fd8126f copy fix 2021-03-06 14:47:44 +01:00
Paul
1d5559be4a makes typevalidator its own interface 2021-03-05 15:02:03 +01:00
Paul
0b749ff8bb makes prototypeinheritance opt in 2021-03-05 11:13:00 +01:00
Paul
069fa89fcb adds Try variants to FirstOrNull & FirstOrDefault
fixes ientity serialization when loading the map
2021-03-05 10:07:18 +01:00
Paul Ritter
80f9f24243 Serialization v3 aka constant suffering (#1606)
* oops

* fixes serialization il

* copytest

* typo & misc fixes

* 139 moment

* boxing

* mesa dum

* stuff

* goodbye bad friend

* last commit before the big (4) rewrite

* adds datanodes

* kills yamlobjserializer in favor of the new system

* adds more serializers, actually implements them & removes most of the last of the old system

* changed yamlfieldattribute namespace

* adds back iselfserialize

* refactors consts&flags

* renames everything to data(field/definition)

* adds afterserialization

* help

* dataclassgen

* fuggen help me mannen

* Fix most errors on content

* Fix engine errors except map loader

* maploader & misc fix

* misc fixes

* thing

* help

* refactors datanodes

* help me mannen

* Separate ITypeSerializer into reader and writer

* Convert all type serializers

* priority

* adds alot

* il fixes

* adds robustgen

* argh

* adds array & enum serialization

* fixes dataclasses

* adds vec2i / misc fixes

* fixes inheritance

* a very notcursed todo

* fixes some custom dataclasses

* push dis

* Remove data classes

* boutta box

* yes

* Add angle and regex serializer tests

* Make TypeSerializerTest abstract

* sets up ioc etc

* remove pushinheritance

* fixes

* Merge fixes, fix yaml hot reloading

* General fixes2

* Make enum serialization ignore case

* Fix the tag not being copied in data nodes

* Fix not properly serializing flag enums

* Fix component serialization on startup

* Implement ValueDataNode ToString

* Serialization IL fixes, fix return and string equality

* Remove async from prototype manager

* Make serializing unsupported node as enum exception more descriptive

* Fix serv3 tryread casting to serializer instead of reader

* Add constructor for invalid node type exception

* Temporary fix for SERV3: Turn populate delegate into regular code

* Fix not copying the data of non primitive types

* Fix not using the data definition found in copying

* Make ISerializationHooks require explicit implementations

* Add test for serialization inheritance

* Improve IsOverridenIn method

* Fix error message when a data definition is null

* Add method to cast a read value in Serv3Manager

* Rename IServ3Manager to ISerializationManager

* Rename usages of serv3manager, add generic copy method

* Fix IL copy method lookup

* Rename old usages of serv3manager

* Add ITypeCopier

* resistance is futile

* we will conquer this codebase

* Add copy method to all serializers

* Make primitive mismatch error message more descriptive

* bing bong im going to freacking heck

* oopsie moment

* hello are you interested in my wares

* does generic serializers under new architecture

* Convert every non generic serializer to the new format, general fixes

* Update usgaes of generic serializers, cleanup

* does some pushinheritance logic

* finishes pushinheritance FRAMEWORK

* shed

* Add box2, color and component registry serializer tests

* Create more deserialized types and store prototypes with their deserialized results

* Fixes and serializer updates

* Add serialization manager extensions

* adds pushinheritance

* Update all prototypes to have a parent and have consistent id/parent properties

* Fix grammar component serialization

* Add generic serializer tests

* thonk

* Add array serializer test

* Replace logger warning calls with exceptions

* fixes

* Move redundant methods to serialization manager extensions, cleanup

* Add array serialization

* fixes context

* more fixes

* argh

* inheritance

* this should do it

* fixes

* adds copiers & fixes some stuff

* copiers use context v1

* finishing copy context

* more context fixes

* Test fixes

* funky maps

* Fix server user interface component serialization

* Fix value tuple serialization

* Add copying for value types and arrays. Fix copy internal for primitives, enums and strings

* fixes

* fixes more stuff

* yes

* Make abstract/interface skips debugs instead of warnings

* Fix typo

* Make some dictionaries readonly

* Add checks for the serialization manager initializing and already being initialized

* Add base type required and usage for MeansDataDefinition and ImplicitDataDefinitionForInheritorsAttribute

* copy by ref

* Fix exception wording

* Update data field required summary with the new forbidden docs

* Use extension in map loader

* wanna erp

* Change serializing to not use il temporarily

* Make writing work with nullable types

* pushing

* check

* cuddling slaps HARD

* Add serialization priority test

* important fix

* a serialization thing

* serializer moment

* Add validation for some type serializers

* adds context

* moar context

* fixes

* Do the thing for appearance

* yoo lmao

* push haha pp

* Temporarily make copy delegate regular c# code

* Create deserialized component registry to handle not inheriting conflicting references

* YAML LINTER BABY

* ayes

* Fix sprite component norot not being default true like in latest master

* Remove redundant todos

* Add summary doc to every ISerializationManager method

* icon fixes

* Add skip hook argument to readers and copiers

* Merge fixes

* Fix ordering of arguments in read and copy reflection call

* Fix user interface components deserialization

* pew pew

* i am going to HECK

* Add MustUseReturnValue to copy-over methods

* Make serialization log calls use the same sawmill

* gamin

* Fix doc errors in ISerializationManager.cs

* goodbye brave soldier

* fixes

* WIP merge fixes and entity serialization

* aaaaaaaaaaaaaaa

* aaaaaaaaaaaaaaa

* adds inheritancebehaviour

* test/datafield fixes

* forgot that one

* adds more verbose validation

* This fixes the YAML hot reloading

* Replace yield break with Enumerable.Empty

* adds copiers

* aaaaaaaaaaaaa

* array fix
priority fix
misc fixes

* fix(?)

* fix.

* funny map serialization (wip)

* funny map serialization (wip)

* Add TODO

* adds proper info the validation

* Make yaml linter 5 times faster (~80% less execution time)

* Improves the error message for missing fields in the linter

* Include component name in unknown component type error node

* adds alwaysrelevant usa

* fixes mapsaving

* moved surpressor to analyzers proj

* warning cleanup & moves surpressor

* removes old msbuild targets

* Revert "Make yaml linter 5 times faster (~80% less execution time)"

This reverts commit 2ee4cc2c26.

* Add serialization to RobustServerSimulation and mock reflection methods
Fixes container tests

* Fix nullability warnings

* Improve yaml linter message feedback

* oops moment

* Add IEquatable, IComparable, ToString and operators to DataPosition
Rename it to NodeMark
Make it a readonly struct

* Remove try catch from enum parsing

* Make dependency management in serialization less bad

* Make dependencies an argument instead of a property on the serialization manager

* Clean up type serializers

* Improve validation messages and resourc epath checking

* Fix sprite error message

* reached perfection

Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>
Co-authored-by: Vera Aguilera Puerto <zddm@outlook.es>
2021-03-04 15:59:14 -08:00
Pieter-Jan Briers
93018c9843 Silence localization warnings on client again. 2021-03-03 16:02:30 +01:00
Pieter-Jan Briers
e2675271d0 Parallelize assembly sandbox checking harder. 2021-03-03 16:02:12 +01:00
Pieter-Jan Briers
d1f7edecef Use Directory.EnumerateFiles in PathHelpers.GetFiles.
Significant improvement in startup time.
2021-03-03 10:52:05 +01:00
Pieter-Jan Briers
b5a3c0b988 Do not load files under Locale/ not ending with .ftl.
Will ignore stuff like .DS_Store/.directory/thumbs.db
2021-03-02 21:22:44 +01:00
Acruid
06e62b031a SoundSystem (#1604)
* Adds the SoundSystem static proxy class for the AudioSystem.
Added a shared IAudioSystem interface for the future.

* Moved ConnectedClient property from IPlayerSession down to ICommonSession.

* Connected up the SoundSystem to the client/server AudioSystems.

* Converted client calls over to the new system.

* Marked the old serverside functions to play sound obsolete, use the new ones from the IAudioSystem.

* Added ISharedPlayerManager to the IoC registration.
2021-03-01 20:22:28 -08:00
Acruid
24707b7385 Shared Containers (#1579)
* Added a basic server simulation framework for help with tests.

* Moved as much as possible to Robust.Shared/Containers.
Moved ContainerSlot from content to engine.

* Moved ClientContainer to shared.

* Merged client/server ContainerManagerComponents into a single shared version.

* ContainerManagerComponent is now implicitly registered with the attributes.

* Migrated to 2021 serialization technology.

* Existing Unit Tests work.

* More tests coverage.
Fixed bug with transferring items between containers.

* Container Type info is now sent over the network.

* Merge client/server container systems.

* Code cleanup.

* Attempted to fix dictionary serialization.
Logs warning when trying to check if an unknown GridId is paused.

* Remove OldCode.
2021-03-01 15:19:59 -08:00
Pieter-Jan Briers
ab95f39f9f Localize SS14Window 2021-03-01 00:45:36 +01:00
Pieter-Jan Briers
cdd38abab5 Fix two shutdown crashes by removing IDisposable managers. 2021-02-28 23:10:03 +01:00
Pieter-Jan Briers
d751c0b3ab Revert "Physics (#1602)"
This reverts commit fefcc7cba3.
2021-02-28 18:45:18 +01:00
Pieter-Jan Briers
2ace0e9e5a Expose Patreon tier info from auth server. 2021-02-28 18:45:01 +01:00
Pieter-Jan Briers
31716f5104 Work around Roslyn scripting bug with ref structs. 2021-02-28 18:45:01 +01:00
metalgearsloth
fefcc7cba3 Physics (#1602)
* Physics worlds

* Paul's a good boy

* Build working

* Ingame and not lagging to hell

* Why didn't you commit ahhhhh

* Hard collisions working

* Solver parity

* Decent broadphase work done

* BroadPhase outline done

* BroadPhase working

* waiting for pvs

* Fix static PVS AABB

* Stop static bodies from awakening

* Optimise a bunch of stuff

* Even more broadphase stuff

* I'm fucking stupid

* Optimise fixture updates

* Collision solver start

* Building

* A is for Argumentative

* Fix contact caching island flags

* Circle shapes actually workeded

* Damping

* DS2 consumables only

* Slightly more stable

* Even slightlier more stablier

* VV your heart out

* Initial joint support

* 90% of joints I just wanted to push as I'd scream if I lost progress

* JOINT PURGATORY

* Joints barely functional lmao

* Okay these joints slightly more functional

* Remove station FrictionJoint

* Also that

* Some Box2D ports

* Cleanup mass

* Edge shape

* Active contacts

* Fix active contacts

* Optimise active contacts even more

* Boxes be stacking

* I would die for smug oh my fucking god

* In which everything is fixed

* Distance joints working LETS GO

* Remove frequency on distancejoint

* Fix some stuff and break joints

* Crashing fixed mehbeh

* ICollideSpecial and more resilience

* auto-clear

* showbb vera

* Slap that TODO in there

* Fix restartround crash

* Random fixes

* Fix fixture networking

* Add intersection method for broadphase

* Fix contacts

* Licenses done

* Optimisations

* Fix wall clips

* Config caching for island

* allocations optimisations

* Optimise casts

* Optimise events queue for physics

* Contact manager optimisations

* Optimise controllers

* Sloth joint or something idk

* Controller graph

* Remove content cvar

* Random cleanup

* Finally remove VirtualController

* Manifold structs again

* Optimise this absolute retardation

* Optimise

* fix license

* Cleanup physics interface

* AHHHHHHHHHHHHH

* Fix collisions again

* snivybus

* Fix potential nasty manifold bug

* Tests go snivy

Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-03-01 03:09:36 +11:00
Paul
30df989e8d Merge branch 'serialization_v3_nodataclasses' of https://github.com/PaulRitter/RobustToolbox into master 2021-02-28 15:55:26 +01:00
Acruid
86bfea6bd4 ICommonSession Improvements + Player Filter (#1600)
* Removed IBaseSession, pushed all members down to ICommonSession.

* Pulled all members of client IPlayerSession into ICommonSession.
Marked client IPlayerSession as obsolete, use the base ICommonSession.

* Restricted setter access for properties in ICommonSession, only engine should be setting them.

* Fixed ping implementation on server.

* Moved AttachedEntityUid to ICommonSession.

* Added a shared IPlayerManager and pulled some common properties down to it.

* Added a shared player Filter class that holds a set of recipients in a networked call. Very useful for selecting recipients in a shared context.
2021-02-27 20:42:54 -08:00
Paul
d890f168c2 Spawner windows remember positions - engine commit 2021-02-27 12:27:46 +01:00
Paul
f888a810bf fixes that pesky warning 2021-02-27 11:58:51 +01:00
tmtmtl30
16249a4dde doubles default gain value (#1593) 2021-02-26 20:54:43 -08:00
Manel Navola
e33488ba55 Implemented erasing rectangular areas (#1419)
* Added support for erasing rectangular areas

* Apply suggestions from code review

Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>

* Switched sending start coordinate + end coordinate to sending start coordinate + rect selection size for preventing different parented positions, general code improvements

* Rewritten certain code part so the checks pass

* Added unshaded shader to rect erasing

* Tweaked alpha of erasing rectangle for better visualizing

Co-authored-by: Manel Navola <ManelNavola@users.noreply.github.com>
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
2021-02-26 20:52:12 -08:00
RemieRichards
bfe6eeddb1 Localization Fixes. Stop double-localizing localizationID-sourced names, PROPER returning "True" or "False" instead of "true" or "false" 2021-02-27 01:04:04 +00:00
RemieRichards
7f540e741c Add myself to CODEOWNERS for fluent translations. 2021-02-25 20:30:57 +00:00
Pieter-Jan Briers
b7855f5af5 Fix reloading localizations. 2021-02-25 20:47:17 +01:00
Pieter-Jan Briers
91391e1205 Update NetSerializer submodule 2021-02-25 12:06:28 +01:00
Pieter-Jan Briers
d5199ec459 Update NuGet packages. 2021-02-25 12:06:05 +01:00
Vera Aguilera Puerto
e1e6f4fd10 ContainerHelpers EmptyContainer now has an argument to attach removed entities to grid or map 2021-02-25 11:43:09 +01:00
Leo
e5b6fccf67 Add a scroll speed property to ScrollContainer (#1590)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2021-02-25 10:39:53 +00:00
RemberBL
95a912c329 Adds args.Handle(); into UI code for scrolling (#1595) 2021-02-25 11:08:19 +01:00
Pieter-Jan Briers
2b4833fc4e Allow content to read assembly versions in sandbox. 2021-02-24 12:18:44 +01:00
Pieter-Jan Briers
b814fc851a Fix more scrollbar DPI scaling bugs. 2021-02-24 12:18:29 +01:00
Pieter-Jan Briers
e87863203b Use DataFieldCached for AppearanceComponent.
What could go wrong?
2021-02-23 23:56:41 +01:00
Pieter-Jan Briers
33b66d9e18 Fix OpenCentered and OpenToLeft window methods. 2021-02-23 23:24:58 +01:00
Pieter-Jan Briers
fd406f7897 Selector-based VV windows have correct size.
Fixes #1594.
2021-02-23 23:10:58 +01:00
Pieter-Jan Briers
7a836d1018 Work around broken nullability.
Revert "Fix nullability errors"

This reverts commit a7f31f9ebf.

Revert "NotNullWhen()"

This reverts commit b332644d48.

Work around broken nullability.
2021-02-23 23:07:19 +01:00
Alex Evgrashin
393c15c44a Post shader will use real sprite bounding box (#1536)
Co-authored-by: Alex Evgrashin <evgrashin.adl@gmail.com>
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2021-02-23 22:54:48 +01:00
Pieter-Jan Briers
a7f31f9ebf Fix nullability errors 2021-02-23 22:53:38 +01:00
RemieRichards
b332644d48 NotNullWhen() 2021-02-23 21:40:33 +00:00
RemieRichards
510f7c0e7c Merge branch 'master' of https://github.com/space-wizards/RobustToolbox into localization_grammar 2021-02-23 21:33:06 +00:00
RemieRichards
fdd05e3d3a Fix GrammarComponent gender parsing, Add tests for GENDER() function (which covers custom types (Enum) and custom functions (GENDER)) 2021-02-23 21:31:13 +00:00
Pieter-Jan Briers
6d41958853 Fix nullability of TryIndex<T>. 2021-02-23 22:25:48 +01:00
Pieter-Jan Briers
cecc4dfcf2 Improve SharedTransformSystem:
Do not fire events for deleted entities.
Optimize to remove allocations & LINQ.
2021-02-23 22:05:49 +01:00
Pieter-Jan Briers
4ac40f2e90 Make norot on sprites default for the time being.
To band aid the pulling issues.
2021-02-23 21:32:00 +01:00
Pieter-Jan Briers
3e12d44173 Bool/enum/entity handling for localization parameters. 2021-02-23 20:59:21 +01:00
RemieRichards
a42b39bd84 Adds GENDER(), PROPER() and ATTRIB() localization functions, GrammarComponent. 2021-02-23 19:53:56 +00:00
DrSmugleaf
22affccf24 Add individual layer offset (#1583)
* Add individual layer offset

* Fix error message

* Bring back layer offsetting
2021-02-23 12:55:45 +01:00
Pieter-Jan Briers
028724c47b Localization improvements:
*Allow content to define localization functions.
* Add rldloc command to reload localizations.
* Doc comments
* Error handling
* Parallelize loading of localization files, since I can only assume we'll have a lot eventually.
* Type system stuff to allow content to pass custom data types into fluent.
* Code cleanup.
2021-02-23 11:35:54 +01:00
Pieter-Jan Briers
0114bff2fc Add IFormattable to sandbox whitelist. 2021-02-23 11:27:51 +01:00
Pieter-Jan Briers
4ddbd644eb Add helper method to set up logging inside unit tests. 2021-02-23 11:27:42 +01:00
Pieter-Jan Briers
f0366531ef Inject the csi directly into my master. 2021-02-23 01:39:33 +01:00
Pieter-Jan Briers
6bd5814f4a Automatically fetch names and descs from loc. 2021-02-22 11:11:11 +01:00
Pieter-Jan Briers
78c132fdab Mute loc warnings for the time being. 2021-02-22 08:57:30 +01:00
Remie Richards
460cf57d7c Fluent Localization (#1584) 2021-02-22 00:36:02 +01:00
Pieter-Jan Briers
a3190a8aca Improvements to SpriteComponent for new angle changes: (#1589)
1. Fixes CopyFrom with new rotation parameters.
2. Adds a couple APIs for ClickableComponent content side.
2021-02-22 00:30:16 +01:00
Pieter-Jan Briers
6921fb2fbf Make UserInterfaceManager not dispose root control on game shutdown.
No real reason to do this and it only risks breaking something.
2021-02-21 23:52:09 +01:00
Fortune117
9954d571de Fix for Crash Caused by the Entity Spawn Menu (#1588) 2021-02-21 20:16:01 +01:00
Pieter-Jan Briers
17fe000a1e Fix math tests due to angle/direction changes. 2021-02-21 20:06:39 +01:00
Pieter-Jan Briers
fba415e765 Bit of work to make Direction.South == Angle.Zero.
This makes Direction no longer follow a cartesian trig circle but oh well. Also helper methods to work with this.

Math tests currently fail, pushing this so Acruid can see about fixing SpriteComponent.
2021-02-21 19:47:42 +01:00
Pieter-Jan Briers
583b7ebf38 WPF layout (#1581) 2021-02-21 12:28:13 +01:00
Acruid
771a256925 Fixes bug with an exception being throw when trying to overwrite a deleted Component. (#1587)
Entity now uses constructor injection instead of property injection.
2021-02-20 23:30:09 -08:00
Acruid
ae79e89347 Added a shared PointLightComponent interface. (#1585)
* Added a shared PointLightComponent interface.

* Fix unit tests.
2021-02-20 16:06:34 -08:00
Acruid
6c7eeb95eb Marks Register and RegisterReference obsolete in IComponentFactory. (#1582) 2021-02-20 12:18:37 -08:00
Acruid
de0bd1887f Sprite Rendering Bugfixes (#1551)
* Added documentation to Clyde on the sprite rendering calls.

* Added a rotation debug entity.

* Non-directional RSIs and raw textures are now rotated properly.

* Directional RSIs and Sprite Smoothing work.

* Remove the Directional flag usages.

* Supports layers with different numbers of directions.

* Fixes window rendering.
2021-02-20 11:06:08 -08:00
metalgearsloth
eb3a815d48 Remove AiLogicProcessor (#1568)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-02-19 21:52:32 -08:00
DrSmugleaf
e2a4dcdff1 Fix comparing by name and not ID for entity prototype updates (#1578) 2021-02-20 02:41:51 +01:00
DrSmugleaf
68b0d7bf2e Fix not clearing the queue after hot reload (#1576) 2021-02-20 01:43:56 +01:00
DrSmugleaf
a9b163992b Fix and add test for PrototypeManager LoadString (#1574) 2021-02-20 01:43:43 +01:00
DrSmugleaf
2409965cf8 Fix build (#1575) 2021-02-20 00:15:43 +01:00
DrSmugleaf
eada37378a Add YAML hot reloading (#1571)
* Implement hot reloading for entity prototypes

* Implement automatic prototype hot-reloading

* Merge fixes

* Add yaml hot reloading and a message to notify the client

* Add reloading only changed files, remove cooldown, add retries and remove IPrototype

* Remove reload command

* Make the client listen for reloads instead and only when focused

* Fix errors

* Only queue a reload when the queue has items in it

* Make fails after 10 retries log instead of throw if reloading

Co-authored-by: Jackson Lewis <inquisitivepenguin@protonmail.com>
2021-02-20 00:02:04 +01:00
DrSmugleaf
0f1da1ba2a Add window focused callback to Clyde (#1573) 2021-02-19 22:10:03 +01:00
Acruid
e0cdcd228e Fixed Timer Namespace in unit tests. 2021-02-18 20:35:34 -08:00
Acruid
fdb5e014b5 PauseManager moved to Shared (#1553)
* Moved IPauseManager from server to shared.

* Moved ITimerManager from Timers to Timing.

* Added missing IConsoleHost to server/client RegisterIoC. Tests work again.
2021-02-18 20:12:26 -08:00
DrSmugleaf
cefcad775b Make addcomp and rmcomp give better feedback and case insensitive (#1570)
* Make addcomp and rmcomp case insensitive

* Fix up names

* Make addcomp and rmcomp give better feedback

* Make addcomp and rmcomp less fail happy
2021-02-18 20:01:14 -08:00
Vera Aguilera Puerto
e40feac1f1 Adds VV autorefresh when right-clicking the refresh button. (#1558)
* Adds VV autorefresh when right-clicking the refresh button.

* cancel token on close

* button tooltip
2021-02-18 00:14:11 -08:00
DrSmugleaf
3ef4ac7452 Make component states dependant on the player getting them (#1569) 2021-02-17 23:48:17 -08:00
Pieter-Jan Briers
93bf1b09e7 Fix disconnecting while connecting causes you to be locked out of the server. 2021-02-17 23:22:11 +01:00
DrSmugleaf
a1e557e870 Add IPrototypeManager method to load a string (#1567) 2021-02-17 13:20:39 -08:00
Pieter-Jan Briers
864adb7445 Add DateTimeStyles to sandbox. 2021-02-17 11:52:36 +01:00
mirrorcult
9e3f3f0c1c vec2i serializer (#1563)
Co-authored-by: cyclowns <cyclowns@protonmail.ch>
2021-02-16 12:19:45 -08:00
DrSmugleaf
a40c4a435c Fix file not found exceptions when starting up the game with a debugger (#1562)
* Fix exceptions when starting up the game

* Remove try catches
2021-02-16 20:05:22 +01:00
DrSmugleaf
17182dd0e8 Engine PR for enabling nullability in Content.Client (#1565) 2021-02-16 20:05:06 +01:00
DrSmugleaf
d8b50044a2 Add (de)serialization for immutable lists (#1549) 2021-02-16 20:04:28 +01:00
Pieter-Jan Briers
4dc396e73d Fixes warning in TypePropertySerialization_Test.cs 2021-02-16 09:20:06 +01:00
Pieter-Jan Briers
6ae0b0e892 Fix [GenerateTypedNameReferences] with sealed types.
Fixes #1546
2021-02-16 09:19:57 +01:00
Pieter-Jan Briers
7162ca3456 Probably fix the bug where people get locked out of the server due to duplicate connction attempts. 2021-02-16 09:02:14 +01:00
Pieter-Jan Briers
1b44c1a1b8 Allow NotImplementedException in sandbox. 2021-02-15 17:57:38 +01:00
Clyybber
5b80b33e00 Change GetFileSystemInfos to EnumerateFileSystemInfos for iteration (#1561) 2021-02-15 16:26:16 +01:00
DrSmugleaf
f05c1b2395 Add Attribute generic constraint to IReflectionManager.FindTypesWithAttribute (#1548) 2021-02-14 02:14:00 +01:00
Pieter-Jan Briers
d9b2c73440 XamlUI improvements.
1. Add XAML namespaces https://spacestation14.io with Avalonia hacks.
2. Make markup extensions work with Avalonia hacks.
3. Add LocExtension for localized strings.
4. Add Vector2 parsing type converter to XAML compilation.
5. Make SS14Window better thanks to these improvements.
2021-02-14 02:09:37 +01:00
Pieter-Jan Briers
29a39f8e0a Adds LocExtension markup extension for XAML.
Does Loc.GetString().
2021-02-13 15:13:05 +01:00
Pieter-Jan Briers
2d72a2bdb5 Server timing improvements.
Add helpers.
Fix desynchronized NetTime.
2021-02-13 11:42:12 +01:00
Pieter-Jan Briers
91da635631 Fix Robust.Shared.Interfaces namespace in ScriptInstanceShared 2021-02-13 11:42:12 +01:00
chairbender
68ab3d504a Various fixes to support new chatbox (#1547)
* #272 no arrow, actually change id on channel changer

* #272 ability to apply style class to child

* #272 try methods for selecting items in OptionButton.cs

* #272 allow escaping right angle bracket in formatted message

* #272 ability to detect when local player is set / unset

* #272 make RemoveModal public since PushModal is as well, so modals can be removed on-demand if needed rather than relying on a click elsewhere

* #272 revert
2021-02-12 18:20:29 -08:00
Pieter-Jan Briers
5187040a64 Remove unsafe code from GrowableStack 2021-02-13 00:47:05 +01:00
DrSmugleaf
e0c63e7ce6 Add SerializedType attribute to specify the id used in !type tags (#1545)
* Add SerializedType attribute to serialize types without the !type tag

* Fix nulls in tests

* Fix null in tests maybe

* Return to type tags

* Fix imports
2021-02-11 13:50:55 -08:00
Acruid
0ba2272cab Remove all dependencies from LocalizationManager.
Remove IoCManager calls from EntityPrototype.
Add missing using statements preventing EXCEPTION_TOLERANCE from building.
2021-02-11 00:39:12 -08:00
Acruid
2183cd7ca1 Massive Namespace Cleanup (#1544)
* Removed the Interfaces folder.
* All objects inside the GameObjects subfolders are now in the GameObjects namespace.
* Added a Resharper DotSettings file to mark the GameObjects subfolders as not providing namespaces.
* Simplified Robust.client.Graphics namespace.
* Automated remove redundant using statements.
2021-02-10 23:27:19 -08:00
DrSmugleaf
cbf01f0aa5 Fix ComponentChangedSerialized test (#1543) 2021-02-09 21:24:28 +01:00
Pieter-Jan Briers
6973d43006 Network timing synchronization.
Lidgren NetTime.Now is now synchronized to IGameTiming.RealTime.

NetChannel is now a nested class of NetManager.

Add IGameTiming.ServerTime, INetChannel.RemoteTimeOffset, INetChannel.RemoteTime
2021-02-09 14:28:20 +01:00
Pieter-Jan Briers
c5a961d9a0 Even better: use argStr. 2021-02-09 14:28:20 +01:00
Acruid
b4f7d71ee7 Server console can forward commands to a client. 2021-02-09 04:16:15 -08:00
metalgearsloth
cd3684e575 Guard against client appearancecomp changes (#1540)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-02-09 13:13:05 +01:00
Pieter-Jan Briers
317b8ce965 Fix sudo command mangling quotes. 2021-02-09 12:29:23 +01:00
Pieter-Jan Briers
ff96140afa Fix messed up \n. 2021-02-09 03:17:27 +01:00
Pieter-Jan Briers
bade95f6b7 Fix unit tests 2021-02-09 02:37:27 +01:00
Pieter-Jan Briers
69daaca399 Remove CVar.SECURE and replace auth CVars with env variables. 2021-02-09 01:50:42 +01:00
DrSmugleaf
5af7e60043 Add KeyValuePair YAML serialization (#1538) 2021-02-08 21:49:08 +01:00
DrSmugleaf
ab823dcd12 Add component registration lookup with case insensitive names (#1535) 2021-02-08 18:07:23 +01:00
Paul Ritter
b3976eb8d7 Analyzer Bongaloo 2: The Return (#1512)
Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
2021-02-08 18:05:27 +01:00
Pieter-Jan Briers
91759cdd3c Harder DynamicTree against NaN.
B2DynamicTree<T> has asserts, DynamicTree<T> handles them gracefully.

NaNs in DynamicTree were causing the internal state to corrupt resulting in the sprite flickering issues.

Fixes https://github.com/space-wizards/space-station-14/issues/2896
2021-02-08 05:03:56 +01:00
Pieter-Jan Briers
b000c3178b FileLogHandler is now internal.
Sandboxing thing.
2021-02-07 23:07:57 +01:00
Vera Aguilera Puerto
63b3ecdd13 Fix SpawnRepeating timer extensions 2021-02-07 17:04:43 +01:00
DrSmugleaf
a183a98f75 Add support for deserializing nullable enum types (#1537) 2021-02-07 14:31:38 +01:00
Acruid
bded7ad228 You can now provide a factory delegate to IoC register calls. 2021-02-06 23:00:08 -08:00
metalgearsloth
75c4f48496 Fix NPCs getting stuck (#1533)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-02-05 20:38:01 +01:00
Acruid
49fe2d59cf Removes hard-coded color support for writing console shells. Strings with formatting codes can replace this feature.
Added a separate WriteError function to console shell, to mimic writing to stderr.
2021-02-05 01:35:06 -08:00
DrSmugleaf
8a5b7f5146 Add AudioSystem extension methods for the client and server (#1532) 2021-02-05 17:23:36 +11:00
Pieter-Jan Briers
ae4f470e1f Fix duplicate .xaml files. 2021-02-04 15:22:18 +01:00
metalgearsloth
18fcab6f71 Fix loadbp on paused maps (#1531)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-02-04 23:29:37 +11:00
Acruid
1ae6c32c62 Adds the net_entityreport console command, that displays a network history of entity updates. 2021-02-03 23:19:47 -08:00
Pieter-Jan Briers
cf6925f19b Makes sudo command show output to user. (#1530) 2021-02-03 19:31:32 -08:00
Pieter-Jan Briers
b4c7ffe38a Adds an exec command.
Just like Quake. Man that Carmack guy was onto something.
2021-02-04 03:40:03 +01:00
Pieter-Jan Briers
d5c2f45f14 Fix accidental usage of OpenGL DSA in screenshot code. 2021-02-03 21:10:48 +01:00
Pieter-Jan Briers
dcc88d2d36 Fix KHR_debug detection on OpenGL ES. 2021-02-03 21:10:48 +01:00
metalgearsloth
a274b8dfc2 EntityQuery no longer yields paused by default (#1521)
* Change EntityQuery to not get paused by default

* GetAllComponents

* Fix shell commands

Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-02-04 00:20:31 +11:00
Paul Ritter
f42c1379e0 Revert "Viewport improvements. (#1510)" (#1527)
This reverts commit fc5e3ab69d.
2021-02-03 12:25:12 +01:00
Pieter-Jan Briers
c4fa7e98d4 Fix clients not disconnecting correctly when client is closed. 2021-02-03 00:04:41 +01:00
Vera Aguilera Puerto
8b9dadffb1 MIDI improvements (#1526) 2021-02-02 18:46:24 +01:00
Vera Aguilera Puerto
5e99c6d04d ViewVariables server-side "Add Component" button isn't hidden anymore when searching for components. 2021-02-02 13:28:56 +01:00
Vera Aguilera Puerto
606d232dbb Update ViewVariables to use the new commands API 2021-02-02 13:26:41 +01:00
Vera Aguilera Puerto
df877582a6 You can now add or remove components from the comfort of ViewVariables (#1524) 2021-02-02 12:01:54 +01:00
Acruid
8ffdb090e6 Adds a property on ITransformComponent that prevents the entity from being rotated. Resolves #1479. 2021-02-01 20:27:17 -08:00
Acruid
033d6ffb22 Fixes bug where effects were dying in transit from lag. Resolves #1256. 2021-02-01 19:17:34 -08:00
Acruid
3eb6e067f9 Console Unify (#1513)
* Renamed shared ICommand to IConsoleCommand.

* Lots of refactoring into a shared context.

* Removed ICommonSession from server concmd Execute.

* Added argStr parameter to concmd execute.

* The execute function of client concmds now returns void, use the new shell.RemoteExecuteCommand function to forward commands.

# Conflicts:
#	Robust.Client/Console/Commands/Debug.cs

* Finally move shells and commands into shared.

* Console commands can now be registered directly without a class in a shared context.

* Pulled up ConsoleHost and Console shell into a shared context.

* Pulled up half the functions of ConsoleHost into a shared context.

* Repair rebase damage.

* Make LoadConsoleCommands function not remove any previously registered commands.
2021-02-01 16:40:26 -08:00
Vera Aguilera Puerto
1f64f93ef4 Update nfluidsynth to latest version, 0.3.1 2021-02-01 21:33:22 +01:00
Pieter-Jan Briers
7dd617b0d6 Adds reflection helper methods to script globals. 2021-02-01 19:41:02 +01:00
metalgearsloth
0567b70704 Optimise showbb (#1519)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-02-01 20:15:50 +11:00
Pieter-Jan Briers
9963e89c14 Sanitize ResourcePath to disallow .. shenigans. 2021-01-31 22:38:40 +01:00
Remie Richards
29e0faed88 Can now animate ITransformComponent.WorldPosition (#1518) 2021-01-30 23:26:01 +01:00
Pieter-Jan Briers
0ce6ff9870 Fix tickrate sync if non-default tickrate saved to client config.
Fixes #1516

Thanks to blue on Discord for helping me diagnose this.
2021-01-30 01:27:42 +01:00
Vera Aguilera Puerto
dbe9a96dfa Reorganizes NumericsHelpers into different files using partial classes. (#1514) 2021-01-29 12:46:27 +01:00
Vera Aguilera Puerto
fc5e3ab69d Viewport improvements. (#1510)
* Remove the main viewport.

* Re-add main viewport in a different place

* Move screen/map translation into ViewportContainer

* Support for viewport resolution

* Fix postfx, add WorldToScreen to Viewport

* Remove useless cast

* Some cleanup.

* Fix incorrect worldBounds when rendering viewports

* nullability

Co-authored-by: 20kdc <asdd2808@gmail.com>
2021-01-29 12:45:04 +01:00
Julian Giebel
ed4974141c Add TryCastValue to CollectionExtensions.cs (#1515)
* Add TryCastValue to CollectionExtensions.cs

* Change TryCastValue to be more generic

* Add notnull constraing for TKey to TryCastValue

Co-authored-by: Julian Giebel <j.giebel@netrocks.info>
2021-01-28 20:45:11 +01:00
Pieter-Jan Briers
3e5efd5ed0 Add AnimatedTextureRect 2021-01-24 23:00:02 +01:00
Pieter-Jan Briers
e1110eadb4 Better unified handling of SpriteSpecifiers
Add more utilities, most notably IRsiStateLike, to make working with SpriteSpecifiers easier. Especially when animated.
2021-01-24 22:59:47 +01:00
Pieter-Jan Briers
06ace83a73 Allow audio playback without grids. 2021-01-24 16:04:23 +01:00
Pieter-Jan Briers
cd01ca924b Fix broken PanelContainer due to previous commit.
God I am tired.
2021-01-24 04:20:51 +01:00
Pieter-Jan Briers
38ad8ce132 Fix UI scaling weirdness with PanelContainer. 2021-01-23 21:51:35 +01:00
20kdc
ee440c2df9 Make the lighting manager much more configurable, including a console lock (#1506) 2021-01-23 21:17:49 +01:00
Pieter-Jan Briers
32f3c863fb Fix UI scaling bugs with ProgressBar 2021-01-23 20:15:45 +01:00
Pieter-Jan Briers
b00e0bef5a Fix UI scaling bug with RichTextLabel 2021-01-23 16:02:31 +01:00
Pieter-Jan Briers
0a09b27918 Fix UI scaling bug with GridContainer 2021-01-23 16:02:23 +01:00
Paul
c9f6a4e32a fixes enum VV 2021-01-21 15:33:42 +01:00
Pieter-Jan Briers
b205a14f69 Exception tolerance for NetManager.OnDisconnect 2021-01-20 21:07:02 +01:00
Pieter-Jan Briers
d5f3292e0a Unregister OnSessionOnPlayerStatusChanged on bound user interfaces.
I am frankly flabbergasted this is only a problem now.
2021-01-20 21:00:24 +01:00
Pieter-Jan Briers
561e4b330e Fix ALL components memory leaking.
:irrational:
2021-01-20 20:45:02 +01:00
Paul
36a5d102ff prevent one error from killing the entire namegenerator from running 2021-01-17 17:17:02 +01:00
Pieter-Jan Briers
b9c39e0953 Fix reconnecting. 2021-01-17 16:08:48 +01:00
Pieter-Jan Briers
ad4c8be132 Add system for preserving Map UIDs across edits. 2021-01-17 15:51:32 +01:00
kira-er
988cbf9a87 VV Enum (#1503) 2021-01-17 01:50:26 +01:00
Acruid
e26512001a Completely removed MsgSetTickRate, the NetConfigurationManager replaces the functionality. This builds on top of the previous commit.
Fixes bug where server was not sending the entire set of replicated cvars.
2021-01-16 15:33:44 -08:00
Pieter-Jan Briers
8e97982f1e Fix net.tickrate not being replicated correctly to clients. 2021-01-16 21:46:10 +01:00
Paul
3ca686298e Fixes ViewVariablesManager using the wrong VVPropEditor for Type in shared not annotated with [NetSerializable] 2021-01-16 20:05:15 +01:00
20kdc
5e914cb13a PointLightComponent: Don't dirty if enabled is being set to what it's already set to. (#1507) 2021-01-16 00:13:55 +11:00
Pieter-Jan Briers
a1bdfca8ba Fix SimplePredictReconcileTest. 2021-01-15 11:03:52 +01:00
20kdc
79deaca409 Polar Coordinates: simplify maths, any-angle occluders are no longer evil (#1504)
Someone please performance-test this, but I think the fragment shader code simplifications speak for themselves.

Radrark found the "line in polar coordinates" equation I needed and a diagram that explained the variables.

That equation was essentially the missing piece to the whole thing.
2021-01-14 13:44:25 +01:00
20kdc
2eeb21431b Fix FileDialogManager not doing DLL mapping properly in sandbox, and FileDialogManager hard crash on multiple dialogs (#1505) 2021-01-14 13:43:39 +01:00
chairbender
c4062bcae9 #1449 new ControlFocusExited override for allowing controls to know (#1467)
when they lost control focus, separate from keyboard focus
2021-01-13 23:18:45 +01:00
Acruid
cd3a85ea04 Replicated CVars (#1489) 2021-01-13 10:02:08 +01:00
Pieter-Jan Briers
d15b5c7f22 Fix compiler warnings. 2021-01-13 03:10:51 +01:00
Leo
18bbe2271d Adds extension method to read and write colors on NetMessages (#1500) 2021-01-13 01:12:55 +01:00
Pieter-Jan Briers
ee2b7a3a66 Adds gcm function to ScriptGlobalsShared 2021-01-12 21:17:35 +01:00
Pieter-Jan Briers
ca36671131 Fix nullable error in RadioOptions 2021-01-12 21:17:26 +01:00
Pieter-Jan Briers
604a1a6960 Disable CodeQL crap since it STILL doesn't do .NET 5 and I'm sick of the errors. 2021-01-12 17:20:11 +01:00
Pieter-Jan Briers
2898f5396f Account for windows time period latency in Lidgren.
1. Set timeBeginPeriod(3) on the server to reduce scheduler latency in the lidgren thread.
2. Add 16ms of guaranteed lag bias to client prediction calculations to account for scheduler latency.

Both of these changes are to account for how the windows scheduler seems to handle time periods in related to socket polls. See this Discord conversation for why, details down below as well: https://discord.com/channels/310555209753690112/770682801607278632/798309250291204107

Basically Windows has this thing called time periods which determines the precision of sleep operations and such. By default it's like 16ms so a sleep will only be accurate to within 16ms.

Problem: Lidgren polls the socket with a timeout of 1ms.

The way Windows seems to handle this is that:
1. if a message comes into the socket, the poll immediately ends and Lidgren can handle it.
2. If nothing comes in, it takes the whole 16ms time period to actually process stuff.

Oh yeah, and Lidgren's thread needs to keep pumping at a steady rate or else it *won't flush its send queue*. On Windows it seems to normally pump at 65/125 Hz. On Linux it goes like 950 Hz as intended.

Now, the worst part is that (1) causes Lidgren's latency calculation to always read 0 (over localhost) instead of the 30~ms it SHOULD BE (assuming client and server localhost).

That 30ms of unaccounted delay worst caseis enough to cause prediction undershoot and have messages arrive too late. Yikes.

So, to fix this...

On the server we just decrease the tick period and call it a day. Screw your battery life players don't have local servers running anyways.

On the client we bias the prediction calculations to account for this "unmeasurable" lag.

Of course, all this can be configured via CVars.
2021-01-12 02:43:15 +01:00
bgare89
39541639c5 Add RadioOptions.cs (#1484)
Co-authored-by: Vera Aguilera Puerto <6766154+Zumorica@users.noreply.github.com>
2021-01-12 01:45:15 +01:00
metalgearsloth
50981ad1a1 Layered PlacementManager (#1403)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-01-11 22:42:54 +11:00
Pieter-Jan Briers
0cbfbeffae Revert "Analyzer to check if interfacemethods are explicitly marked as such" (#1499)
This reverts commit e603153016.
2021-01-11 12:26:23 +01:00
Paul Ritter
e603153016 Analyzer to check if interfacemethods are explicitly marked as such (#1477)
Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
2021-01-11 12:14:26 +01:00
Pieter-Jan Briers
e7c417ca0c Remove a couple MiB of memory usage. 2021-01-11 10:58:42 +01:00
Pieter-Jan Briers
a3989f28eb Re-order exception handler in StatusHost to avoid blowing up in some cases ??? 2021-01-11 10:24:29 +01:00
Pieter-Jan Briers
38ace3c348 Fix exception with trying to place entities at... NaN?
This is still a bug but it should not cause an exception on the server
2021-01-11 10:24:29 +01:00
Ygg01
0e00170f45 Make RSI directions default to 1. (#1495)
Add some helper methods, made an `example.rsi` for testing.

Closes #1463
2021-01-11 18:12:34 +11:00
Pieter-Jan Briers
261ee96cad Make client connect 1 second faster.
Whoops.
2021-01-11 02:39:35 +01:00
Pieter-Jan Briers
2c851885db Fix ItemList not working correctly with scaling. 2021-01-11 02:06:25 +01:00
Pieter-Jan Briers
849be86455 Add launchauth command to bootstrap login tokens for connecting to live servers. 2021-01-10 23:55:01 +01:00
Pieter-Jan Briers
ffd5c120be Add PreserveBaseOverridesAttribute to sandbox whitelist.
Used by covariant returns.
2021-01-10 22:03:18 +01:00
Vera Aguilera Puerto
76b15dda70 Client-side addcompc/rmcompc (#1497) 2021-01-10 20:09:14 +01:00
Vera Aguilera Puerto
0bf7f519ad Adds client-side setinputcontext command (#1498) 2021-01-10 20:08:44 +01:00
Vera Aguilera Puerto
f97f325a36 Fixes sprite scale not being taken into account. (#1496)
* Fixes sprite scale not being taken into account.
- Only apply scale if length of scale vector not close or equal to 1.

* I blame Remie

* Fix vector maths
I should spend more time studying maths instead of contributing, to be fair.

* Remie no please nO
2021-01-10 19:53:04 +01:00
metalgearsloth
24315fa787 Avoid unnecessary EntMapIdChangedMessages (#1493)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-01-10 12:46:59 +11:00
Ygg01
792179657b Fix space in dotnet breaking windows builds (#1490)
Who would win?
Thirty developers
-OR-
One sneaky ` ` boi?

On windows default path to dotnet are `C:\Program Files`. Without quoting the
the command if it contains a space, it's going to break Windows builds that
install in `C:\Program Files`.
2021-01-08 13:53:42 +01:00
Paul
9b92bcf911 intermediate fix to garantuee people with dotnet in path to launch commpilerobustxaml 2021-01-05 12:15:03 +01:00
metalgearsloth
86e34ea27b Fix enum caching (#1485)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-01-05 16:17:20 +11:00
Clyybber
62cf778958 Fix build when dotnet is not in the PATH (#1483) 2021-01-04 20:25:43 +01:00
py01
5d667e44c3 Replaces AnchoredChanged C# event with a ComponentMessage (#1482)
Co-authored-by: py01 <pyronetics01@gmail.com>
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2021-01-04 10:16:05 +01:00
metalgearsloth
6d84b8741c Cache enum references (#1480)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2021-01-03 03:45:02 +01:00
DrSmugleaf
d08ca59b75 Make RobustUnitTest register content cvars and set _isServer (#1481) 2021-01-03 03:44:12 +01:00
Pieter-Jan Briers
f06b046c1c Fix Content-Type not being set for status API. 2021-01-03 03:42:21 +01:00
Vera Aguilera Puerto
bb412a6906 Entity Timer SpawnTimer throws if entity is deleted. 2021-01-01 15:45:13 +01:00
Radrark
1baee3004c Adds new keybind property: AllowSubCombs (#1473)
Co-authored-by: Radrark <null>
2020-12-29 15:59:34 +01:00
Pieter-Jan Briers
f18068c13a Update NetSerializer submodule to improve build times 2020-12-29 15:59:13 +01:00
Pieter-Jan Briers
0ba00a1845 Gcf command to mess with LOH compaction. 2020-12-29 14:10:15 +01:00
Pieter-Jan Briers
28caf0d74c Reduce allocations 2020-12-29 03:58:16 +01:00
Pieter-Jan Briers
ecbb32b70b Clean up various cases of failing to dispose file streams. 2020-12-29 03:58:16 +01:00
Pieter-Jan Briers
8e2a9cc597 Font atlasses are now dynamic and can render all glyphs in the font file. 2020-12-29 03:58:16 +01:00
Vera Aguilera Puerto
a7eb8201c9 Fix MIDI soundfont load error on non-rooted paths. 2020-12-26 22:05:17 +01:00
Pieter-Jan Briers
1f95fe6782 Fix XamlIL problems when publishing 2020-12-25 18:34:19 +01:00
DrSmugleaf
07c1f9e1af Replace MaybeNullWhen(false) with NotNullWhen(true) in AppearanceComponent (#1461) 2020-12-25 15:17:54 +01:00
Vera Aguilera Puerto
826dce6659 Fix custom MIDI soundfont loading when mounting content from zip
Fixes #1466
2020-12-24 03:54:06 +01:00
Vera Aguilera Puerto
cdf714f3ba Fix stereo ogg audio not playing correctly.
Only half of the samples were being read.
2020-12-23 16:21:42 +01:00
Pieter-Jan Briers
671ca7959c Throw debug info if the RichTextEntry assert fails. 2020-12-23 15:12:47 +01:00
Pieter-Jan Briers
b7a1345d3a XAML compilation improvements.
Prevent double XAML-ifying causing corrupt dlls.

Use MSBuild dependencies to reduce unecessary xamlil builds.
2020-12-23 12:01:35 +01:00
Pieter-Jan Briers
835b6ebdba Probably fix build forgetting that nuget exists. 2020-12-21 12:14:28 +01:00
Pieter-Jan Briers
0ecabd6553 Fix XamlIL locking build. 2020-12-21 12:13:45 +01:00
Pieter-Jan Briers
feaa69f825 Fix build of injector. 2020-12-21 04:05:34 +01:00
Pieter-Jan Briers
857904a3d9 Update dependencies of name generator. 2020-12-21 04:05:25 +01:00
Pieter-Jan Briers
0b37418477 Fix injectors UsingTask. 2020-12-21 03:31:11 +01:00
Pieter-Jan Briers
f234ecb2c3 Make Robust.Client.Injectors NS2.0
So that it works out of the box with Framework MSBuild.
2020-12-21 03:16:13 +01:00
Pieter-Jan Briers
b449959865 Clean up bad project reference in Robust.Server 2020-12-21 03:15:45 +01:00
Pieter-Jan Briers
8f870403d2 Managed implementation of HttpListener. (#1460) 2020-12-21 02:51:04 +01:00
Paul Ritter
d94f702601 Xaml UI (#1446)
Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2020-12-20 23:52:36 +01:00
DrSmugleaf
e78ab8f922 Add YamlObjectSerializer.NodeToType with generic argument (#1456) 2020-12-20 20:46:56 +01:00
20kdc
6972000293 Make the "softness" of soft shadows adjustible per-light. (#1454)
Note: Thanks to the nature of YAML properties in RobustToolbox, this commit is only an API blocker if the Softness property is directly manipulated from code, which is unlikely.
2020-12-19 21:44:47 +01:00
DrSmugleaf
58560f589f Defer MoveEvent out of TransformComponent.HandleComponentState (#1453)
* Defer MoveEvent out of TransformComponent.HandleComponentState

* Imports

* Make the update loop more readable and call ToArray

* Fix tests

* Fix tests HALLELUJAH
2020-12-19 13:09:16 +01:00
Pieter-Jan Briers
6e931ac175 Fix some CVars not saving. 2020-12-19 02:31:46 +01:00
Pieter-Jan Briers
a7eb5e8115 Use nvidia GPU on optimus laptops.
With an undocumented crappy hack, of course.
2020-12-19 02:25:10 +01:00
metalgearsloth
712e4acc66 Cache TryLooseGetType (#1448)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-12-19 01:42:51 +01:00
Pieter-Jan Briers
fdcfdffc0b Provide fallback for /status API if content does not override it. 2020-12-19 00:43:46 +01:00
Pieter-Jan Briers
74eb8e3e8d Allow build.json contents to be overriden by --cvar. 2020-12-17 17:13:07 +01:00
Pieter-Jan Briers
ae4c764e4f Whitelist System.Guid for sandbox. 2020-12-17 16:37:20 +01:00
Pieter-Jan Briers
7ef2cec121 Fix names parsed from build.json 2020-12-17 15:28:01 +01:00
Pieter-Jan Briers
40bff81017 Fix nullable warning. 2020-12-17 00:58:26 +01:00
Pieter-Jan Briers
f7c28992f8 Disable string map caching to hopefully fix connect. 2020-12-17 00:48:15 +01:00
Pieter-Jan Briers
920ae58019 Fix LoaderApiLoader.FindFiles() 2020-12-17 00:33:39 +01:00
Pieter-Jan Briers
5bb21e07de Engine versioning. 2020-12-16 23:53:51 +01:00
Pieter-Jan Briers
78ceaa50d5 Update Lidgren submodule. 2020-12-16 18:18:40 +01:00
Pieter-Jan Briers
7473b6dae1 Optimize assembly type checking.
It's now parallelized which cuts off ~200ms on its own for me.
Config is now shared between multiple loads which saves a lot as well.

All in all, pretty good.
2020-12-14 16:34:33 +01:00
Pieter-Jan Briers
c335170fc1 Add non-generic System.Nullable to sandbox whitelist. 2020-12-13 21:33:22 +01:00
Pieter-Jan Briers
13e9fe12ce Further fixes to loader exe.
Fix ordering of loads.
Fix loads.
2020-12-13 16:12:32 +01:00
Pieter-Jan Briers
7ef2fd46da Hail NuGet 2020-12-13 01:14:50 +01:00
Pieter-Jan Briers
f048209bf5 FUCK BOMs 2020-12-13 01:10:21 +01:00
chairbender
1bf9e2e87a Multiselect option button, tooltip delay (Action Hotbar Support) (#1435) 2020-12-13 01:01:00 +01:00
Pieter-Jan Briers
fd4f45e670 Use NuGet packages for engine natives.
Fixes #1434

This means that adding support for new architectures (e.g. ARM) is MUCH easier.

It removes  download_natives.py which simplifies the build process.

It's also way less painful to maintain.
2020-12-13 00:46:23 +01:00
Pieter-Jan Briers
f15c1c7a95 Allow engine to be loaded from a zip file itself. 2020-12-12 11:12:37 +01:00
DrSmugleaf
50f0a4389e Fix the server not setting IsConnected to false for disconnecting clients in integration tests (#1442) 2020-12-12 00:53:10 +01:00
komunre
cab6277b2d FixClipping() now check if entity is deleted (bug fix) (#1441)
* check for deletion in CanMove()

* Added deleted check in FixCollide

* Removed Owner.Deleted check from CanMove()
2020-12-12 04:37:32 +11:00
Pieter-Jan Briers
797fa9cffa Fix server failing to start due to non-int LogLevel enum. 2020-12-10 15:22:29 +01:00
20kdc
a20245d623 Fix grid bounds going out of sync with chunk collision regeneration (#1440)
Fixes #1439
2020-12-10 14:38:03 +01:00
Pieter-Jan Briers
04cc1f616d Permissive markup parsing. 2020-12-09 13:08:06 +01:00
Pieter-Jan Briers
8cd6f63f17 Make FormattedMessage tags records, clean up tests. 2020-12-09 13:08:06 +01:00
Ygg01
ad8b0b3c83 Add bytes or sbytes to enum where available (#1430)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2020-12-08 12:46:30 +01:00
Paul Ritter
f157cdce02 Rotatable bounding boxes (#1360)
Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2020-12-07 17:01:57 +01:00
DrSmugleaf
2504a42f88 Fix typo in exception message 2020-12-07 15:21:38 +01:00
Pieter-Jan Briers
d0191e063a Fix all cases of member references to array (not vector) types.
Yeah generics aren't the only one since you can do [,][,].
2020-12-07 00:12:05 +01:00
Pieter-Jan Briers
b96bcbd357 Fix member ref handling of non-vector generic arrays in type checker. 2020-12-05 23:13:04 +01:00
Pieter-Jan Briers
ae14031377 Fix version parsing. 2020-12-05 18:02:12 +01:00
Pieter-Jan Briers
1d19007012 Missing parentheses... 2020-12-05 17:42:32 +01:00
Pieter-Jan Briers
f5390f21c3 Change client publish to be on tag push. 2020-12-05 17:36:48 +01:00
Pieter-Jan Briers
0fea0fba08 Third try at client publish 2020-12-05 17:04:24 +01:00
Pieter-Jan Briers
7517f0d868 Second try at client publish 2020-12-05 16:54:06 +01:00
Pieter-Jan Briers
3351b13b26 workflow to publish engine versions 2020-12-05 16:50:17 +01:00
Pieter-Jan Briers
242f187263 Stuff to export standalone builds of Robust.Client. 2020-12-05 01:50:33 +01:00
Pieter-Jan Briers
8357940ef6 Try to fix integration test failures. 2020-12-04 13:04:01 +01:00
DrSmugleaf
93dca3a914 Add EnsureComponentWarn methods (#1431) 2020-12-04 12:53:02 +01:00
Pieter-Jan Briers
4c72103a97 Do not load SECURE cvars from config file.
To avoid funny business by content.
2020-12-04 11:27:41 +01:00
Pieter-Jan Briers
6d78d05520 Do not write unmodified cvars to config file. 2020-12-04 11:23:15 +01:00
Pieter-Jan Briers
953120aa76 Move various config manager APIs to internal. 2020-12-04 11:15:09 +01:00
Pieter-Jan Briers
6275768547 Change client user data dir to Space Station 14/data.
Because, you know, before content could access the engine installation directory.
2020-12-04 11:08:44 +01:00
John Ginnane
6323348a04 Fixed handling keybinds.yml with no binds (#1433) 2020-12-04 11:08:32 +01:00
Pieter-Jan Briers
548735ac3d Clean up engine cvars file.
Add separating comments.
Remove unused CVars.
Add CLIENTONLY or SERVERONLY where applicable.
2020-12-04 10:59:45 +01:00
Pieter-Jan Briers
a4206882f2 Make error on duplicate loading assembly names more clear.
This is extremely inconsequential but I ran into this because I made a mess of my bin folder testing zip mounting SO...
2020-12-04 00:42:28 +01:00
Pieter-Jan Briers
97ea530312 Fix some IoC thread exceptions in HTTP handlers. 2020-12-04 00:15:08 +01:00
Pieter-Jan Briers
ede4962751 Allow specifying resource mount parameters via command line.
Necessary for engine versioning.
2020-12-04 00:15:08 +01:00
Manel Navola
b8b69817ec Added master volume configuration and set master volume method (#1427)
Co-authored-by: Manel Navola <ManelNavola@users.noreply.github.com>
2020-12-03 17:34:13 +01:00
Saphire Lattice
9f07fc4e8a Change connection's time to be UTC, and improve NetUserId to implicitly convert from Guid (#1428) 2020-12-03 15:12:46 +01:00
Vera Aguilera Puerto
5a01d65c68 Container helper to remove and delete all entities in a container. 2020-12-03 11:33:36 +01:00
Vera Aguilera Puerto
e4bccaa6ce Helper to empty a container. 2020-12-02 19:06:31 +01:00
Vera Aguilera Puerto
f380238158 Helpers to remove entities from the containers they're in, if any. 2020-12-02 17:35:53 +01:00
metalgearsloth
72f01cf416 Fix grid-tile lookups for space (#1429)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-11-30 12:54:29 +01:00
Pieter-Jan Briers
6296171b63 Move some shared engine properties to a new msbuild file. 2020-11-28 18:05:16 +01:00
Pieter-Jan Briers
1508589a2b Fix compiler warnings. 2020-11-28 17:50:28 +01:00
Pieter-Jan Briers
503f72635f Well you certainly tried, GitHub 2020-11-28 17:36:51 +01:00
Pieter-Jan Briers
b8f81789a3 Set up CodeQL since Cyberboss mentioned it.
#333
2020-11-28 17:33:23 +01:00
Pieter-Jan Briers
86d4fafd30 More GC stats. 2020-11-28 15:36:45 +01:00
Pieter-Jan Briers
1d26adf746 Stuff related to IResourceManager.TryGetDiskFilePath.
Makes it not a "temporary todo remove" API since it has merits in e.g. assembly loading performance (.NET can mmap the assembly if it has a disk path which is better).

Removed duplicated IResourceManagerInternal APIs in IResourceCache.
2020-11-28 14:59:27 +01:00
Pieter-Jan Briers
356e99df34 Allow C# 9 records and init-only properties by sandboxing.
The System.Runtime.CompilerServices.IsExternalInit type needed to be added since it is used as a modreq.
2020-11-28 02:34:22 +01:00
Pieter-Jan Briers
ef2ec40e35 Add System.Convert to sandbox whitelist.
Only the Base64 and hex string methods. The rest are all stupid and should not be used anyways.
2020-11-28 02:16:39 +01:00
Pieter-Jan Briers
488c793886 Make AssemblyTypeChecker.Types use records, add whitelist dumper command. 2020-11-28 02:16:38 +01:00
Ygg01
f28d1cb5e0 Add windows-latest to test targets (#1425)
Similar to https://github.com/space-wizards/space-station-14/pull/2634
2020-11-27 20:15:00 +01:00
Pieter-Jan Briers
247ca0c911 Fix C# interactive when modloader is using load contexts.
This fixes it on prod.
2020-11-27 16:56:09 +01:00
Pieter-Jan Briers
08f9aaa8a8 Fix lsasm crashing clyde due to huge message. 2020-11-27 16:39:30 +01:00
Pieter-Jan Briers
2225d23d09 Properly tell client if they can't connect due to "expired" RSA key. 2020-11-27 01:10:10 +01:00
Pieter-Jan Briers
2b39c05472 Return of the HttpListener. (#1423)
Microsoft isn't supporting NuGet-components ASP.NET Core ever since 3.x so using Kestrel is out.

New implementation is 100% thread pool compared to the old one which was a single specific thread.
2020-11-26 23:57:52 +01:00
Pieter-Jan Briers
a41f64f30e sandboxing (#1408) 2020-11-26 23:37:31 +01:00
Ygg01
906db8eb29 Fix Layer copy constructor (#1422)
- Inert flag wasn't propagated properly.
2020-11-26 23:11:17 +01:00
Pieter-Jan Briers
4c0414087e Fix doc error in CVar enum. 2020-11-26 18:02:01 +01:00
Pieter-Jan Briers
300f6861f7 Cut down half of map load time by caching ResolveConcreteType in serializer. 2020-11-26 15:30:18 +01:00
Pieter-Jan Briers
124b447428 Update NuGet packages.
Most notably YamlDotNet which has performance improvements for large files such as our map files.
2020-11-26 02:19:11 +01:00
DrSmugleaf
3ad65ca63f Add searching by component name to View Variables (#1417)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2020-11-26 02:01:27 +01:00
Pieter-Jan Briers
3767a7d285 Make [UI]Box2[i] unions with their primary corners as fields.
This uses .NET 5's new Unsafe.SkipInit() function and a lot of FieldOffset.

The result of this is that you can now take a `ref` to the primary corners of the boxes, as well as better codegen in some cases.
2020-11-26 02:00:05 +01:00
Pieter-Jan Briers
bf197ce04b Update lidgren and netserializer submodules 2020-11-26 01:19:36 +01:00
Pieter-Jan Briers
32de7b2709 Remove allocations from prometheus system timing. 2020-11-26 01:13:26 +01:00
Pieter-Jan Briers
c28761d5c0 Fix setting cvars with overrides. 2020-11-26 01:11:36 +01:00
DrSmugleaf
b8e5b47e7a Use 'new' expression in places where the type is evident for the engine (#1415)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2020-11-26 00:16:55 +01:00
20kdc
e82a83223f Cleanup: Fix grid lookups performed just to get map IDs (#1421)
"All of the failures have to fuel success" I don't think applies to pointless exceptions
2020-11-26 00:08:55 +01:00
Víctor Aguilera Puerto
26d1a04bbf Fix missing returns on certain AdvSimd paths causing incorrect results. 2020-11-25 13:31:49 +01:00
Víctor Aguilera Puerto
8572bd0d7f Fix DivideAvx test not being ignored 2020-11-25 11:54:10 +01:00
Víctor Aguilera Puerto
088b2da90a Fix AdvSimd Min for NumericsHelpers 2020-11-25 11:20:54 +01:00
Víctor Aguilera Puerto
6b780c55fd Numerics Helpers: SIMD accelerated array math methods (#1380)
* Numerics helpers

* Comments

* Reuse naive methods for remainders.

* Do naive operation if array length is under 4.

* NumericsHelpers takes in Span, can store elsewhere

* Make some spans read-only

* Enabled static property to disable/enable hardware accelerated paths.

* AVX support.

* welp

* .

* environment variable to disable simd

* Adds ARM support (AdvSimd)

* Fix AVX horizontal sum

* Add unit tests

* NET 5.0 moment

* RemoteExecutor moment

* Add nuget.config to the UnitTesting project only

* Add "ROBUST" prefix to env vars

* Better naming for array length utils

* Revert "Add nuget.config to the UnitTesting project only"

This reverts commit 1d474ff33d.

* Ignore ARM tests, remove #if NET5_0
2020-11-25 10:47:38 +01:00
DrSmugleaf
0114538915 Add TryGet methods for component registrations (#1409) 2020-11-25 01:12:05 +01:00
DrSmugleaf
97bbc5d282 Allow multiline ifs if their body is not multiline itself for the engine (#1416) 2020-11-25 01:11:38 +01:00
DrSmugleaf
60623348d2 Update LangVersion to 9 for all Robust projects (#1414) 2020-11-24 01:36:17 +01:00
Paul Ritter
5f940fdec6 Removes some unused variables (#1420)
Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
2020-11-24 00:51:35 +01:00
Pieter-Jan Briers
2ca5d30e9d C# 9.
Insert glasses joke here.
2020-11-24 00:50:38 +01:00
Pieter-Jan Briers
48014cc2e6 Actually clean up netpeers apparently lol. 2020-11-24 00:49:19 +01:00
Pieter-Jan Briers
2944154bab Fix string serializer crash when using different cultures. 2020-11-21 12:08:45 +01:00
DrSmugleaf
cace2eb88c Update Color.DarkSeaGreen to match .NET 5's (#1412)
* Update Color.DarkSeaGreen to match .NET 5's

* Update doc
2020-11-20 13:56:24 +01:00
DrSmugleaf
37ec9c8635 Update test-content.yml to also use dotnet-version 5.0.100 (#1413) 2020-11-20 13:53:40 +01:00
DrSmugleaf
9ce2e3d451 Update build-test.yml dotnet-version to 5.0.100 (#1411) 2020-11-20 13:15:10 +01:00
Pieter-Jan Briers
add186ea8b .NET 5.
I'll fix the fire in the morning.
2020-11-19 03:54:05 +01:00
Pieter-Jan Briers
0e946ee7a1 Optimize allocations in PVS ExcludeInvisible. 2020-11-19 03:50:21 +01:00
Paul Ritter
a37ac16fa3 EntityPrototypeIcon SpriteSpecifier (#1401)
Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
2020-11-16 01:52:19 +01:00
DrSmugleaf
0eea24326e Add SharedAppearanceComponent as a component reference (#1406) 2020-11-16 01:51:49 +01:00
metalgearsloth
04dba5c45d Fix IconComponent textures (#1402)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-11-14 01:42:49 +11:00
Pieter-Jan Briers
f5c28cdb0d Fix GridContainer for real. 2020-11-13 02:42:46 +01:00
Pieter-Jan Briers
69fe81ef20 ConGroups are gone. Long live admin flags in content. (#1371) 2020-11-13 01:10:30 +01:00
DrSmugleaf
9963d01a27 Allow multiple module testing callbacks (#1367) 2020-11-13 01:06:10 +01:00
metalgearsloth
09020fea17 Don't initialize dummyicon appearance (#1391)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-11-13 01:04:05 +01:00
Paul Ritter
ef622f7dde spritecomp will ignore state/texture attribute when layers are defined (#1399)
Co-authored-by: Paul <ritter.paul1+git@googlemail.com>
2020-11-13 01:03:47 +01:00
metalgearsloth
60d8266339 Fix timer enumeration (#1390)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-11-13 00:47:49 +01:00
Pieter-Jan Briers
5dc15b90c6 Optimize some allocations. 2020-11-11 01:30:09 +01:00
Pieter-Jan Briers
6b3beb3808 Forgot to enable unsafe on Robust.Server 2020-11-11 01:27:31 +01:00
Pieter-Jan Briers
49d2ef96b9 Use [SkipLocalsInit] 2020-11-11 01:19:55 +01:00
Pieter-Jan Briers
539b78cfb1 Clear stackallocs in GridContainer.
For SkipLocalsInit
2020-11-11 01:18:36 +01:00
Pieter-Jan Briers
362b7804d9 Fix issues with .NET 5. 2020-11-11 00:46:35 +01:00
Pieter-Jan Briers
8ef13e6918 Update Lidgren and NetSerializer submodules. 2020-11-11 00:43:58 +01:00
metalgearsloth
bb2867ad74 Fix occluder tree crash (#1397)
* Fix occluder tree crash

* TryGet

Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-11-10 20:06:34 +11:00
chairbender
ee381804ec New GridContainer capabilities and customizable tooltips (#1395)
* #272 avoid mouse overlapping tooltip when near edges,
change tooltip colors to match mockups

* #272 WIP customizable tooltips, old approach currently working still

* #272 WIP customizable tooltips, old approach currently working still

* #272 ensure tooltips go away when disposing control

* #272 implement row-oriented GridContainer

* #272 generalize GridContainer to support
rows or cols

* #272 improve readability in new GridContainer
logic

* #272 GridContainer can expand in opposite
direction

* #272 GridContainer can expand in opposite
direction

* #272 GridContainer can expand in opposite
direction, fix test

* #272 add GridContainer capability to
limit by size rather than count

* #272 add some clarifications about ui scale and vp / rp

* #272 don't spam showtooltip
event, calculate tooltip
positioning using combined
minimum size
2020-11-10 15:21:32 +11:00
DTanxxx
791fcfd65e Updated ContainerHelpers to use new extensions (#1396)
Co-authored-by: David Tan <>
2020-11-09 09:22:31 +01:00
DrSmugleaf
d5982b3ea2 Make ContainerHelpers methods extensions (#1389) 2020-11-07 11:23:12 +11:00
metalgearsloth
df90397cbe Minor physics optimisation (#1351)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-11-06 23:39:56 +11:00
Víctor Aguilera Puerto
fd93fcb89c EyeComponent improvements (#1384)
* EyeComponent improvements

* Use EqualsApprox where appropiate.

* Update Robust.Client/GameObjects/Components/Eye/EyeComponent.cs

Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
2020-11-06 19:29:44 +11:00
metalgearsloth
60400418a5 Alphabetise cvars (#1379)
* Alphabetise cvars

* Update Robust.Client/Console/Commands/ConfigurationCommands.cs

Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>

Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
Co-authored-by: Víctor Aguilera Puerto <6766154+Zumorica@users.noreply.github.com>
Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>
2020-11-05 17:52:40 +01:00
Víctor Aguilera Puerto
04277feba6 AlignWithClosestGridTile extension for EntityCoordinates (#1386)
* AlignWithClosestGridTile extension for EntityCoordinates
- Fixes component exception when adding a timer component to a deleted entity.

* Address review

* actually...
2020-11-05 17:48:57 +01:00
metalgearsloth
5a3ac6a807 Dummy icon tryget (#1381)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-11-04 16:04:13 +01:00
metalgearsloth
7dd070856f Fix de-parenting contained entities (#1382)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-11-04 11:41:09 +01:00
metalgearsloth
178e2cbd76 Make icons great again (#1349)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-11-04 02:33:15 +01:00
metalgearsloth
04a2a832ac Make pause name less bad (#1376)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-11-04 01:40:00 +01:00
Víctor Aguilera Puerto
245c0f578d Adds grid ID to debug coords panel. 2020-11-03 19:36:30 +01:00
metalgearsloth
71033099e4 Fix initialized entity physics (#1377)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-11-03 21:45:53 +11:00
Víctor Aguilera Puerto
96b5779078 Improve math helper for next multiple. 2020-11-02 18:14:09 +01:00
Víctor Aguilera Puerto
6299302025 Adds math helper to get the next closest multiple of a number given a value. (#1378) 2020-11-02 17:04:10 +01:00
metalgearsloth
ab4be1a3c3 (Attempt to) draw world overlays inbetween entities (#1335)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-11-01 23:25:50 +01:00
metalgearsloth
ad3932b213 Guards for physics state updates (#1373)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-11-01 23:25:17 +01:00
Paul Ritter
f1552aa34d adds onadd & onremove methods to componentdependencies (#1336) 2020-11-01 23:24:35 +01:00
metalgearsloth
3c428a17a8 Fix collision inaccuracy (#1375)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-11-01 19:08:33 +01:00
metalgearsloth
910a33da53 Fix collision crash (#1370)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-31 12:15:44 +11:00
metalgearsloth
2f21a2551e Fix grid parenting (#1347)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-30 01:02:14 +01:00
DrSmugleaf
abe7d679a3 Add timer component (#1358) 2020-10-30 01:01:27 +01:00
metalgearsloth
deeda5cfa5 Grid-tree occluders (#1362)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-30 00:59:52 +01:00
DrSmugleaf
2296699651 Add shared and server eye components (#1356) 2020-10-30 00:55:56 +01:00
Peter Wedder
a6a98fb6b4 Add program change event field to IMidiRenderer (#1369) 2020-10-30 00:51:32 +01:00
zionnBE
2f79fddec7 Add teleport to player console command (#1366)
* Add teleport to player command

* Clearer description

* Simplify teleport

Co-authored-by: zionnBE <zionn@tfwno.gf>
2020-10-29 15:09:23 +01:00
metalgearsloth
6e91150e76 Virtual controller fix (#1363)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-29 13:07:45 +01:00
metalgearsloth
1e723eae92 Make transformstate actuall check equals (#1361)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-29 13:05:38 +01:00
metalgearsloth
ac5ad96117 Make lockers pushable again (#1353)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-29 20:38:12 +11:00
DrSmugleaf
dc62ac6560 Fix map deserialized entities not being included in OccluderSystem (#1357)
* Fix map deserialized entities not being included in OccluderSystem

* Revert "Fix map deserialized entities not being included in OccluderSystem"

This reverts commit 0af8b50231.

* Make it do it in occluder startup instead
2020-10-29 20:34:30 +11:00
Víctor Aguilera Puerto
214ba440dc Float spinbox (#1354)
corner styles

Co-authored-by: a.rudenko <creadth@gmail.com>
2020-10-27 20:01:04 +01:00
metalgearsloth
4fd1084946 Rotation rounding (#1352)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-27 00:34:50 +01:00
metalgearsloth
4bc53ebfe8 Fix (some) physics stuttering (#1327)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-25 15:37:03 +01:00
Pieter-Jan Briers
1f423c99e6 Configure default auth server. 2020-10-24 15:56:58 +02:00
ShadowCommander
3781844d77 Fix TextReleaseFocus keybind for console not handling args (#1346)
Clean up OnKeyBindDown of DebugConsole
2020-10-24 15:51:44 +02:00
20kdc
4f6a4c8a28 Lighting: Polar Coordinates fix: Sparkle-Be-Gone (#1345) 2020-10-24 15:51:17 +02:00
DrSmugleaf
6bbc4b01e9 Change cvar usages to use CVarDef and define them in CVars (#1330)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2020-10-24 15:40:06 +02:00
Pieter-Jan Briers
2c999faea5 Don't run updates for entity systems without the methods overriden. 2020-10-22 11:09:53 +02:00
Pieter-Jan Briers
a67cbd9cb9 Fix the last of the compiler warnings. 2020-10-22 10:26:13 +02:00
Víctor Aguilera Puerto
6a9cb790c0 Remove debug assert that doesn't apply anymore...
...after the removal of default grids.
2020-10-21 16:52:05 +02:00
Víctor Aguilera Puerto
0ef57a651e Fix loc command to get map and grid IDs from coordinates. 2020-10-21 16:12:24 +02:00
Víctor Aguilera Puerto
4b709ebb44 Fix SnapGridComponent for entities without grid. 2020-10-21 16:04:58 +02:00
Pieter-Jan Briers
972fd951f6 Fix IsWeightless for entities without grid. 2020-10-21 15:38:37 +02:00
Pieter-Jan Briers
c4e5161199 Fix compiler warnings in unit tests. 2020-10-21 15:14:49 +02:00
Víctor Aguilera Puerto
47593307b6 Remove default grids (#1322)
* Remove default grids

* Fix test. Invalid grids don't "exist" anymore in map manager.

* Fix crashes

* Fix placement modes.

* Remove warning.
2020-10-21 15:12:02 +02:00
RedlineTriad
84e60421e0 Remove leftover Travis files and clean up README.md (#1342) 2020-10-21 14:56:58 +02:00
metalgearsloth
4c698311e8 Physics speed limit (#1344)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-21 10:25:26 +02:00
metalgearsloth
9cc3c2ccd5 Don't wake immovable objects (#1343)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-21 10:24:42 +02:00
Pieter-Jan Briers
62b60fc426 Add GetOffset() helper to SnapGridComponent. 2020-10-20 12:04:46 +02:00
Pieter-Jan Briers
fe7aa87536 Fix scsi script responses. 2020-10-20 12:04:46 +02:00
20kdc
d2949ac474 Polar coordinate lighting implementation (#1324) 2020-10-19 22:39:07 +02:00
DrSmugleaf
6eb3301904 Add debug assert for transform self parenting (#1340) 2020-10-19 22:20:42 +02:00
Víctor Aguilera Puerto
e3f2e36ad4 Update Eye test to reflect new defaults. 2020-10-17 17:44:21 +02:00
metalgearsloth
4a8c84d948 Fix even more physics jank (#1338)
* Fix even more physics jank

* Minor tweaks

Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
Co-authored-by: Víctor Aguilera Puerto <6766154+Zumorica@users.noreply.github.com>
2020-10-17 17:42:22 +02:00
metalgearsloth
d2b46ca522 Fix physics cam (#1337)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-17 17:37:06 +02:00
Víctor Aguilera Puerto
8b3348d4c1 Eye zoom is 0.5 by default.
Let's be honest, this is what most mobs' eyes will default to.
2020-10-17 13:10:09 +02:00
Víctor Aguilera Puerto
b41bd56dce Serialize mass correctly in PhysicsComponent. 2020-10-16 13:22:52 +02:00
Pieter-Jan Briers
0eb9cbfffb Fix incorrect alpha blend funcs.
This caused showbb to allow you to see stars.
2020-10-15 20:06:02 +02:00
Pieter-Jan Briers
1815e6dac9 VVPropEditorTimeSpan 2020-10-15 01:26:49 +02:00
Pieter-Jan Briers
f8c8f0e126 Rename ViewVariablesPropertyEditor to VVPropEditor. 2020-10-15 01:04:40 +02:00
Pieter-Jan Briers
b14d057709 TypeSerializer for TimeSpan. 2020-10-15 01:03:24 +02:00
Exp
599b9eaa15 Fixes VV Number Fields crashing on invalid input (#1334) 2020-10-14 23:06:27 +02:00
DrSmugleaf
3176d4c06e Rename last usages of Collidable to Physics (#1333) 2020-10-14 22:42:01 +02:00
DrSmugleaf
80db55153e Expose EntitySystemManager.AllSystems property (#1332) 2020-10-14 22:40:42 +02:00
ShadowCommander
8f749c2421 Fix UI keybinds stopping after the first (#1328) 2020-10-14 18:14:17 +02:00
metalgearsloth
c0e66d725a Stop redundant appearance data from being sent (#1326)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-14 18:12:22 +02:00
DrSmugleaf
3b56affe9a Add IConfigurationManager.SetCVar for CVarDef (#1329) 2020-10-14 18:06:10 +02:00
Paul Ritter
f131f367d8 Componentdependency (#1311)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>
Co-authored-by: Víctor Aguilera Puerto <zddm@outlook.es>
Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>
2020-10-13 14:22:45 +02:00
Pieter-Jan Briers
50311afe9f Group VV members lists by declaring type. 2020-10-13 13:43:50 +02:00
metalgearsloth
bc87f2ea9c Pause refactor (#1314)
* Refactor pausing

* Sprite as well woops

* Bring PauseManagerExt back with [Obsolete] so that content compiles.

Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2020-10-12 18:16:20 +02:00
Pieter-Jan Briers
6102ee80ec Make math types mutable. 2020-10-12 17:38:24 +02:00
Pieter-Jan Briers
2386fedd25 Update Lidgren 2020-10-12 17:07:09 +02:00
Víctor Aguilera Puerto
33467d6e23 PlacementHijack can now prevent rotating. 2020-10-12 14:21:53 +02:00
Víctor Aguilera Puerto
022e044b69 Fix Entity Spawn Menu Eraser mode not clearing when closing it.
Fixes https://github.com/space-wizards/space-station-14/issues/2178
2020-10-12 14:02:35 +02:00
Víctor Aguilera Puerto
7784a41567 Adds LayerCount property to server-side SpriteComponent 2020-10-12 12:50:36 +02:00
DrSmugleaf
75238b183b Fix chunk to string test and PhysicsComponent file name (#1321)
* Fix chunk to string test and PhysicsComponent file name

* AAAAAAAAA

* Fix accidentally deanchoring everything
2020-10-12 01:01:27 +02:00
DrSmugleaf
f8d5fa5319 Rename CollidableComponent to PhysicsComponent (#1320) 2020-10-11 15:32:50 +02:00
DrSmugleaf
5bbcdbd3ef Add back Vector2i.ToEntityCoordinates (#1319) 2020-10-11 15:15:22 +02:00
DrSmugleaf
b1a09db07b Remove obsolete physics component (#1317) 2020-10-11 14:39:22 +02:00
DrSmugleaf
da76788751 Replace MapIndices to Vector2i (#1318) 2020-10-11 14:33:09 +02:00
metalgearsloth
29086a5b4b Mark MapIndices as Obsolete (#1316)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-11 13:34:38 +02:00
Pieter-Jan Briers
cabb9859ec Move Lidgren to submodule 2020-10-10 23:32:37 +02:00
metalgearsloth
672c3d7680 Make sprite error more helpful (#1313)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-10 12:05:27 +02:00
metalgearsloth
5f1251a813 LocalPosition value check (#1312)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-10 12:05:06 +02:00
ShadowCommander
6b769d814e Fix ScrollBar overshot when frame time is long (#1310) 2020-10-10 01:10:03 +02:00
Pieter-Jan Briers
e2b97d3eac Fix viewports getting cleared to #fff0 instead of #0000. 2020-10-09 15:06:24 +02:00
Paul Ritter
56b85256bf Things needed for singulo (#1306)
* things

* direction loopup table

* spinbox lineedit isvalid wasn't using isvalid
spinbox disabled functions

* fixes placementmanager

* pjb fixes
2020-10-09 14:55:19 +02:00
metalgearsloth
00fbefa4e5 Physics caching go brrt (#1307)
* Physics caching go brrt

* Minor optimisation

Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-09 11:40:02 +02:00
DrSmugleaf
23c0984d2e Change integration tests to use LoginType.GuestAssigned instead of Guest (#1308) 2020-10-09 11:38:53 +02:00
metalgearsloth
c34eaa822f Fix debug fonts (#1309)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-09 11:37:01 +02:00
Pieter-Jan Briers
e16e9f1786 Fix bad ANGLE downloads 2020-10-06 15:12:01 +02:00
Pieter-Jan Briers
ade03ceb13 Adds non-predicate FirstOrNull. 2020-10-06 15:03:27 +02:00
Pieter-Jan Briers
681741c298 ANGLE natives now included. 2020-10-06 11:21:05 +02:00
Pieter-Jan Briers
496c79a99c Native dependencies update
Use GLFW 3.3.2

OpenAL build for Linux
2020-10-06 11:00:29 +02:00
Jan Nekvapil
5bf4e9ae1a Scale frame debug into control boundaries (#1305)
* Scale frame debug into control boundaries

* Remove unnecessary  cache
2020-10-06 09:47:50 +02:00
Víctor Aguilera Puerto
c96d5933d5 Changes needed for construction (#1304)
* Placement improvements

* Slightly better YAML error
2020-10-06 01:55:04 +02:00
DrSmugleaf
aa6c0942c0 Add component references for SpriteComponent (#1303)
* Add component references for SpriteComponent

* Add RegisterComponent attribute

* Fix tests

* Revert "Fix tests"

This reverts commit 6d6b9dedd0.

* Revert "Add RegisterComponent attribute"

This reverts commit 09d6610f8a.

* Add component references manually
2020-10-06 01:46:36 +02:00
Pieter-Jan Briers
51df6dbef5 Allow TextureRect to have shaders applied to it. 2020-10-06 01:28:47 +02:00
DrSmugleaf
8dc78cdfec Add YAML serialization for nullable primitive types (#1299)
* Add YAML serialization for nullable primitive types

* Add tests and fix null serialization

* Merge primitive and nullable primitive checks

* Fix null primitive serialization test

* This kills the analyzer
2020-10-03 15:29:27 +02:00
metalgearsloth
90a4ec7606 EffectSystem excluded sessions (#1301)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-02 14:58:16 +02:00
DrSmugleaf
9a809040a8 Add HashSet YAML serialization (#1291)
* Add HashSet YAML serialization

* consider this

* Revert "consider this"

This reverts commit f542f2c0bf.

* you think you are so funny c#

* Remove reflection call, fix equals and add tests

* Make this code slightly less bad

* Fix hashset equality and add test
2020-10-02 14:52:26 +02:00
metalgearsloth
ec4db71478 PlayerSession helper (#1300)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-10-02 14:51:13 +02:00
Jan Nekvapil
6ac180ef7d Fix monitoring descriptions (#1302) 2020-10-02 14:50:13 +02:00
Víctor Aguilera Puerto
7aaeac81b0 Use EnsureComponent in ContainerManagerComponent
Just a small change.
2020-09-29 17:34:42 +02:00
Pieter-Jan Briers
99aab96694 Fix offset control outline debug rendering. 2020-09-29 15:00:37 +02:00
Pieter-Jan Briers
9410cb4b45 Ah fuck. 2020-09-29 14:49:39 +02:00
Pieter-Jan Briers
aa64528a03 Auth (#1289)
* Some stuff for auth

* Holy crap auth works

* Enable encryption even if no auth token is provided.

It's still possible that the public key was retrieved over HTTPS via the status API, in which case it will be secure.

* Fix integration test compile.

* Secure CVar API.

* Literally rewrite the auth protocol to be minecraft's.

* Better exception tolerance in server handshake.

* Auth works from launcher.

* Fix some usages of UserID instead of UserName

* Fix auth.server CVar

* Kick existing connection if same account connects twice.

* Username assignment, guest session distinguishing.

* Necessary work to make bans work.

* Expose LoginType to OnConnecting.

* Fixing tests and warnings.
2020-09-29 14:18:12 +02:00
DTanxxx
e7a49cc1f0 Removed obsolete EntitySpawnWindow constructor (#1295)
Co-authored-by: David Tan <>
2020-09-29 13:38:42 +02:00
metalgearsloth
4dd0f99374 Make AI processors equatable (#1293)
* Make AI processors equatable

* Slightly less braindead

* Fix dat null

Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-09-29 13:37:08 +02:00
DrSmugleaf
ab86b59bc8 Fix build (#1298) 2020-09-28 23:18:34 +02:00
DrSmugleaf
fa75ffbb94 Fix build (#1297)
* Fix build nullable errors

* Fix the rest
2020-09-28 21:09:11 +02:00
Paul Ritter
7b1f60c940 Readds Iconcomponent (#1296)
* yep

* directional texture
2020-09-28 20:54:29 +02:00
Pieter-Jan Briers
b69aa3c062 Oops 2020-09-26 13:32:29 +02:00
Pieter-Jan Briers
0c6d612723 Wow I really messed that up huh. 2020-09-25 22:09:24 +02:00
Pieter-Jan Briers
7de08ac592 Define CVars in a central location.
Instead of a bunch of RegisterCVar<> calls, it's now similar to Key Functions.
2020-09-25 21:21:18 +02:00
Pieter-Jan Briers
e87520bea5 Occluder tree for server. 2020-09-24 18:14:24 +02:00
Víctor Aguilera Puerto
695d8318d0 Make GetPrototypeIcon use a dummy entity to fix a crash (#1294)
* Make GetPrototypeIcon use a dummy entity to fix a crash

* Nullability
2020-09-24 17:30:19 +02:00
Pieter-Jan Briers
d7526e61bb Fix raycasting and tests. 2020-09-24 16:00:54 +02:00
20kdc
8b2b032528 Improve fallback soundfont and remove aliased patterns (#1292)
* Improve fallback soundfont and remove aliased patterns

* Better fallback soundfont: Fix tuning

* Better soundfont: Even more improvements
2020-09-24 14:53:40 +02:00
Pieter-Jan Briers
d134f31d66 Re-implement DynamicTree<T> on top of B2DynamicTree<T>. 2020-09-24 11:51:50 +02:00
Pieter-Jan Briers
bfd2fa1018 Fixes for B2DynamicTree 2020-09-24 11:50:37 +02:00
Pieter-Jan Briers
4ce4fb9a9f A more true-to-Box2D DynamicTree.
It's fast.

Could still do with some bounds check elimination I guess.
2020-09-23 19:48:31 +02:00
DTanxxx
ff32a70b10 Purge localization manager (#1285)
* Applied feedback

* Applied feedback

Co-authored-by: David Tan <>
2020-09-23 16:21:10 +02:00
Paul Ritter
827734d658 Nukes the Iconcomponent (#1290)
* removes iconcomponent

* forgot one thing

* it works!!11

* last change
2020-09-23 16:20:32 +02:00
Víctor Aguilera Puerto
991aabe8a2 Fix ClientEntityManager's entity creation
It hadn't been correctly translated to use EntityCoordinates
2020-09-22 13:09:37 +02:00
Víctor Aguilera Puerto
f1334ca57d Adds proper attribution and license for fallback soundfont 2020-09-19 19:23:22 +02:00
DrSmugleaf
25aaac7dbf Make the tile spawn search bar autofocus (#1287) 2020-09-17 23:19:17 +02:00
Swept
0febea16da Toggle FOV command (#1288)
* Initial

* Thanks Exp
2020-09-17 23:18:58 +02:00
DTanxxx
8dc3723c09 Make more fields VV and editable (#1284)
* Make more fields VV and editable

* Applied feedback

Co-authored-by: David Tan <>
2020-09-17 23:17:46 +02:00
Pieter-Jan Briers
f926698db0 Fix texture swizzle on GLES3.
ES doesn't support the combined swizzle parameter so we have to  set them separately.
2020-09-16 00:54:11 +02:00
DrSmugleaf
4cbdde6ec3 Make GetTilesIntersecting translate from world to local to tile (#1286) 2020-09-11 19:20:24 +02:00
Víctor Aguilera Puerto
ab0c135fbf ViewVariables for grids 2020-09-11 13:03:57 +02:00
Pieter-Jan Briers
874995225b I blame rider for all my faults. 2020-09-10 11:55:25 +02:00
Pieter-Jan Briers
a8c4270834 Fix mixup of KHR suffix debug functions. 2020-09-10 11:40:21 +02:00
derek
9cc9b68e09 Toggle function in BoundUserInterface (#1283)
* add toggle

* Update Robust.Server/GameObjects/Components/UserInterface/ServerUserInterfaceComponent.cs

Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>

Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>
2020-09-08 18:54:03 +02:00
Exp
31e9554cd7 Makes more fields VV (#1282)
* Sprite & Appearance VV

* Added Client SpriteComp & RSI
2020-09-08 18:44:53 +02:00
Pieter-Jan Briers
a72d2beb86 Ignore that. 2020-09-07 21:53:39 +02:00
Pieter-Jan Briers
cce8d81bcf Add Histogram metrics for per-system time usage. 2020-09-07 21:50:08 +02:00
Víctor Aguilera Puerto
1181464829 Add RotateEvent raised when a Transform's LocalRotation changes. 2020-09-07 13:56:34 +02:00
Pieter-Jan Briers
a19e12e693 display.uiScale 0 (the new default) pulls UI scale from OS. 2020-09-07 12:58:44 +02:00
Pieter-Jan Briers
e60ecfad49 Enable bilinear filtering for logo. 2020-09-07 12:18:05 +02:00
Pieter-Jan Briers
4e6f8ca224 Remove OptionsMenu from engine. 2020-09-07 11:07:49 +02:00
20kdc
5146bf8ac2 More configurable lighting (also, "Rounded" mode for Range) (#1274)
* Add support for 'Rounded' mode to Range (and thus Slider)

* Make lighting resolution more configurable

* Use a lighting presets dropper because RemieRichards said so

* Make ConfigLightingQuality not a property and instead two separate methods

* More configurable lighting: cleanup to use a switch rather than an if-chain
2020-09-07 10:57:44 +02:00
Pieter-Jan Briers
1eb03eb339 Various modifications to the input manager to allow key rebinding. 2020-09-07 10:55:41 +02:00
Pieter-Jan Briers
f3398853c1 Adds more file opening convenience methods. 2020-09-07 10:55:40 +02:00
Pieter-Jan Briers
81c299e40d Adds UIRightClick key function. 2020-09-07 10:55:40 +02:00
Pieter-Jan Briers
e80b6a238d Add Keyboard.Key.IsMouseKey().
I needed this for something but didn't end up using it, whatever.
2020-09-07 10:55:40 +02:00
Pieter-Jan Briers
482c8e1317 Fix ISelfSerialize serialization. 2020-09-07 10:55:40 +02:00
Acruid
f66ad68848 Pulls ClientSendMessage up from IClientNetManager to INetManager, so that a shared context on the client can actually send net messages, like the server. 2020-09-06 09:35:54 -07:00
Acruid
2b3f419e3c Adds PeekStringSize() to the lidgren netbuffer, which allows you to get the size in bytes of the string without actually decoding the string. 2020-09-06 09:30:55 -07:00
Víctor Aguilera Puerto
794e5a1d5c Fix missing method in IMapGrid 2020-09-06 17:03:13 +02:00
DrSmugleaf
0a67cecfa5 Replace every usage of GridCoordinates with EntityCoordinates (#1280)
* Added struct skeleton for EntityCoordinates.

* Polish EntityCoordinates, add tests, add EntityCoordinates to Transforms

* Doc cleanup

* Remove useless code

* Return offset 0 when you don't have a parent

* Test for making sure EntityCoordinates for entities without parents have offset 0

* Use parent transform's GridId for GetGridId.

* Adds various methods, checks and tests

* Replace GridCoordinates with EntityCoordinates

* EyeManager.WorldToScreen fix

* Address reviews

* Fix za buildo

* Fix one transform test

* Fix the remaining tests

* Remove duplicate

* Remove another merge duplicate

* Fix property

* Rename most usages of GridCoordinates to EntityCoordinates.

* Add WithEntityId method to EntityCoordinates.

* Fix EntityCoordinates usage in GetEntitiesInRange

* Remove cursed IMapGrid method, change naming.

* Makes GridTileLookupSystem use EntityCoordinates

Co-authored-by: Acruid <shatter66@gmail.com>
Co-authored-by: Víctor Aguilera Puerto <zddm@outlook.es>
2020-09-06 16:09:19 +02:00
Víctor Aguilera Puerto
ec2fa6e86e Fix GridTileLookupSystem trying to get deleted entities' components on Round Restart 2020-09-06 15:48:36 +02:00
metalgearsloth
664e6a00ee Grid tile lookup system (#1281)
* Grid tile lookup system

* Make grid updates better for lookup

Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-09-06 15:43:18 +02:00
Víctor Aguilera Puerto
0701b040ee EntityCoordinates (#1277)
* Added struct skeleton for EntityCoordinates.

* Polish EntityCoordinates, add tests, add EntityCoordinates to Transforms

* Doc cleanup

* Remove useless code

* Return offset 0 when you don't have a parent

* Test for making sure EntityCoordinates for entities without parents have offset 0

* Use parent transform's GridId for GetGridId.

* Adds various methods, checks and tests

* Adds new constructor to EntityCoordinates and add WithPosition method

Co-authored-by: Acruid <shatter66@gmail.com>
2020-09-04 23:08:18 +02:00
DrSmugleaf
d9f5c7d7b5 Add NextMapId and NextGridId to IMapManager (#1279) 2020-09-03 21:38:46 +02:00
20kdc
49242f8a0a Auto-replace texture2D with texture to fix issues with deprecated function names (#1278) 2020-09-03 19:15:09 +02:00
nuke
17402b69f7 Add Color.ToHexNoAlpha (#1275) 2020-09-03 14:36:51 +02:00
20kdc
7736882da2 GLES2: Support for GL_OES_standard_derivatives (fixes wall brightening when available) (#1276) 2020-09-03 09:38:17 +02:00
DrSmugleaf
1a453a0d23 Make HighestMapID and HighestGridID public for content to read (#1271) 2020-09-02 23:07:41 +02:00
Pieter-Jan Briers
b4fac5256c More Clyde GL version things.
Correctly use KHR and OES suffixed functions for debug output and VAOs, if necessary.

Allow overriding the detected GL version for feature detection (nvidia gives me an ES 3.2 context even when ES 2.0 is requested, so...)
2020-09-02 22:10:50 +02:00
ShadowCommander
72d8f60846 Add debug highlighting for UI Controls (#1272) 2020-09-02 12:32:30 +02:00
Pieter-Jan Briers
3ea73e9d2a Various OpenGL fixes.
1. Fixes screenshots on ES by providing a fallback path for when encessary features (PBO, fence sync, mapbuffer) are not available.
2. Correctly detect fence sync as not always being available for 3.1
3. Remove the "bad OpenGL version" box. We have MessageBoxW now.
4. Separated feature detection for ES and Desktop, added more feature detections on various sides.
5. Moved GL feature detection to its own file.
2020-09-02 01:47:12 +02:00
20kdc
4f5d2664b8 Prevent gl_FragColor deprecation issues on GL3.3 (hopefully finally ending the saga of hotfixes) (#1270) 2020-09-01 20:40:55 +02:00
Víctor Aguilera Puerto
eab9335886 Actually use argument in MapGrid GetAllTiles 2020-09-01 17:38:53 +02:00
20kdc
880be34b8d GLES2: hotfix: Use in/out to prevent core profile complaints (#1269) 2020-09-01 17:25:06 +02:00
20kdc
4777a0adbf GLES2 users, assemble! (#1266) 2020-09-01 15:27:14 +02:00
Pieter-Jan Briers
c5573c0d33 Fix unit tests. 2020-09-01 01:13:12 +02:00
Pieter-Jan Briers
3f43e86530 NetMessageAccept, NetMessage dispatch cleanup.
Net message functions are now cached when the message is registered or the string table updates (client side). This removes the cache call from DispatchNetMessage.

Receiving net messages that we don't have reception callbacks for, or that are blocked with the new NetMessageAccept enum, will instantly cause the net manager to drop the offending connection to avoid malicious use.

This means trying to send string tables to the server will just result in an instant kick without even hitting ReadFromBuffer().

This allows us to move some if() checks to asserts.
2020-09-01 01:03:06 +02:00
Pieter-Jan Briers
36f29d54ed Mapped string serializer cleanup and fixes. 2020-08-31 22:58:42 +02:00
Víctor Aguilera Puerto
59a003cda0 Add path to RSI class 2020-08-31 20:45:45 +02:00
Víctor Aguilera Puerto
f25318a096 Fix IEntityManager doc 2020-08-31 20:45:24 +02:00
nuke
0b1b496caf Make more light properties animatable (#1267) 2020-08-30 17:03:34 +02:00
Víctor Aguilera Puerto
524177550f Fix YamlFlagSerializer doc 2020-08-30 15:00:10 +02:00
ShadowCommander
89dca78d18 Fix Button Labels not updating styles when Button is disabled/enabled (#1263)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>
2020-08-30 00:12:56 +02:00
metalgearsloth
6ffe2e1750 Effect entity parenting (#1264)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-08-29 12:59:18 +02:00
Pieter-Jan Briers
5faa8a59c1 Add some [Pure] annotations. 2020-08-29 07:53:50 +02:00
Pieter-Jan Briers
6b92db35f0 Deterministic RobustMappedStringSerializer (#1265) 2020-08-29 07:53:29 +02:00
Acruid
5261c8d5aa Exposes the IEntitySystemManager on the IEntityManager.
Adds a ToString override to InputCmdMessage.
2020-08-27 13:02:31 -07:00
Pieter-Jan Briers
0f38d7f7a1 Suppress collision regeneration while updating chunk from game state.
Tiny optimization.
2020-08-27 02:24:27 +02:00
Pieter-Jan Briers
0682dcf98c Sprinkle glGetError everywhere. 2020-08-27 02:11:46 +02:00
Swept
cd1d6035e5 Control.cs (#1262) 2020-08-27 00:31:12 +02:00
Pieter-Jan Briers
4967238202 Don't throw in ISpriteLayer.EffectiveDirection if invalid state. 2020-08-26 19:35:31 +02:00
Pieter-Jan Briers
c0262ec6f5 Always make Vector2i serializable.
Fixes https://github.com/space-wizards/space-station-14/issues/1898
2020-08-26 17:41:00 +02:00
Pieter-Jan Briers
56d0f04c05 Committing debug logs ftw. 2020-08-26 17:24:25 +02:00
Pieter-Jan Briers
ee9d107be5 Apply multiple game states at once if game state buffer overflowing above threshold.
Fixes #1252
2020-08-26 16:28:25 +02:00
Pieter-Jan Briers
f5e23fc710 Fix Lidgren crashing if lo is the only available network adapter. 2020-08-26 16:25:31 +02:00
Pieter-Jan Briers
3f0e2fa429 Fix GameStateProcessor skipping over necessary game states in some extrapolation cases.
Fixes #1246
2020-08-26 13:45:15 +02:00
Pieter-Jan Briers
cd5115fa85 The comment was right there, man. 2020-08-26 01:01:18 +02:00
Exp
904869cc68 Allows CVars to be listed (#1259) 2020-08-25 23:26:02 +02:00
metalgearsloth
09b1718d0a IsIntersecting method for EntityManager (#1254)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-08-25 23:25:32 +02:00
Pieter-Jan Briers
0b67c00057 Make a Windows message box if the game window can't be opened (#1260) 2020-08-25 23:23:55 +02:00
Pieter-Jan Briers
381cdb5fbb Add OpenGL 3.1 support.
h
2020-08-25 21:44:01 +02:00
Pieter-Jan Briers
9b77085626 Log exception to server console on client command ExecuteError. 2020-08-25 21:33:24 +02:00
Pieter-Jan Briers
7890c1b39c Fix bogus nullability errors from Rider.
None of these are actual nullability warnings but they make Rider shut up so.
2020-08-25 17:48:23 +02:00
Exp
584e540bb2 Admin Menu Engine PR (#1219) 2020-08-25 14:58:24 +02:00
DrSmugleaf
ad2545d83d Add nullable API methods for getting components and user interfaces (#1241) 2020-08-22 13:56:05 +02:00
Pieter-Jan Briers
6133ba77ca Change Prometheus tick time histogram to better fit. 2020-08-21 22:31:07 +02:00
Víctor Aguilera Puerto
afc5aa1075 Dispose of MIDI renderers on the MIDI thread (#1248) 2020-08-21 20:39:36 +02:00
Pieter-Jan Briers
865610df1e Fix IMapManager.CreateNewMapEntity not initializing the created entity. 2020-08-21 17:15:18 +02:00
Pieter-Jan Briers
f0824212da Make container shutdown more sane.
Fixed removal of deleted entities from their parent container not working if one of said parent's other containers got deleted at some point.
2020-08-21 14:53:48 +02:00
metalgearsloth
31f44027a1 Add PlayerSession exclude for audiosystem (#1243)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-08-21 14:53:38 +02:00
Pieter-Jan Briers
68d80cb136 Fix exceptions in audio system update. 2020-08-20 21:34:40 +02:00
Pieter-Jan Briers
90108f66ae Fix unplayable streams not disposing audio sources immediately. 2020-08-20 21:34:23 +02:00
Pieter-Jan Briers
79b3b51498 Fix bad #region. 2020-08-20 20:46:03 +02:00
Pieter-Jan Briers
cc8addd34e Adds integer clamps. 2020-08-20 20:45:52 +02:00
Pieter-Jan Briers
0958ce3e51 MathHelper make use of MathF better. 2020-08-20 20:41:22 +02:00
Pieter-Jan Briers
0d7e6a8e1c Fix loading config. 2020-08-20 20:31:01 +02:00
Visne
9d1bec9bb2 Merge FloatMath and MathHelper (#1234)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2020-08-20 19:21:07 +02:00
Pieter-Jan Briers
21d493a6ec Ensure that paths are rooted in WritableDirProvider. 2020-08-20 18:52:31 +02:00
Pieter-Jan Briers
2fb60f7129 Actually disable runtime log output in integration tests. 2020-08-20 18:52:31 +02:00
Pieter-Jan Briers
3148371d18 Use virtual file system on server integration tests. 2020-08-20 18:52:31 +02:00
Pieter-Jan Briers
3fa2cece72 Allow disabling runtimelog output.
Necessary for parallel integration tests.
2020-08-20 18:52:30 +02:00
Pieter-Jan Briers
773ea34ee3 Make integration tests TearDown OneTimeTearDown.
Fixes concurrency issues.
2020-08-20 18:52:30 +02:00
Pieter-Jan Briers
00f914d212 Fix read/write issues with VirtualFileStream.
This one was pretty obvious and silly.
2020-08-20 18:52:30 +02:00
DrSmugleaf
31ff253fc0 Replace assert with nullable operator (#1242) 2020-08-20 16:38:56 +02:00
Pieter-Jan Briers
d4fc0517c4 Fix IEntity.TryGetComponent nullability signatures.
This means all invocations of TryGetComponent now need a nullable parameter because, well, the result can be null. that's the point.
2020-08-20 15:31:18 +02:00
Acruid
1513389fc1 Adds a property to IoCManager that gives access to the IDependencyCollection singleton of the thread. 2020-08-18 16:29:57 -07:00
Acruid
b1a19e8942 Adds the ability to register a single prototype class with the PrototypeManager. 2020-08-18 15:20:32 -07:00
Acruid
6245b2223b Improve performance when initially settling the map at load time.
Clients now simulate all awake bodies when predicting, not just predicted ones.
2020-08-18 10:59:49 -07:00
Acruid
63fca2fb3a Adds the 'rmcomp' console command, for manually removing components from entities. 2020-08-18 10:25:35 -07:00
DrSmugleaf
15ee6a42be Add component message for an entity moving (#1180)
* Add component message for an entity moving

* Bring EntityMovementMessage out of the container check

* Make entity movement messages use one instance and mark PublicAPI
2020-08-16 18:17:28 -07:00
Pieter-Jan Briers
c72ea7194e Add RequestWindowAttention API. 2020-08-16 23:21:07 +02:00
Pieter-Jan Briers
559d890128 Fix exceptions falling through in NetManager.DispatchNetMessage 2020-08-16 21:49:23 +02:00
Pieter-Jan Briers
da43d56680 Add command filtering to list command. 2020-08-16 16:59:08 +02:00
DrSmugleaf
8d060e69af Fix physics bodies not being woken up when changing a controller's velocity (#1235) 2020-08-16 16:23:29 +02:00
Pieter-Jan Briers
688ec89d43 Dump ToString() when component not found. 2020-08-16 14:49:48 +02:00
Pieter-Jan Briers
d18319bd7b Entities now show if they are deleted in ToString() 2020-08-16 14:49:48 +02:00
Vince
6a546dadf1 Fixes most warnings (#1233) 2020-08-16 14:04:15 +02:00
Pieter-Jan Briers
a6273cf1a1 Don't include assembly strings into the string dict.
This is a pretty awful idea and it wastes a lot of bandwidth.
2020-08-16 02:40:59 +02:00
Pieter-Jan Briers
e828a9d8c8 Remove bad usage of Lazy<> from RobustMappedStringSerializer. 2020-08-16 02:40:22 +02:00
Pieter-Jan Briers
562901e8e7 Fix exceptions from netchannel disconnecting during handshake. 2020-08-16 02:19:57 +02:00
Pieter-Jan Briers
5637669876 Allows VV to read KeyValuePair<,>s over the network.
This required a bit of refactorings and improvements but oh well.
2020-08-16 01:59:01 +02:00
Pieter-Jan Briers
1e89c5f1fd IWritableDirProvider does not allow access to parent directories.
Fixes #1229

Added tests.
2020-08-16 01:32:19 +02:00
Pieter-Jan Briers
1934428c95 Use better file access patterns in engine. 2020-08-16 01:08:07 +02:00
Pieter-Jan Briers
4f5e1d5650 Improve IWritableDirProvider API:
Added Open() method that takes in FileMode, FileAccess AND FileShare.
Added extra extension method helpers and made use of better FileAccess/FileShare modes.
2020-08-16 01:06:42 +02:00
Pieter-Jan Briers
6889e2cba3 Fixes FrameUpdate getting 0 dt when paused.
Fixes #1226
2020-08-15 16:35:32 +02:00
Víctor Aguilera Puerto
5819e5ee92 Adds GetCardinalDir extension 2020-08-15 03:18:51 +02:00
Pieter-Jan Briers
08b7550a85 Allow VVing IPlayerManager on the server. 2020-08-15 01:12:13 +02:00
ShadowCommander
8b931fc56e Fix input handling and stop input when a cmd returns true (#1222) 2020-08-15 00:31:09 +02:00
SoulSloth
fe1e37d8df Fix melee audio on entity destruction (#1192) 2020-08-15 00:30:45 +02:00
DrSmugleaf
7bfd5eb72e Add NetSerializer dictionary test (#1214)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2020-08-14 23:55:07 +02:00
Pieter-Jan Briers
af261d32ef Load PDBs even on FULL_RELEASE. 2020-08-14 23:54:24 +02:00
DrSmugleaf
5c10050f9e Add NetSerializer HashSet test (#1213) 2020-08-14 23:27:17 +02:00
Pieter-Jan Briers
60942545f6 Update NetSerializer 2020-08-14 23:09:09 +02:00
Exp
73d529386d Added Console Tab Completion (#1212)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>
2020-08-14 22:47:26 +02:00
Acruid
c7f5521d2e Removed IsEntityPaused from the server component query, it was bugged and only about 1/5 of the entities on the map were actually processed in the collision system. This change causes a noticeable perf impact when starting the server and lasting until everything on the map goes to sleep.
BodyType is now serializable, fixes bug with VV.
Moved both velocity properties from ICollidableComponent to IPhysBody, added default methods to IPhysBody to get the word transform.
Added DebugTools.Break() method, calling it breaks execution in the attacked debugger.
Added VV attributes to various CollidableComponent properties.
2020-08-13 21:52:53 -07:00
Víctor Aguilera Puerto
58b6e18030 Adds new macros for to be and have english verbs. 2020-08-14 02:43:46 +02:00
Pieter-Jan Briers
d4a47778ef Remove this parameter from FloatMath.Clamp.
That was a stupid idea.
2020-08-12 21:17:18 +02:00
Pieter-Jan Briers
b45ea725d7 Remove CannyFastMath. 2020-08-12 21:17:17 +02:00
Víctor Aguilera Puerto
5bb3bc7083 Remove CannyFastMath usage from Box2 and Box2i. 2020-08-12 21:02:13 +02:00
Víctor Aguilera Puerto
9ca48a0375 Revert fix attempt.
Be sure to always check what branch you've checked out, people.
2020-08-12 18:01:49 +02:00
Víctor Aguilera Puerto
ef4c807498 Attempt to fix grid 0 bug. 2020-08-12 17:57:25 +02:00
Víctor Aguilera Puerto
a3dfa49798 Fix typo in lidgren 2020-08-11 17:51:19 +02:00
DrSmugleaf
d407fecab5 Add ContainerHelpers method to check if an entity is in the same container as another or both are in none (#1216) 2020-08-10 16:38:28 +02:00
Acruid
64a3916c04 Added the Robust.Physics project.
Added BenchmarkDotNet to the Robust.UnitTesting project.
2020-08-09 13:43:57 -07:00
Acruid
6c3c22affe Added AlignedRectangle (Box2) collision features. 2020-08-09 01:23:03 -07:00
Acruid
c4899069c6 Added sleep culling to physics bodies, noticeable perf gains.
Bodies without velocity are considered for collision, lockers are fixed.
Added force/torque integration to physics bodies.
Friction is now tickrate agnostic.
2020-08-09 01:16:55 -07:00
ike709
55bcbaaca2 Fix player jittering when colliding with a wall (#1218) 2020-08-09 04:30:24 +02:00
Acruid
7d74c02c8d Fixed a bug with overlay drawing arguments.
Added mouse hover info about collision bodies in the collision overlay.
2020-08-08 16:56:14 -07:00
ShadowCommander
444eecf339 Change BaseWindow and SS14Window to open where they previously closed (#1217)
First open will be top left, centered, or left vertically centered. The subsequent calls to open will open the window at the position the window was closed at.
2020-08-09 00:13:09 +02:00
Acruid
5d2e3a4c61 Minor API improvements. 2020-08-06 22:00:20 -07:00
ShadowCommander
97f0479676 Fix OpenCentered by setting size before position (#1211) 2020-08-06 15:53:37 +02:00
Pieter-Jan Briers
a25861461e Small GLES compat fix.
Makes glTexImage2D call in render target creation pass legal arguments for GLES.
2020-08-06 13:31:55 +02:00
L.E.D
b983863c90 fix deleted entity exception (#1208) 2020-08-03 00:40:59 +02:00
Víctor Aguilera Puerto
714e51c0e1 Remove proof of concept for gas. 2020-08-02 21:14:50 +02:00
ShadowCommander
e5ae2182b0 Make timer more accurate when repeating (#1206) 2020-08-02 19:48:55 +02:00
Víctor Aguilera Puerto
44bcbfa8e5 Misc changed needed for atmos (#1186)
* Add needed changes for atmos

* Get delays for RSI state

* Placement hijack can handle deletion on gridcoordinates

* Array serialization

* MapIndices to GridCoordinates

* CollidableComponent creates VirtualControllers using IDynamicTypeFactory

* Probability assert now prints chance

* Remove unused stuff, fix build

* Update documentation for map indices

* readability

* Removed unused using statements

* Remove ToAngle

* Fix messed up merge

* Fix MapIndices/GridCoordinates conversion

* Add "invalid" direction.

* Update Robust.Shared/Serialization/YamlObjectSerializer.cs

* Nullable fix

Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>
2020-08-02 18:39:23 +02:00
SoulSloth
e21cf79ee4 Made Point Light Radius Animatable (#1207) 2020-08-02 17:33:08 +02:00
Acruid
08edc2a3a9 Fix bug where PhysShapeCircle was not raising it's changed event when changing radius.
Made PhysShapeCircle public.
2020-08-02 00:03:58 -07:00
Acruid
8e2914d520 Enums are hard :(
This fixes screenspace overlays not showing up, like flash and net graph.
2020-07-31 23:38:41 -07:00
Acruid
900bf76a7d Attempt #2 to fix the timing bugs. CurTime increases again, and all the unit tests pass this time.
This resolves https://github.com/space-wizards/space-station-14/issues/1560.
Special thanks to PJB's prediction unit tests.
2020-07-31 23:20:35 -07:00
Acruid
ca297ee739 Removed EnumHelper.TryParse because the .Net devs got around to adding a non-generic version of Enum.TryParse. 2020-07-31 14:12:19 -07:00
Acruid
a5125a0561 Allows Overlays to draw to multiple spaces on the screen.
Removed Overlay.Shader property, you need to manage the field yourself and apply the shader before you draw.
Made all overlays compatible with the new changes.
2020-07-31 14:00:12 -07:00
Acruid
3fd1a2f3fb Fill out cases for the shape switch.
Circle-Box collisions!

Circle Collisions!

PhysShapeCircle!
2020-07-31 12:02:41 -07:00
Acruid
2b692d596e Stops the GameTiming class from blindly caching the curTime constantly, regardless of it was in prediction/simulation or not. This seems to completely solve the issue of CurTime being negative. As long as Tickrate is only changed when processing the latest server state (not half way through prediction), everything should be OK. 2020-07-30 17:20:52 -07:00
Pieter-Jan Briers
53288ffd2b YamlObjectSerializer.IsSerializedEqual now handles dictionaries. 2020-07-31 01:44:56 +02:00
Pieter-Jan Briers
f0c59f21b0 Fix AppVeyor 2020-07-30 23:11:03 +02:00
Pieter-Jan Briers
ac32042ab3 Good job there forgetting to update AppVeyor 2020-07-30 18:48:11 +02:00
Pieter-Jan Briers
ba622bf457 Update NetSerializer again so the dirty file is gone.
This change literally does not affect us but whatever.
2020-07-30 18:46:33 +02:00
Pieter-Jan Briers
f2b779d964 Remove engine BuildChecker.
It apparently has been broken for over a year and I trust anybody working on the engine to be smart enough to not need it.
2020-07-30 18:45:55 +02:00
Pieter-Jan Briers
d3786df4bb Analyzer for the lidgren tests aswell. 2020-07-30 18:41:37 +02:00
Pieter-Jan Briers
2fc6614118 Add NUnit.Analyzers analyzer
Caught numerous cases of expected/actual being mixed and even a few broken test cases in content.
2020-07-30 18:38:17 +02:00
Pieter-Jan Briers
907db466c9 Update NetSerializer submodule for optimizations. 2020-07-30 15:06:45 +02:00
Pieter-Jan Briers
6a62b618dc More NetSerializer unit tests. 2020-07-30 15:06:45 +02:00
Pieter-Jan Briers
3cc092f9ee Make RobustMappedStringSerializer use NetSerializer's string serialization code again.
It's much more efficient, especially after more optimizations I just made to it.
2020-07-30 15:06:45 +02:00
Pieter-Jan Briers
380432a1f1 Optimize IRobustSerializer usages throughout the code.
Mark some classes as sealed where possible to remove type tags.
Re-order GameStateMapData.GridCreationDatum to reduce memory usage.
Use MemoryStream.TryGetBuffer instead of .ToArray() all over the place to cut out allocations.
Use VariableInt32s for serialized buffer sizes.
Use IRobustSerializer.SerializeDirect<T> where possible.
2020-07-30 15:06:45 +02:00
Pieter-Jan Briers
028453acee Add SerializeDirect/DeserializeDirect to IRobustSerializer.
This matches the NetSerializer API to skip initial type IDs which is a bit more efficient.

Also made RobustSerializer thread safe.
2020-07-30 15:06:45 +02:00
Pieter-Jan Briers
0b302b5171 Move a Span<byte> -> ReadOnlySpan<byte> in NetBuffer.Write.cs 2020-07-30 15:06:45 +02:00
DrSmugleaf
011a06a7d8 Fix za buildo (#1202) 2020-07-30 13:46:17 +02:00
Acruid
3f5321853a Removed obsolete ScreenToWorld methods from EyeManager. 2020-07-29 16:54:01 -07:00
Acruid
350e05c152 Adds new functions to IComponentManager that can efficiently query for all entities with a set of components. 2020-07-29 15:48:32 -07:00
Acruid
0bf451d5d4 Turns out TransformComponent already has the matrix available to use. 2020-07-29 14:27:20 -07:00
Acruid
b8e9e3634b Grid rendering can now render rotated grids. 2020-07-29 12:05:09 -07:00
DrSmugleaf
1de41531ce Fix casing on physics and collidable data fields (#1197) 2020-07-29 14:43:18 +02:00
Acruid
876d528578 Had to optimize the physics so that the client runs on my laptop. 2020-07-29 00:47:47 -07:00
Pieter-Jan Briers
3648f43f5c Include NetSerializer as a submodule, add List<T> serializer. (#1195)
* Include NetSerializer as a submodule.

* NetSerializer list serializer.

* Update Actions workflows to handle the new submodule.

* Whoops
2020-07-28 18:56:20 -07:00
py01
708e546446 CollidableComponent Anchored serialization (#1196)
Co-authored-by: py01 <pyronetics01@gmail.com>
2020-07-28 18:43:09 -07:00
Pieter-Jan Briers
e5ddc4f654 Move light intersection check earlier, slight optimization.
Not sure why it wasn't like this in the first place.
2020-07-29 02:10:04 +02:00
Pieter-Jan Briers
c482253b9d Clyde debug stats for light count. 2020-07-29 02:06:39 +02:00
Moses
27fccbe74c 1513 Erase mode button toggle (#1194) 2020-07-28 14:12:29 -07:00
Pieter-Jan Briers
c945c2abad Mark EntityEventArgs as serializable.
Internal NetSerializer assertions need this.
2020-07-28 02:31:12 +02:00
Pieter-Jan Briers
b9573d8c00 Fixes container occlusion not updating if container manager is deleted.
Fixes space-wizards/space-station-14/issues/1352
2020-07-27 16:30:25 +02:00
Pieter-Jan Briers
406e5277a6 Integration testing improvements.
Run Update in Integration game loop.
Ability to load extra prototypes from a string.
2020-07-26 14:07:24 +02:00
L.E.D
16d50f3ecf Container light occlusion (#967)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2020-07-26 13:28:25 +02:00
Víctor Aguilera Puerto
d5e422f34e Debug coordinates panel now displays actual entity transform position 2020-07-26 03:16:10 +02:00
Pieter-Jan Briers
a3d250a5c4 Allow YamlObjectSerializer to read/write immutable interface collections. 2020-07-26 01:35:43 +02:00
ShadowCommander
30108cf992 Refactor DetachParent (#1188) 2020-07-25 17:04:14 +02:00
Exp
d2d248a175 Fixed Pitch Bend not working correctly (#1190) 2020-07-24 14:39:48 +02:00
DrSmugleaf
40a8dae236 Allow one VirtualController in CollidableComponent per individual type (#1189)
* Replace single controller with a dictionary

* Actually initialize the controller dictionary

* Fix not upgrading old physics controllers

* Return controller when adding it in CollidableComponent

* Make GetOrCreate name consistent

* Add updating linear velocity depending on controllers

* Address reviews

* Update Robust.Shared/Physics/VirtualController.cs

Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>

* Add missing physics component methods

* Make method names consistent with the rest of the project

* Add documentation to controller manipulation methods

* Add another method for controller manipulation

* Add SetController method

* Add stop method

* Add stop method to controllers

* Add bool return type to controller stopping and GetControllers method

* Fix physics stop return type not being bool

Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>
2020-07-23 18:32:45 +02:00
Acruid
52da9b48d7 Marks the 'Default Grid' API methods as Obsolete, in preparation for their removal. 2020-07-22 15:04:41 -07:00
Acruid
8475c1ae4b Moves all of the PhysicsComponent data to the CollidableComponent, and marks the PhysicsComponent as obsolete. 2020-07-21 23:36:42 -07:00
Pieter-Jan Briers
0297464af5 Fix MapID assignment in transform init. 2020-07-22 01:51:17 +02:00
Pieter-Jan Briers
6e35b37e0f Fix stretching bugs on odd viewport sizes. 2020-07-21 00:59:52 +02:00
Pieter-Jan Briers
aa596610de Adds initialization assert to AddComponent. 2020-07-21 00:14:08 +02:00
Pieter-Jan Briers
bbbaef5da4 Fix integration tests.
They weren't pumping networking anymore because Acruid moved it to Input.
2020-07-20 12:12:56 +02:00
Pieter-Jan Briers
e68c5b47e7 Remove Fody and ImageSharp hack.
They have a public method for this...
2020-07-20 01:09:06 +02:00
Pieter-Jan Briers
808bbeb71c Remove CollectionExtensions.Deconstruct
Long live KeyValuePair<,>.Deconstruct
2020-07-20 01:03:30 +02:00
Pieter-Jan Briers
449ed4ad7c Don't detach from console.
This was a dumb idea.
2020-07-20 01:02:06 +02:00
Pieter-Jan Briers
f6e900e6fd Don't run Prometheus metrics on the client. 2020-07-20 01:01:35 +02:00
Acruid
5e448f20c0 Move parts of the simulation update back into engine, from Content's StateBase.
Allow content to push modal windows in the UI framework.
The MenuBar now closes it's MenuButton frame when you select one of the buttons.
Modal controls on the stack now actually block input from the rest of the UI.
Adds the `scene` concommand for instantly switching between game states (scenes).
2020-07-19 12:31:13 -07:00
DrSmugleaf
ede9795ba6 Fix nullable error (#1185) 2020-07-19 12:38:41 +02:00
Acruid
64bb519bce Adds PhysBody sleep visualization to the Collidable overlay. 2020-07-19 02:34:19 -07:00
Acruid
4ed044ddb4 Added an interface for PhysicsComponent.
Converted everything to use collision and physics component interfaces.
2020-07-19 00:32:06 -07:00
Pieter-Jan Briers
00674d5624 Clean Clyde state at start of frame to make it more robust. 2020-07-18 23:10:32 +02:00
Pieter-Jan Briers
42b6ee9740 Fix BeforeUI screenshots. 2020-07-18 16:10:40 +02:00
Pieter-Jan Briers
abdc5418e2 Clyde object resource management.
Objects now use IDisposable().
Finalizers.
2020-07-18 16:01:24 +02:00
Exp
eeabe9af02 Remember Window Size & Pos when switching to/from fullscreen (#1181) 2020-07-17 10:37:55 +02:00
Pieter-Jan Briers
d1d610cce6 Add a TODO 2020-07-16 16:00:31 +02:00
Pieter-Jan Briers
9bcb892215 Make Eye a public property on EyeComponent. 2020-07-16 16:00:31 +02:00
Pieter-Jan Briers
7ea6b9c470 Minor cleanup and optimizations inside Clyde. 2020-07-16 16:00:31 +02:00
Pieter-Jan Briers
855e548651 Refactor Clyde internals so multiple viewports is possible. 2020-07-16 16:00:31 +02:00
Víctor Aguilera Puerto
4b7a5b4e93 Added method to get a RSI state frame at a specific second. 2020-07-15 14:29:19 +02:00
Exp
cca0b81bc6 Added Approximation Parameter to GetCollidingEntities (#1183) 2020-07-15 12:36:37 +02:00
Víctor Aguilera Puerto
fbaf3297b9 Fix compile 2020-07-15 11:44:36 +02:00
Víctor Aguilera Puerto
21d18731ba Overlay FrameUpdate is now protected internal. 2020-07-14 23:44:16 +02:00
Víctor Aguilera Puerto
ce89b7c93d Overlay's FrameUpdate is now public. 2020-07-14 23:40:44 +02:00
Pieter-Jan Briers
9e7b50a12e Fix nullability. 2020-07-13 16:29:03 +02:00
Pieter-Jan Briers
b7e224a56f Moving a ton of rendering code around and it somehow still works somewhat. 2020-07-13 16:27:43 +02:00
Pieter-Jan Briers
16ba90a654 Fix nullability error. 2020-07-13 02:02:14 +02:00
Pieter-Jan Briers
df4e8e3175 Please actually fix the server crashes thanks. 2020-07-13 01:56:42 +02:00
Pieter-Jan Briers
a5f6363219 Fix logging crash hopefully. 2020-07-13 01:23:10 +02:00
Pieter-Jan Briers
bd699eeb57 Removed _queuedSpace from Clyde internals. 2020-07-12 19:14:29 +02:00
DrSmugleaf
40f9381b7f Make IMapGridComponent public instead of internal (#1179) 2020-07-11 17:50:14 -07:00
Pieter-Jan Briers
70dc286e4f How about you don't commit the temporary profiling changes? 2020-07-11 18:48:14 +02:00
Pieter-Jan Briers
285b6914e2 Fix NetManager.ServerSendToAll sending to connections that are in the middle of their handshake.
I took the liberty to refactor it a bit internally so we can keep up-to-date copies of the NetPeer connection and channels lists per-peer. This allows us to avoid expensive copying allocations (Lidgren does not expose NetPeer.Connections without allocating due to thread safety)
2020-07-11 18:29:20 +02:00
Hugal31
63720cd034 Feature/the macro (#1165)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2020-07-11 15:03:28 +02:00
Pieter-Jan Briers
f879ced75e Fix exception from client shutdown from logging inside Dispose() 2020-07-11 14:39:58 +02:00
Pieter-Jan Briers
93fcb0df9b Move back to per-component-type-dictionaries for component storage.
It's much faster than the single dictionary approach.
2020-07-11 13:15:44 +02:00
ShadowCommander
8e39de77f1 Fix GridPosition set breaking when value.GridID == GridId.Invalid (#1178) 2020-07-11 02:38:36 -07:00
ike709
6e3b32ed07 Adds logout command, tweaks login (#1174) 2020-07-10 21:04:33 +02:00
DrSmugleaf
8cd13787ea Fix collection modified during iteration (#1177) 2020-07-10 21:03:40 +02:00
Pieter-Jan Briers
a2617312d9 Use Serilog internally for logging, add Grafana Loki log handler. 2020-07-10 20:55:31 +02:00
Pieter-Jan Briers
25eb83d3c3 Mute spammy debug log in PVS. 2020-07-09 15:51:19 +02:00
Pieter-Jan Briers
bec9639554 Optimize PVS a little bit. 2020-07-09 02:56:07 +02:00
Pieter-Jan Briers
8f590a7ba9 DependencyCollection.RegisterInstance no longer caches injectors.
Small optimization.
2020-07-09 02:55:04 +02:00
metalgearsloth
d1ee8775f4 Fix pathfinding for entity deletions (#1173)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-07-08 14:00:48 +02:00
Pieter-Jan Briers
6088df4018 Make LineEdit cull rendering on the left of its bounding box aswell.
Fixes https://github.com/space-wizards/space-station-14/issues/1300, although realistically this is more an optimization that happens to fix the bug.
2020-07-08 03:14:38 +02:00
Pieter-Jan Briers
c2ce37517f Mouse wheel scrolling for Tree control.
Fixes https://github.com/space-wizards/space-station-14/issues/1309
2020-07-08 02:50:27 +02:00
Pieter-Jan Briers
0a88f32206 Fix KeyDowns not prioritizing mouse focus.
This caused https://github.com/space-wizards/space-station-14/issues/1302.

The ChatBox focuses the LineEdit in KeyDown. This then causes the next key down, UIClick, to go to the LineEdit (it's keyboard focused now). The key up however is fired on the chatbox because keyups did prioritize mouse focus. So the LineEdit gets stuck thinking you have the mouse held down.
2020-07-08 02:44:59 +02:00
Pieter-Jan Briers
fc73f88282 Hitting ~ while console is selected now closes it again.
How did this take me this long to fix.
2020-07-08 01:53:11 +02:00
AJCM-git
afa0eb8ada Changing some paths (#1158)
* first commit

* Merging master

* Path changes

* what even is this

* MidiCustom
2020-07-07 19:15:39 +02:00
Víctor Aguilera Puerto
578ae1cf9e Add percentage of intersection to Box2 (#1169) 2020-07-07 18:13:51 +02:00
Pieter-Jan Briers
4b3be2db3d ACTUALLY remove low res lights biasing hack. 2020-07-07 13:26:35 +02:00
Pieter-Jan Briers
8a35696716 Remove low res lights biasing hack. 2020-07-07 13:20:18 +02:00
Pieter-Jan Briers
e9de95be31 Fix replication of new components with interp enabled. 2020-07-07 12:25:12 +02:00
Víctor Aguilera Puerto
8619c2a7c9 Add Hard property to ICollidableComponent 2020-07-07 12:03:05 +02:00
Víctor Aguilera Puerto
bb46b49d30 Fix hard collidable property not being sent to the client 2020-07-07 11:58:24 +02:00
Pieter-Jan Briers
cc9391c029 Probably fix parallel PVS crashes. 2020-07-06 23:38:15 +02:00
Pieter-Jan Briers
ded0b6b710 PlayerCommandStates.SetState 2020-07-06 23:22:12 +02:00
Pieter-Jan Briers
9e5374ac86 Assert that messages have been registerd in integration tests. 2020-07-06 21:24:03 +02:00
SoulSloth
e15b5ad3d1 Added User Input Validation For Most Debug Commands (#1167) 2020-07-06 21:23:26 +02:00
chairbender
437bf58e7b Input Handling + other cleanups to support click drag functionality (#1132)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2020-07-06 21:21:13 +02:00
Pieter-Jan Briers
7e6a6b085b Fix MsgServerInfoReq not being registered client side. 2020-07-06 19:43:26 +02:00
Pieter-Jan Briers
46ff3715f8 Fix possible race condition with CreateNetMessage<T> and threads. 2020-07-06 19:15:06 +02:00
DrSmugleaf
265c249708 Fix physics anchored status not being synced to the client (#1168) 2020-07-06 15:44:09 +02:00
Acruid
8b5e5b7b91 Adds Events to IEntitySystemManager for when a system is loaded or unloaded into the manager. 2020-07-04 16:16:54 -07:00
Pieter-Jan Briers
af4c920606 Don't lerp transforms on teleports/parent changes. 2020-07-04 00:35:40 +02:00
Pieter-Jan Briers
8d89a6af05 Add some VV attributes to containers. 2020-07-04 00:35:40 +02:00
DrSmugleaf
71c3efc274 Fix client crashes when invalid arguments are used with the gridtc command (#1164) 2020-07-03 23:19:08 +02:00
Pieter-Jan Briers
87a57c18ca Fix exception on reconnect. 2020-07-03 16:58:07 +02:00
Pieter-Jan Briers
0720d4d39c Fix deleted entities staying in render trees.
Alright that one was pretty obvious in hindsight.
2020-07-03 01:08:30 +02:00
Pieter-Jan Briers
c8560c9445 Fix physics shapes not setting their parent collidable dirty. 2020-07-02 21:18:50 +02:00
Pieter-Jan Briers
41d1aa2a82 Fix some incorrect nullability attributes in input manager. 2020-07-02 20:47:07 +02:00
Jackson Lewis
2d7192d79d Add Hard property to collidables and fix airlock issues (#1078)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2020-07-02 13:35:58 +02:00
Acruid
99933499b7 Merged Client and Server PhysicsComponent (#1163) 2020-07-02 09:34:16 +02:00
Tyler Young
d9fb7d04ca Enable freezable sets in unique index implementations (#1161) 2020-07-01 16:37:25 +02:00
ShadowCommander
6c2157c10f Change ScrollContainer ScrollBars to not affect layout when not visible (#1162) 2020-07-01 16:36:53 +02:00
Pieter-Jan Briers
830f5843b5 Delete grid entity BEFORE removing the grid.
If the gridentity is deleted after then ALL those entities suddenly have an invalid Grid ID and this is a massive problem.
2020-07-01 02:26:54 +02:00
Pieter-Jan Briers
466ce76ca9 Fix nullspace issues with RenderingTreeSystem 2020-07-01 02:24:20 +02:00
Pieter-Jan Briers
9da67e6a66 Fix compiler warnings. 2020-06-30 19:27:25 +02:00
py01
650033a184 Event for changing server PhysicsComponent Anchored (#1160)
Co-authored-by: py01 <pyronetics01@gmail.com>
2020-06-30 18:44:03 +02:00
Pieter-Jan Briers
2296c95e7c PVS optimizations. 2020-06-30 18:34:17 +02:00
Pieter-Jan Briers
2af0d9df55 Optimizations to physics system.
Nothing major, just picking low hanging fruit and improving code quality around the place.
2020-06-30 15:13:51 +02:00
Pieter-Jan Briers
1087e4ce69 Remove some unnecessary interface calls. 2020-06-29 20:44:44 +02:00
Pieter-Jan Briers
59911bee28 Good job me. 2020-06-29 20:23:18 +02:00
Pieter-Jan Briers
daa5a34413 Guess we're doing render trees for lights and occluders aswell. 2020-06-29 20:23:08 +02:00
Pieter-Jan Briers
cf47525237 Fix UTF-8 output AGAIN. 2020-06-29 18:04:26 +02:00
Pieter-Jan Briers
16b4262486 Remove dead code. 2020-06-29 16:19:11 +02:00
Pieter-Jan Briers
b72b0e5984 Use a DynamicTree for sprite finding.
Significantly improves client CPU usage.
2020-06-29 16:18:11 +02:00
Pieter-Jan Briers
334d319cda Slight physics optimizations.
Removal of interface calls and some LINQ.
2020-06-29 16:13:54 +02:00
Pieter-Jan Briers
1cdaed3b54 Allow EntitySystems to handle struct events. 2020-06-29 16:10:54 +02:00
Pieter-Jan Briers
a40d89dd3e Optimize TransformSystem.
Now keeps a list of actively lerping transforms instead of iterating every transform every tick.

Yeah it doesn't even show up in profiles anymore instead of taking like 8% of CPU time.
2020-06-28 00:41:48 +02:00
Pieter-Jan Briers
6742290e91 Fix VVing enumerables. 2020-06-26 20:28:12 +02:00
Pieter-Jan Briers
75b63f2645 Enable interp by default. 2020-06-26 16:16:52 +02:00
Pieter-Jan Briers
b71899f830 Fix RobustTaskScheduler with non-long-running-tasks. 2020-06-26 02:37:12 +02:00
Pieter-Jan Briers
31c964b9d7 Fix IPv6 sockets on Linux.
By removing Q's NativeSockets layer and just using byte[] again.

There's no performance loss because byte[] was already the only thing used.
2020-06-26 02:37:12 +02:00
Tyler Young
9d03edee40 Logging Tweaks (#1156) 2020-06-25 22:00:45 +02:00
Pieter-Jan Briers
1a7cc344e2 Optimize TransformComponent component state handling:
1. Don't resolve Parent in GetComponentState
2. Don't try to AttachParent unless parent actually changed.
2020-06-25 18:17:25 +02:00
Tyler Young
08e9caf71d Remove Task Scheduler Naming of Long Running Threads (#1155) 2020-06-25 18:16:41 +02:00
Pieter-Jan Briers
96e94b3dbd Fixes for ConsoleLogHandler
Actually respects terminal encoding.

Doesn't do ANSI characters if unsupported (Windows) or redirected.

Uses 4-bit color codes instead of RGB codes.

More optimal outputting of ANSI escape codes. It's const all the way down.
2020-06-25 18:16:16 +02:00
Tyler Young
faacd45eb4 Protect IgnoresAccessChecksTo, Add Task Scheduler Context, Lock on Console Log Flushing (#1153) 2020-06-25 18:00:00 +02:00
Pieter-Jan Briers
f77fdbced6 Remove finalizer from Control.
We aren't used Godot anymore so no need for this.
2020-06-25 16:29:03 +02:00
Pieter-Jan Briers
99d900b68c I am good at copy paste. 2020-06-25 13:59:10 +02:00
Pieter-Jan Briers
564e219504 Silence string serializer. 2020-06-25 02:28:12 +02:00
Pieter-Jan Briers
ff68a70aef More lidgren stats exposed to prometheus. 2020-06-25 02:27:20 +02:00
Pieter-Jan Briers
f71f2821d1 Fix latency simulation. 2020-06-25 02:27:19 +02:00
Tyler Young
e693d3ded7 Buffered VT ANSI Logging, Server Off Console Thread, Log Unhandled Errors (#1152) 2020-06-25 01:43:09 +02:00
Tyler Young
d7e98be313 Various Fixes and Diagnostics (#1151) 2020-06-24 23:52:22 +02:00
Tyler Young
ba3bf605c9 Reduce Physics Max Solver Iterations, Simulation Respected (#1150)
reduce max solver iterations
2020-06-24 23:43:07 +02:00
Tyler Young
ec938e7d33 Better Missing MetaDataComponent Error (#1149) 2020-06-24 23:28:14 +02:00
Pieter-Jan Briers
41f1dd3fa0 Hopefully fix parallel game states 2020-06-24 22:55:59 +02:00
Pieter-Jan Briers
2bd6b20137 HOPEFULLY fix parallel PVS. 2020-06-24 21:40:44 +02:00
Pieter-Jan Briers
544c728a34 sudo command 2020-06-24 20:48:46 +02:00
Pieter-Jan Briers
31fb65bcb9 Movement prediction work. (#1144)
* Fix client-side input system not sending sequence numbers for input messages.

This caused message ordering issues and keys getting stuck down.

* Make sure EyeUpdateSystem runs after physics.

* IGameTiming.TickFraction helper.

* Subtick data for input commands.

* Literally a unit test to verify that I wasn't going insane while debugging input message ordering issues.

* More prediction logs behind net.predict.

* Move physics to shared and run it on the client.

* Synchronize grid gravity.

* Fix ResetPredictedEntities crash when entities get deleted server-side.

* Fix CollidableComponent setters not calling Dirty()

* Fix going into space while predicting.

* Watch window uses history line edit.

* Fix unpredicted objects stuck-jittering.

* VV tags for interp vars on transform.

* Fix 0 mass objects on client.

* Fix friction calculations being TPS dependent.

* Reset predict flag on handelComponentState
2020-06-24 20:47:20 +02:00
ShadowCommander
1a580d226c Implement MultipleTypeEntityQuery (#1146)
* Implement MultipleTypeEntityQuery

* Add EntityQuery to make the MultipleTypeEntityQuery faster
2020-06-24 10:38:26 -07:00
ShadowCommander
71e2344a73 Implement HostLogin command (#1147)
* Implement HostLogin command

* Fix Robust.Server/server_config.toml

Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>

Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>
2020-06-24 19:12:22 +02:00
Pieter-Jan Briers
14fea1812d Scripting watch window 2020-06-24 15:25:11 +02:00
Tyler Young
4650dc2c49 ComponentManager Rework (#1143)
* rework ComponentManager

create indexing solution, UniqueIndex

split out ComponentEventArgs, add sealed variants

fix up documentation

fix terrible crap

make benchmark work

* woops, ordered enumerables are already a copy

* naming

* clean up comments

* nullable enable

* add some doc comments to unique index

* perf tweaks

add UniqueIndexHkm for high key mutability

extract internal interface mostly for documentation

add nullability support and constraints

* fix doc comment for UniqueIndexHkm

* make PVS threaded

* remove redundant member declarations in interface

* fix grid loss crap on client shutdown

* fix nullability warning when retrieving from always constructed threadlocal

* add comment explaining chan == null check

remove inParallel parameter
2020-06-24 11:59:56 +02:00
Tyler Young
faff0797bf Make Lidgren Use Spans & Shared Pool (#1140)
* make lidgren use spans everywhere where it can

convert custom pooling to shared array pool impl

add unit tests for read/write

add native socket extensions to socket so we can legit pass spans for SendTo/ReceiveFrom

bump version in lidgren csproj

replace some random "% 8" w/ "& 7"

more minor nullability hacks to fix static analysis complaints

made receiving packets use span

minor native sockets refactor to use pinvoke

add read/write constrained/prealloc'd bit stream impl to lidgren and update usages

fixed missing stream cleanup

remove outstanding stream cleanup since it refs buffer thru the class, can't read some other buf

apply suggestions from code review

remove unsafe cruft

* add tests to gh actions

* make stats use interpolation in tostring and remove m_bytesAllocated since it's all in the shared pool now

* this pr still open so fuck it

stats, human readability, faster BitsToHold methods

* add api compatible version of ReadBytes

* rename ReadOnlyStreamWrapper -> ReadOnlyWrapperStream

rename WriteOnlyStreamWrapper -> WriteOnlyWrapperStream

add AppendViaStream, AppenderStream impl

add and update documentation on read/write bytes methods

also fix some goofs
2020-06-24 04:09:20 +02:00
chairbender
2558201ae4 implement dragging of split in split containers (#1141) 2020-06-22 18:50:34 +02:00
Tyler Young
c997d7e3b6 Dynamically Manage Collision Solver Iterations (#1139)
modulate solver iterations dynamically depending on tps
2020-06-22 12:33:08 +02:00
Clyybber
2b6ed4852d Cleanup occlusion (#1138) 2020-06-22 12:32:29 +02:00
Tyler Young
368f6482e8 Provide fallback for Creative EFX OpenAL Extension in Clyde.Audio (#1137)
provide fallback for mac if it doesn't exist
2020-06-19 21:25:19 +02:00
Vince
7dd0a668d5 Changed "Run" to "Walk" in code (#1136) 2020-06-19 15:14:18 +02:00
Pieter-Jan Briers
8e4ac24840 Re-enable prediction logging but put it behind a cvar. 2020-06-19 00:18:59 +02:00
Pieter-Jan Briers
77b7d4f683 Move transform interp to an entity system. 2020-06-19 00:18:59 +02:00
Pieter-Jan Briers
67efd69679 Add explicit update dependency specification between entity systems.
This allows a system to say "I want to update after this other system does".

Based on @chairbender's work with the input binding stuff.
2020-06-19 00:18:59 +02:00
Víctor Aguilera Puerto
185e03b8a3 EntityManager's GetEntity throws again, fixes doc 2020-06-18 15:29:54 +02:00
Víctor Aguilera Puerto
4a11a5086e EntityManager's GetEntity returns null if entity doesn't exist 2020-06-18 15:23:59 +02:00
Tyler Young
9cbdd1058c Use CannyFastMath & Update Some Packages (#1130)
update a bunch of packages and use JetBrains.Annotations as private asset as needed

mark some hot math methods agg inline to benefit from loop opts

use FMA for interp

use canny min/max/clamp

make Quaternion NormalizeAngle fixed time and faster

clean up YamlDotNet references
2020-06-18 02:25:36 +02:00
Pieter-Jan Briers
af249f80c8 Improved click detection supporting features: (#1133)
* Improved click detection supporting features:

Clickable removed from engine
Texture/RSI load hooks for content
New sprite layer API

* Fix tests.
2020-06-18 02:25:02 +02:00
Pieter-Jan Briers
6dba85e6dd Use Robust.Shared.AuthLib. 2020-06-18 02:19:14 +02:00
Acruid
bc2d4c1c92 Fixes a bug where the EntitySystem event proxy was using the wrong function overload for IEventBus.RaiseEvent(). 2020-06-17 17:05:48 -07:00
Pieter-Jan Briers
2a93cb0c41 Adds helpers to make constructing style rules much cleaner. 2020-06-17 15:32:22 +02:00
Pieter-Jan Briers
52833e23c3 Fix URI opening on Windows and remove linux/mac impls.
Because .NET can directly open URLs with Process.Start apparently.
2020-06-17 02:20:58 +02:00
Pieter-Jan Briers
66f112f9d9 Add system for reporting open source licenses for dependencies. 2020-06-14 02:27:11 +02:00
Pieter-Jan Briers
65c7e07d9b Adds ReadAllText convenience methods to IResourceManager. 2020-06-14 02:27:11 +02:00
Tyler Young
9662d52f90 Shared String Dictionary ctd. (#1126) 2020-06-13 04:09:48 +02:00
Pieter-Jan Briers
15ec0e7bd9 Adds missing Lidgren license. 2020-06-13 03:10:18 +02:00
Pieter-Jan Briers
36bda1cd2f Remove SharpZipLib and System.ValueTuple dependencies 2020-06-13 03:10:17 +02:00
Tyler Young
47f307dd2a Upgrades SixLabors.ImageSharp (#1128)
adds InlineIl.Fody for fast access to image backing buffers
2020-06-13 03:08:29 +02:00
Pieter-Jan Briers
b3d4f55f28 Fix ResourcePath.ChangeSeparator for rooted paths. 2020-06-12 22:51:25 +02:00
Pieter-Jan Briers
919174056a Fix to-client entity messages getting dispatched in the incorrect order. 2020-06-12 18:25:05 +02:00
Pieter-Jan Briers
aaa09881cb Enable NRTs for unit tests. 2020-06-12 17:11:32 +02:00
Pieter-Jan Briers
b1ab4a61f8 Make sure integration tests get shut down on test tear down. 2020-06-12 15:16:03 +02:00
Pieter-Jan Briers
9b7b8023f2 Treat nullability warnings as errors in CI. 2020-06-12 14:22:58 +02:00
Pieter-Jan Briers
c5e1fbcbab Verbose logging on test. 2020-06-12 14:07:08 +02:00
Pieter-Jan Briers
02e41a8ed6 Jesus christ I can't even copy paste right. 2020-06-12 14:01:05 +02:00
Pieter-Jan Briers
e8c0ab52f5 Actually run integration tests. 2020-06-12 14:00:25 +02:00
Pieter-Jan Briers
6674be3adc Client NRTs (#1121) 2020-06-12 12:57:39 +02:00
Víctor Aguilera Puerto
4d93b0c533 Sound track in animations can now take a function that returns an AudioParam (#1125) 2020-06-12 12:47:34 +02:00
Pieter-Jan Briers
28b3cd5a52 Fix predicted events not re-firing on first sender tick. 2020-06-12 12:42:05 +02:00
Pieter-Jan Briers
ca1597d952 Add some convenience helpers for integration testing. 2020-06-12 12:42:05 +02:00
Pieter-Jan Briers
afb0624a2b Fix DebugTimePanel to report prediction size correctly.
It was not taking into the account that CurTick increments after the mainloop runs tick meaning that it was offset by one.
2020-06-12 12:42:05 +02:00
Tyler Young
0d52def877 Have RobustSerializer use a shared string dictionary (#1117)
* implements shared string dictionary and handshake from net-code-2

* fix unit test

switch to szr sawmill

* try to silence some warnings around ZipEntry

* rebase and use system zip instead of icsharplib

fix rebase artifacts

* Update Robust.Shared/Interfaces/GameObjects/IComponentFactory.cs

* Update Robust.Shared/Serialization/RobustSerializer.MappedStringSerializer.cs

* Update Robust.Shared/Serialization/RobustSerializer.MappedStringSerializer.cs

* Apply suggestions from code review

* Apply suggestions from code review

* Update Robust.Shared/Serialization/RobustSerializer.cs

* since no longer gathering from paths, make string splitting more robust

* make string gathering ignore strings under 4 chars long

make string gathering yet more robust

* add limit to size of mapped strings

* add more string data to feed into shared string dictionary from YAML files

add JSON importer but don't parse RSI metadata yet

fix typo that breaks nulls in MappedStringSerializer

minor refactoring

make string splitting more robust

add WriteUnsignedInt / ReadUnsignedInt for validating WriteCompressedUnsignedInt / ReadCompressedUnsignedInt aren't bogus

* comment out some log statements

* minor refactor, reorder logging

add null check due to smart typing NRT checks

* Add doc comments, readability improvements to MappedStringSerializer

The protocol, handshake, and internal logic are now more documented.

The main area that could still be improved is the documentation of how
the cache system works, but the code is readable enough for now that it
isn't immediately necessary.

* add documentation, organization

* update some more doc comments

* add flows to doc comment for NetworkInitialize

* more documentation and organization

* more docs

* instead of retrieving INetManager by IoC, assign when NetworkInitialize is invoked

* "document" the regex

* Update Robust.Shared/Network/NetManager.cs

* add missing check for LockMappedStrings

* Update Robust.Shared/Serialization/RobustSerializer.MappedStringSerializer.cs

Co-authored-by: ComicIronic <comicironic@gmail.com>

* change to warning instead of throw for unlocked string mapping

Co-authored-by: ComicIronic <comicironic@gmail.com>
2020-06-12 04:09:55 +02:00
Tyler Young
70100ec9d1 add reset of shader to UserInterfaceManager _render method after drawing a control (#1124) 2020-06-11 22:50:33 +02:00
Pieter-Jan Briers
edbe2839b6 Use GetProcAddress for DebugMessageCallback in OpenGL. 2020-06-10 15:13:48 +02:00
Pieter-Jan Briers
8f63ee481e Make sure CurTick increases AFTER ticks in integration tests.
For consistency with the real main loop.
2020-06-10 04:59:50 +02:00
Pieter-Jan Briers
1cf613a076 Free 10% PVS perf improvement. 2020-06-10 04:38:54 +02:00
Pieter-Jan Briers
550e295189 EntitySystemManager API to load extra entity system types. 2020-06-10 01:54:09 +02:00
Acruid
fbeae98025 Made the 'group' concommand actually work. 2020-06-09 12:34:51 -07:00
Acruid
cafe99a0e2 Adds exception tolerance to ECS system Update and FrameUpdate. Previously an exception thrown in FrameUpdate would completely break rendering, and an exception thrown in update would block all other ECS systems after it being ran. 2020-06-09 12:34:50 -07:00
Pieter-Jan Briers
6a2f8f2767 Fix tree control jittering. 2020-06-09 21:28:02 +02:00
Pieter-Jan Briers
0d3cd41382 Enable NRTs on Robust.Server (#1118) 2020-06-09 14:18:29 +02:00
Pieter-Jan Briers
b2eff5d5eb Improve & fix entity creation tick clearing.
Tick clearing is now done in all entity constructors on the server, and components added during ExposeData like ContainerManager don't blow up on it anymore.
2020-06-09 14:11:31 +02:00
Pieter-Jan Briers
76b0779563 More convenient system for integration tests to override CVars. 2020-06-09 14:11:30 +02:00
Víctor Aguilera Puerto
251f0422b6 Add distance to AudioSystem (#1079)
* Add distance to AudioSystem

* Fix warning

* Rewrite distance thing.

* Better unchecked

* Whoops.

* Raise default distance to 25
2020-06-09 14:09:56 +02:00
ComicIronic
a284e9f244 Add ScreenToMap overload taking ScreenCoordinates (#1120)
This was a small hole in the API, no real new functionality.
2020-06-09 13:56:52 +02:00
Pieter-Jan Briers
3cbfef8b07 Yep it's definitely late *checks clock* oh god. 2020-06-09 03:49:09 +02:00
Pieter-Jan Briers
bdab4bc6c9 Why WOULD I run my own tests before pushing? 2020-06-09 03:47:04 +02:00
Pieter-Jan Briers
73618f6bb2 Fix map loading and add map loading unit test. 2020-06-09 03:43:33 +02:00
Pieter-Jan Briers
be1ceeb2db Add testing convenience helper to mount strings as files in the VFS. 2020-06-09 03:43:33 +02:00
Pieter-Jan Briers
c9d2b9687f Fix SingleStreamLoader.FindFiles. 2020-06-09 03:43:33 +02:00
Pieter-Jan Briers
1268e03770 Update test-content.yml 2020-06-09 03:02:10 +02:00
Pieter-Jan Briers
b502e92c3a Create test-content.yml 2020-06-09 02:59:47 +02:00
Tyler Young
5c8545c396 Revert "Virtualize all NetIDs to reduce network traffic" (#1119)
This reverts commit d776476542.
2020-06-09 00:34:37 +02:00
Pieter-Jan Briers
7f406aa16c Fix natives copy probably. 2020-06-09 00:32:08 +02:00
Pieter-Jan Briers
289938dbd1 Refactor PackLoader.
Use System.IO.Compression instead of SharpZipLib.
Unit tests.
Fixes.
2020-06-08 23:58:32 +02:00
Pieter-Jan Briers
3459e5fd0b Remove explicit x64 platform target to fix ARM64 builds. 2020-06-08 23:36:08 +02:00
Pieter-Jan Briers
b51d22216e Fix a compiler warning. 2020-06-08 14:43:57 +02:00
Pieter-Jan Briers
aec9c5e66d Clear IoC on RobustUnitTest TearDown to hopefully provide better test isolation. 2020-06-08 14:36:18 +02:00
Pieter-Jan Briers
9a637a0632 Fix ComponentManager_Tests on release mode. 2020-06-08 14:35:50 +02:00
Pieter-Jan Briers
b3f8e12739 Update .NET Core SDK version to latest on Actions. 2020-06-08 14:03:40 +02:00
Clyybber
71b06c0791 Placement improvements (#1105) 2020-06-08 13:51:22 +02:00
ComicIronic
9ab3f13f2d Make AddComponent load default DataField values (#1112)
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2020-06-08 13:51:08 +02:00
Tyler Young
d776476542 Virtualize all NetIDs to reduce network traffic (#1116) 2020-06-08 13:38:08 +02:00
metalgearsloth
865c04b264 Add collidable events back in (#1115)
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-06-08 13:29:16 +02:00
Pieter-Jan Briers
ec0f4b35f7 Enable nullable reference types on Robust.Shared and fix all warnings. (#1109) 2020-06-08 01:13:01 +02:00
Acruid
12ea903c98 Map Loading (#1110) 2020-06-08 00:56:55 +02:00
ComicIronic
d631048c1e Remove ScreenToWorld (#1114) 2020-06-08 00:41:59 +02:00
Pieter-Jan Briers
dd0cb9f216 Prometheus metrics server.
Thanks to Redline for starting work on this and helping me out on Discord.
2020-06-08 00:12:23 +02:00
ComicIronic
15432bf8a7 Fix client CurTime jumps (#1113)
This fixes the issue where CurTime on the client would sometimes jump by
massive values. It was caused by an underflow when the current tick
would be before the most recently cached tick, due to time going in
reverse.
2020-06-07 22:27:19 +02:00
Swept
a3814dd7c0 Changes PointLightComponent radius from an int to a float. (#1111) 2020-06-07 17:33:03 +02:00
Pieter-Jan Briers
761207fcb4 Update build-test.yml 2020-06-07 17:25:33 +02:00
Pieter-Jan Briers
096c47a1fe Create build-test.yml 2020-06-07 17:18:35 +02:00
ComicIronic
b2cb334f03 Add config var loading from environment variables (#1108) 2020-06-06 23:53:05 +02:00
ComicIronic
caa876dbb3 Fix TickRate causing CurTime jumps (#1106) 2020-06-06 23:50:02 +02:00
Pieter-Jan Briers
c3ee136622 Look at me commiting debug parameters into the code. 2020-06-06 21:59:36 +02:00
Clyybber
6060a2ff4f Improve occlusion performance and fix a crash (#1107) 2020-06-06 19:45:38 +02:00
ComicIronic
dec76c9ad9 Fix lasers changing DrawingHandleWorld transform (#1103) 2020-06-06 14:26:33 +02:00
Pieter-Jan Briers
89ef65b335 Add UI scaling helper APIs and fixes tooltip positions with UI scaling. 2020-06-06 14:13:49 +02:00
Pieter-Jan Briers
12c866b8d6 Fix LayoutContainer margins to be virtual pixels. 2020-06-06 14:13:21 +02:00
Pieter-Jan Briers
537b444eae DebugConsole doesn't spam position changes if hidden. 2020-06-06 14:13:00 +02:00
Pieter-Jan Briers
49b452eca4 Fix layout of buttons at higher UI scaling factors. 2020-06-06 13:02:49 +02:00
Pieter-Jan Briers
2a614e9c3d Squashed commit of the following (PR #1081 + fixes):
commit 46881727ce4107bf61e12cbbdbfa702381debb93
Author: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
Date:   Fri Jun 5 23:27:02 2020 +0200

    Fix playing stream storage.

commit 4beef7d66e48c7517ec14f21e0a3ce8db1de57c8
Merge: 6138c00e3 c32f21bea
Author: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
Date:   Fri Jun 5 22:45:11 2020 +0200

    Merge branch 'master' into audio

commit 6138c00e3c
Author: FL-OZ <anotherscuffed@gmail.com>
Date:   Fri Jun 5 14:23:52 2020 -0500

    refine audiosystem changes

commit 21f9c389e8
Author: FL-OZ <anotherscuffed@gmail.com>
Date:   Mon Jun 1 00:50:49 2020 -0500

    remove unused variable

commit ee0cf99edf
Author: FL-OZ <anotherscuffed@gmail.com>
Date:   Fri May 29 00:26:41 2020 -0500

    I THINK that fixed the crash. Not sure exactly what though.

commit 4a2e0b3b18
Author: FL-OZ <anotherscuffed@gmail.com>
Date:   Fri May 29 00:22:30 2020 -0500

    Remove bloat.

commit 1cddcac705
Author: FL-OZ <anotherscuffed@gmail.com>
Date:   Thu May 28 15:35:32 2020 -0500

    fix everything

commit c45dc8fb9d
Author: FL-OZ <anotherscuffed@gmail.com>
Date:   Thu May 28 01:36:45 2020 -0500

    Add server side sound event stopping.
2020-06-05 23:28:14 +02:00
Clyybber
c32f21bea3 Better sound occlusion (#1102)
* Better occlusion; introduce IntersectRayPenetration

* Use ToArray instead of casting

* Better doc

* Use Debug.Assert
2020-06-05 12:53:43 +02:00
Pieter-Jan Briers
dc82748daf Fix some prediction timing anomalies. 2020-06-05 00:14:53 +02:00
Víctor Aguilera Puerto
5c82a4ccb3 Join with MIDI player while stopping it. 2020-06-04 21:03:35 +02:00
Víctor Aguilera Puerto
5473fd183b Ignore invalid MIDI event of type 5 to prevent console spam. 2020-06-04 19:30:46 +02:00
Pieter-Jan Briers
ace88ab20b Revert "Make MsgEntity Reliable like the rest."
This reverts commit d81834c913.

I realized while writing the netcode document that `EntityEvent` is a different message group and am now quite ashamed of myself. This should stay as unreliable, probably.
2020-06-04 19:19:03 +02:00
Clyybber
39c508feaa Fix c#1046 (#1101) 2020-06-03 22:40:04 +02:00
Clyybber
9d6a9d5aa9 Fix #889 (#1100) 2020-06-03 11:52:07 +02:00
Clyybber
3f7296eef4 Fix #1023 (#1099) 2020-06-03 11:49:52 +02:00
ShadowCommander
35c23bd905 Fix UI Control focusing (#1097) 2020-06-02 14:40:16 +02:00
Clyybber
fcdabe98f4 Tiny cleanup (#1098) 2020-06-02 14:40:08 +02:00
Tyler Young
885bcb4f57 Fix up midi stuff, support mild black midis (#1092) 2020-06-02 01:08:56 +02:00
ShadowCommander
1b52093c5d Change buttons to use MouseFilterMode.Stop (#1095) 2020-06-01 15:35:06 +02:00
Pieter-Jan Briers
31c5c9373f GUI tab navigation hotkeys.
Not currently used but I needed these for a quick content hack.
2020-05-31 20:57:47 +02:00
chairbender
d148bde02b Command Binding System supporting multiple bindings (#1089) 2020-05-31 20:44:16 +02:00
Pieter-Jan Briers
29083fdb6f Pass WithFormat<T> through IsValueDefault to fix map saving. 2020-05-31 10:53:30 +02:00
Pieter-Jan Briers
34b39b7db5 Fix performance of YamlConstantSerializer.
It was relying on exceptions for normal control flow, absolutely destroying performance when a debugger is attached.

@ComicIronic please review.
2020-05-31 03:26:31 +02:00
Pieter-Jan Briers
f9df2b141c Disable load context on server ContentStart. 2020-05-31 01:19:00 +02:00
ComicIronic
486fd670e2 Change DrawDepth to int, add content constant hook (#1090)
This allows DrawDepth to be defined in the content layer.
2020-05-31 00:40:48 +02:00
Pieter-Jan Briers
75707c1db0 Use AttachedProperty for TabContainer, TabVisibleProperty. 2020-05-31 00:35:19 +02:00
Pieter-Jan Briers
cb3fe9c138 Adds AttachedProperty<T>.
Generics are useful.
2020-05-31 00:34:56 +02:00
ComicIronic
c9157c8b57 Adds custom YAML serializer for ints in terms of named constants (#1088)
Works similar to the flag serializer, except it allows for magic numbers
to be given names in the YAML.
2020-05-30 12:07:19 +02:00
Víctor Aguilera Puerto
94c868a395 Add missing properties to IMidiRenderer. 2020-05-29 17:19:14 +02:00
Víctor Aguilera Puerto
070ad6989c MIDI improvements
* Handle a few more MIDI events.
* Remove useless MIDI error logging.
* MidiEvent ToString() has useful info.
* Autoload soundfonts from Content.
2020-05-29 17:14:55 +02:00
Pieter-Jan Briers
22615dbf01 Add more useful script globals. 2020-05-28 23:43:34 +02:00
Pieter-Jan Briers
daa817a14a Change log file format to be less awful. 2020-05-28 20:18:49 +02:00
Pieter-Jan Briers
9262cdc555 Stop spamming about late msgentity ok? 2020-05-28 19:56:22 +02:00
Leo
44fcb0232c Adds theyre text macro (#1080) 2020-05-28 17:47:55 +02:00
Pieter-Jan Briers
9eeb1d1afa Fix compiler warnings 2020-05-28 17:44:31 +02:00
Pieter-Jan Briers
6a1249a922 Fix ordering of early entity messages. 2020-05-28 14:32:46 +02:00
20kdc
171a19487b Allow drawing unfilled circles, remove extra (0, 0) point (#1084) 2020-05-28 14:13:45 +02:00
Pieter-Jan Briers
d81834c913 Make MsgEntity Reliable like the rest.
MsgState has been exempt, obviously.
2020-05-28 13:26:47 +02:00
Pieter-Jan Briers
044eeb61f4 Fix OnClose not firing on windows correctly. 2020-05-28 13:18:39 +02:00
Pieter-Jan Briers
263a72ed07 Fix NullRef in PhysicsComponent.RemoveController() 2020-05-28 13:18:25 +02:00
Pieter-Jan Briers
488ce445a0 Shut down physics controllers when PhysicsComponent shuts down. 2020-05-28 00:49:42 +02:00
Pieter-Jan Briers
5b9789870b Fix inheritance overriding behavior on PlacementMode. 2020-05-28 00:27:22 +02:00
Clyybber
9d75c3a1c8 Implement audio occlusion and upgrade to OpenTK 4 (#1068) 2020-05-27 17:50:01 +02:00
Pieter-Jan Briers
782ac26a94 Mark some control properties as animatable. 2020-05-27 14:09:58 +02:00
Pieter-Jan Briers
32c1b1e3b2 Split off SS14 into BaseWindow. 2020-05-27 14:08:52 +02:00
Pieter-Jan Briers
4be2f8c780 Render greek glyphs. 2020-05-26 16:20:47 +02:00
Pieter-Jan Briers
fd204e5a99 Fix rounding error in font atlas code.
This could cause the atlas to be too small at certain configurations.
2020-05-26 16:20:47 +02:00
Pieter-Jan Briers
b8a71db3c8 Adds AnimationCompleted event to Control. 2020-05-26 16:20:47 +02:00
Pieter-Jan Briers
e334d6610e Fix race condition in the Bound UI system.
If you sent multiple state updates on the same frame these could easily arrive in different orders on the client, which is definitely not intended. This fixes that by sending them per frame.

As a result, this also means earlier updates on the same frame are discarded, saving bandwidth.
2020-05-26 16:20:47 +02:00
Pieter-Jan Briers
1e196dfd67 Implement DrawCircle in DrawingHandleScreen 2020-05-26 16:20:47 +02:00
Víctor Aguilera Puerto
8d2dcb23f7 Add InRange to MapCoordinates. 2020-05-26 14:20:22 +02:00
Hugal31
b4eac8526a Implement text macros (#1058) 2020-05-25 20:47:51 +02:00
Jackson Lewis
80536daadf Fix problem with colliding objects getting 'squashed' (#1077) 2020-05-25 20:11:03 +02:00
Jackson Lewis
f03860a16a Fix ICollideBehavior.OnCollide being called multiple times (#1074)
* Fix ICollideBehavior dispatching

* Move collision behavior code to execute after impulse resolution.
2020-05-25 15:41:54 +02:00
zumorica
deebe5b274 Fix crash when MIDI renderer gets deleted 2020-05-25 01:44:39 +02:00
ComicIronic
c26d409aee Add flag serialization markers to collision layer, mask in PhysShapes (#1072) 2020-05-25 01:29:27 +02:00
Jackson Lewis
f675aa95d5 Optimize collision code in physics engine (#1071) 2020-05-25 01:20:08 +02:00
ComicIronic
5ebd8a4221 Add system for using flag names in YAML (#1047) 2020-05-24 22:43:30 +02:00
Pieter-Jan Briers
46b4256d12 Adds MetadataComponent to entityprototype by default to fix map serialization issues.
Otherwise map deserialization fails if a metadata component gets serialized.
2020-05-24 22:11:57 +02:00
Pieter-Jan Briers
79fc210395 Typing into LineEdit when you have a selection replaces the selection. 2020-05-24 17:24:23 +02:00
Pieter-Jan Briers
db5077f96d Adds exception handler to NetMessage callbacks. 2020-05-24 14:48:29 +02:00
Pieter-Jan Briers
fce6662824 Exceptions inside entity deletion do not leave corrupted data. 2020-05-24 14:41:39 +02:00
zumorica
a788cfd998 Fix MIDI crash 2020-05-23 22:03:57 +02:00
Víctor Aguilera Puerto
2dddc03324 Set ResourcePath and SpriteSpecifier inheritors as NetSerializable (#1067) 2020-05-23 12:50:32 +02:00
Pieter-Jan Briers
24eab7ef3a Fix YAML ColorSerializer, optimize Color.ToHex() 2020-05-23 02:38:36 +02:00
Pieter-Jan Briers
fb82568d59 Fix exception in physics system. 2020-05-23 02:38:13 +02:00
Jackson Lewis
274334c926 Rewrite the physics engine (#1037) 2020-05-23 01:21:02 +02:00
Pieter-Jan Briers
2b3bdf0f28 Adds RandomExtensions.Pick for IReadOnlyCollection. 2020-05-23 00:42:37 +02:00
Pieter-Jan Briers
2c5536e982 Adds more script globals.
Also makes them all abstract for code reuse working around a Roslyn bug.
2020-05-22 22:13:11 +02:00
Pieter-Jan Briers
564c39b85a Add more default script imports.
Robust.Shared.Map and Robust.Shared.Prototypes
2020-05-22 22:11:27 +02:00
Pieter-Jan Briers
de82adb6ff Fix exceptions not getting caught on first script submission. 2020-05-22 22:08:51 +02:00
Pieter-Jan Briers
5d3f573f3c Mark AppearanceComponent as dirty on init. 2020-05-22 17:56:49 +02:00
Víctor Aguilera Puerto
149fe47424 Better MIDI (#1062) 2020-05-22 13:07:02 +02:00
Pieter-Jan Briers
cc4069d526 Fix clear button in tile spawn window not resetting search results. 2020-05-21 23:39:14 +02:00
Pieter-Jan Briers
7f508f7719 Show largest clyde batch size in F3. 2020-05-21 13:44:41 +02:00
Clyybber
feb5050b32 Make midi louder (#1063) 2020-05-20 20:24:48 +02:00
chairbender
4e192f9084 Add helper method for statically getting entity systems (#1061) 2020-05-20 16:42:02 +02:00
Pieter-Jan Briers
eb6463fad0 Fix failing test 2020-05-20 16:16:25 +02:00
Pieter-Jan Briers
ffc5c4903c Improve modal closing.
Clicking to close modal now does not handle. Hitting EngineKeyFunctions.CloseModals closes all active modals.
2020-05-20 11:59:19 +02:00
Pieter-Jan Briers
a9d272da62 More KeyBinding improvements:
1. Fixed handling of repeats so that they don't fire stuff incorrectly anymore.
2. Add Priority system to keybinds because apparently C# Sort isn't stable like I thought.
2020-05-20 11:59:19 +02:00
Pieter-Jan Briers
b66658bda5 Re-introduce keybind blocking, move CanFocus around to avoid the initial issue.
CanFocus is now evaluated separately by the input and UI manager so that it is possible to handle handling/UI blocking issues cleaner. This thus makes it possible to re-introduce keybind blocking which is quite useful.
2020-05-20 11:59:19 +02:00
Víctor Aguilera Puerto
424a9c9dfb ServerUserInterfaceComponent can now SetState on a specific player (#1060) 2020-05-18 20:53:03 +02:00
Víctor Aguilera Puerto
4ea42107b5 Increase buffers for MIDI and log MIDI buffer overflows. (#1059) 2020-05-18 15:11:15 +02:00
Swept
b89f8e396d Replaces noSprite.png with Gmod Error Sprite (#1055) 2020-05-18 12:31:24 +02:00
Pieter-Jan Briers
1551ff1ae4 Adds ability to draw arbitrary primitives in Clyde. 2020-05-18 02:29:32 +02:00
Pieter-Jan Briers
4bb3a1e958 Give UITest window a minsize. 2020-05-18 01:47:57 +02:00
Pieter-Jan Briers
2424adbe6e Clean up unused cruft files. 2020-05-17 02:12:00 +02:00
Víctor Aguilera Puerto
e394ade45c Reduce MIDI sample rate (#1057)
* Reduce MIDI sample rate

* Raise buffer count to 11
2020-05-17 01:03:25 +02:00
Pieter-Jan Briers
a72dd8c85b Commits several crimes against humanity in a bad attempt to debug watchdog API issues. 2020-05-14 00:39:08 +02:00
Pieter-Jan Briers
d6b25945e4 Adds AltOrigin functionality property to PopupContainer. 2020-05-13 17:55:33 +02:00
Pieter-Jan Briers
b7f3627ef1 Remove List<>/Dictionary<,> usage from low-level GameState serialization.
NetSerializer does not handle these well and sends the entire backing array instead of a more compact representation. This can then cause it to start sending lists of length 1 with a *capacity* of 4096 resulting in 250 KiB/s down to send updates for a single entity. As it just did on the public server...
2020-05-12 18:34:16 +02:00
Pieter-Jan Briers
6d5c343db3 Modern OpenAL version for Windows. 2020-05-11 11:39:35 +02:00
Pieter-Jan Briers
65abe671aa Allow non-canFocus input commands to actually handle input. 2020-05-08 12:14:20 +02:00
Víctor Aguilera Puerto
40c22563e3 Improves MIDI further (#1048) 2020-05-06 19:21:59 +02:00
Pieter-Jan Briers
f54f4ffe52 Quite possibly break the whole input system.
Made it so keybinds don't block other keybinds from firing.

Why is this necessary? This allows us to have "same keybind, different functionality" binds sanely, like shift click being both TextCursorSelect and (in content) ExamineEntity. Before this change the latter was temporarily broken in UI controls because of TextCursorSelect taking priority and instantly treating the event as handled because it's CanFocus.

The offshoot of this is that all the "args.CanFocus == mouse left" UI code had to be fixed, since multiple things were now firing for that and breaking everything. For example TextCursorSelect actually BROKE because now ExamineEntity was firing inside UI again and that was seen as a left click.

EngineKeyFunctions.UIClick has been introduced as "mouse left for the UI" for this purpose.
2020-05-05 23:58:21 +02:00
Pieter-Jan Briers
57f62dd98a SSE2 accelerate MIDI stereo -> mono for fun and profit. 2020-05-05 15:20:36 +02:00
Víctor Aguilera Puerto
5d4e3ebf9d Midi optimizations. (#1045) 2020-05-05 14:50:04 +02:00
Pieter-Jan Briers
f8e7ded2f0 Handle empty clipboard when pasting text. 2020-05-04 23:38:01 +02:00
Pieter-Jan Briers
51b87513ed Improve LineEdit
Fixes #748, Closes #1010

Can select text now, can move by words, and all the other stuff you'd expect from a control like this.
2020-05-04 17:13:29 +02:00
Pieter-Jan Briers
1f6bd2481f Allow escaping command parsing. 2020-05-03 15:59:15 +02:00
Pieter-Jan Briers
33989aa6e5 Pull texture lookup out of DrawTexture
Small optimization.
2020-05-03 14:38:43 +02:00
Pieter-Jan Briers
3f73aebb52 Fix MapId assignment bug. 2020-05-03 00:03:12 +02:00
Pieter-Jan Briers
3a054641c5 Catch Fluidsynth logging 2020-05-02 22:39:52 +02:00
Pieter-Jan Briers
4020f55f5f Unhardcode culture and provide hook for content to set it. 2020-05-02 19:59:48 +02:00
Pieter-Jan Briers
b63c7eb6ab Fix MIDI audio crackles. 2020-05-02 18:01:55 +02:00
Pieter-Jan Briers
ed6818dafa Report missing map entities only once per type. 2020-05-02 16:05:13 +02:00
metalgearsloth
e78ac25680 AI engine changes (#1042) 2020-05-02 11:19:22 +02:00
ComicIronic
4b50b151fe Minor improvements to printing in VV (#1041) 2020-05-02 00:15:59 +02:00
Pieter-Jan Briers
e5800bdf6b AAAAAAAAH 2020-05-01 20:56:19 +02:00
Pieter-Jan Briers
e21bae3140 Put a note about package_release_build.py in download_natives.py 2020-05-01 20:47:13 +02:00
Pieter-Jan Briers
ee3a1a6cf5 Try to figure out why fluidsynth isn't getting copied 2020-05-01 20:38:42 +02:00
Pieter-Jan Briers
6debbef454 I blame my IDE for this. 2020-05-01 20:06:19 +02:00
Pieter-Jan Briers
ff03de4408 Ship fluidsynth 2020-05-01 19:33:09 +02:00
ComicIronic
8398169183 Change Reference -> Ref in VV (#1040) 2020-05-01 19:04:59 +02:00
Pieter-Jan Briers
aa6af785e5 ScreenshotAsync helper function. 2020-04-30 12:41:53 +02:00
Pieter-Jan Briers
7be309f774 Screenshot API. 2020-04-30 11:56:57 +02:00
Pieter-Jan Briers
a46704507a Remove accidental public modifier. 2020-04-30 01:55:55 +02:00
Pieter-Jan Briers
1776cc5bda Optimize EntityUid.Parse to not allocate for client-side UIDs. 2020-04-30 00:50:19 +02:00
Pieter-Jan Briers
e33bae107b Add .idea/ to .gitignore. 2020-04-30 00:37:20 +02:00
Pieter-Jan Briers
55f51f54a5 Add Robust.Shared.Scripting to solution. 2020-04-30 00:36:46 +02:00
Jackson Lewis
2042312df7 Error is now thrown if entity prototype defines a component twice (#1038) 2020-04-30 00:33:53 +02:00
Pieter-Jan Briers
703c404f11 Fix moving things between maps not updating physics trees correctly. 2020-04-30 00:32:30 +02:00
Pieter-Jan Briers
400dcb06fc Server scripting. 2020-04-30 00:06:59 +02:00
Pieter-Jan Briers
48699837b0 Clear cached PVS relatives set. 2020-04-26 14:47:58 +02:00
Pieter-Jan Briers
b366070cd4 Adds entity prototype editor suffix system. 2020-04-26 01:16:49 +02:00
Pieter-Jan Briers
7c4b1af967 Optimize UserInterfaceSystem and clean up bound user interface API slightly. 2020-04-26 00:51:46 +02:00
Pieter-Jan Briers
9b95065561 PVS/DynamicTree optimizations. 2020-04-26 00:30:15 +02:00
Pieter-Jan Briers
e492e3b521 Parse build.json next to the executable for default build information. 2020-04-25 22:28:32 +02:00
Pieter-Jan Briers
6794bf4c3c Fix phys shapes showing up in map file. 2020-04-25 17:32:41 +02:00
Víctor Aguilera Puerto
bd20511ace Add predicate to Raycast (#1035) 2020-04-24 23:45:19 +02:00
Pieter-Jan Briers
cf87dfde62 Don't include NJsonSchema on release builds.
Saves like 200~ KiB disk space from not having to ship the unused library.
2020-04-24 22:15:57 +02:00
Pieter-Jan Briers
615dcd041b MapLoader reports missing prototypes. 2020-04-24 02:12:12 +02:00
Pieter-Jan Briers
3926de43de Fix GC issues with sound font loader callbacks.
Also slight optimizations.
2020-04-24 02:11:59 +02:00
Jackson Lewis
949b8cd2d9 Fix bug with InteractionOutline on larger sprites (#1034) 2020-04-23 23:52:20 +02:00
Jackson Lewis
db8d9bd228 Gravity (#1031) 2020-04-23 16:49:19 +02:00
Pieter-Jan Briers
797d1acaeb Tweak color gain factor to reduce disparity between walls and non-walls.
Also increases the brightness of *specifically* walls to make up for it, in content.
2020-04-20 18:16:21 +02:00
Pieter-Jan Briers
a380cd9e40 Fix some incorrect naming in TransformComponent 2020-04-20 17:54:33 +02:00
Pieter-Jan Briers
1f64080859 Shamelessly up light cap to 128 as a shoddy bandaid for saltern. 2020-04-20 16:19:58 +02:00
Pieter-Jan Briers
ec5e4e6c8a Cache MapID on TransformComponent. 2020-04-20 16:10:48 +02:00
Pieter-Jan Briers
e2ec1216d9 NoInlining SwapBuffers 2020-04-20 16:10:48 +02:00
Jackson Lewis
10f98e2fca ServerEntityNetworkManager doesn't dispatch messages if the client got disconnected (#1030) 2020-04-20 15:46:11 +02:00
Jackson Lewis
828ada9e22 Split HandleMessage into local and networked variants, add ICommonSession parameter to the latter (#1028) 2020-04-20 09:37:10 +02:00
Pieter-Jan Briers
c770c2dd11 Remove debug logging from ServerEntityManager. 2020-04-19 23:32:40 +02:00
Pieter-Jan Briers
ae756d9ebe Small rendering optimization.
Removes WorldPosition fetch from sprite sort.
2020-04-19 18:27:32 +02:00
Pieter-Jan Briers
76005b0706 Fix assembly loading issues on release builds. 2020-04-19 11:13:03 +02:00
Pieter-Jan Briers
9d293d4dd1 Remove debug logs from prediction. 2020-04-19 01:00:49 +02:00
Pieter-Jan Briers
2f02cb271a Fix tests. 2020-04-19 01:00:39 +02:00
Pieter-Jan Briers
0c8f869cb4 Prediction (#1027) 2020-04-18 17:35:54 +02:00
Pieter-Jan Briers
2da1640ab7 Makes BoxContainer default separation 0. 2020-04-18 12:16:40 +02:00
Pieter-Jan Briers
12fb54904a Fix crash when entity playing sound gets deleted. 2020-04-18 00:33:45 +02:00
Pieter-Jan Briers
fc1bbbf72b Shut down components on deletion in a separate stage.
This means that during shutdown, things like transform are still available. Useful!
2020-04-18 00:13:42 +02:00
Pieter-Jan Briers
5b5be9615a List matching entity UID in lsgrid/lsmap. 2020-04-18 00:13:35 +02:00
Pieter-Jan Briers
964afc523f Fix map entities not being added to their parent's children list. 2020-04-17 23:46:43 +02:00
Pieter-Jan Briers
216433199c Give EntitySystemManager a VV property to get a list of entity systems in VV. 2020-04-17 21:43:33 +02:00
Pieter-Jan Briers
1ab703325f Show type abbreviations for default ToString() implementations. 2020-04-17 21:42:54 +02:00
Pieter-Jan Briers
15386cf506 Fix VV page box having too little width to show anything. 2020-04-17 21:42:28 +02:00
Pieter-Jan Briers
2cc52ea767 Fix sounds playing across dimensions. 2020-04-17 19:01:53 +02:00
Pieter-Jan Briers
48ca01ab4a Fix DeleteGrid messing up the default grids. 2020-04-17 18:45:20 +02:00
Pieter-Jan Briers
832a4e01f1 High level cursor API. 2020-04-17 16:57:51 +02:00
Pieter-Jan Briers
44ce291fed Low level hardware cursor API. 2020-04-17 15:54:09 +02:00
Pieter-Jan Briers
ba933f7db0 Improvements to allow better connection dialog in content. 2020-04-17 14:41:22 +02:00
Pieter-Jan Briers
e353972959 Pass shutdown reason through to net manager so clients get notified correctly. 2020-04-17 12:05:53 +02:00
Pieter-Jan Briers
c3859bd52a New watchdog API system. 2020-04-16 21:20:23 +02:00
Pieter-Jan Briers
f8e0c1fe1d Fix parsing of --cvar command line arguments containing a =. 2020-04-16 21:02:09 +02:00
Pieter-Jan Briers
cd97c6cf43 Entity systems are now still available during shutdown.
Fixes a bug in EyeUpdateSystem shutdown.
2020-04-13 22:25:26 +02:00
Víctor Aguilera Puerto
3d6a3a6216 Add visibility masks to IPlayerSession, add Visibility componen… (#1026) 2020-04-10 16:38:59 +02:00
metalgearsloth
1cdb279319 Add collision change event (#1024)
Used for the pathfinder to keep track of the graph.

Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
2020-04-09 16:52:16 +02:00
Pieter-Jan Briers
8b90bdf875 Tuple and deconstruct helpers for Vector4 & Color. 2020-04-09 16:46:33 +02:00
Pieter-Jan Briers
6200ba01e6 CMYK helpers on Color. 2020-04-09 16:46:14 +02:00
Pieter-Jan Briers
ab873be4ef Fix awful documentation error. 2020-04-09 02:44:18 +02:00
Injazz
c4ee80a3e8 adds setter to IEntity's Description property (#1020)
Co-authored-by: Injazz <injazza@gmail.com>
2020-04-08 21:24:46 +02:00
PrPleGoo
6d8a0f6558 ISelfSerialize interface (#1021)
* Special check for decimal in serialization code. Changed method in IoCManager for a little QoL

* ISelfSerialize stuff

ISelfSerialize interface for stuff that want to implement their own (de)serialization.
Forgot that desialize could exist for decimals earlier.
Added ViewVariablesPropertyEditorISelfSerialzable thing for viewvariables.

* fix TestStylesheetOverride

* Fix improper UT logic

* Somewhat neater VV lineEdit event hanlding

* remove whitespace and unused using

* uninherit ViewVariablesPropertyEditorISelfSerialzable

* Fix improper use or ToString

* seal VV classes
2020-04-08 21:24:32 +02:00
Pieter-Jan Briers
ec52102d02 Allow controls to override stylesheets for itself and descendants. 2020-04-04 15:07:53 +02:00
Pieter-Jan Briers
9cca7ce8ef Expose client connection state. 2020-04-04 15:07:31 +02:00
Pieter-Jan Briers
7e536954be API for accessing initial launch parameters like --launcher. 2020-04-04 15:06:47 +02:00
Pieter-Jan Briers
e0d8b111bc Remove MainMenu and launcher connecting from engine. 2020-04-04 15:05:10 +02:00
Pieter-Jan Briers
7d6bc63439 Make MidiManager capable of handling absence of Fluidsynth.
So we can enable instruments without crashing platforms without the dll files.
2020-03-30 18:31:12 +02:00
Pieter-Jan Briers
009b41d7f0 Adds ability to specify file dialog filters to IFileDialogManager. 2020-03-30 18:31:12 +02:00
Pieter-Jan Briers
8f96c65312 Fix BoundUserInterface not raising close event if player disconnects. 2020-03-30 18:31:09 +02:00
Víctor Aguilera Puerto
93bb495f4a PlayerManager method to get PlayerSessions that meet a condition (#1019)
* Don't set attached entity name to username.

* You can now get players by a given predicate (think of LINQ's .Where())
2020-03-30 18:29:15 +02:00
PrPleGoo
bb0e6917b8 Decimal reagents requirements (#1018) 2020-03-28 13:48:57 +01:00
Pieter-Jan Briers
09a06c14c5 loginlocal promotes to Host. 2020-03-25 22:30:37 +01:00
Pieter-Jan Briers
1461dc19ae saveconfig command on client. 2020-03-25 22:29:24 +01:00
Pieter-Jan Briers
88d7bc2b6e Don't throw exception on invalid cvar command format. 2020-03-25 22:21:12 +01:00
Pieter-Jan Briers
fd8e68091e Fix implementation, add tests. 2020-03-25 21:34:30 +01:00
Pieter-Jan Briers
e72635155e Merge branch 'master' into expression-based-binding 2020-03-25 18:11:08 +01:00
Pieter-Jan Briers
7dfae37451 no more Prob(80).
Adds assert against that so you don't screw up from BYOND habits.
2020-03-25 18:01:49 +01:00
Pieter-Jan Briers
a21bad1f1b Fix server failing to start.
Damn I'm dumb.
2020-03-25 08:35:45 +01:00
Acruid
a947a38f3c View Rotation (#1016)
* Adds a derived class from Nunit's Is test constraint class.
The game camera can now be rotated.

* Added the new `bind` command to the console, used to bind a key to a keybind.
Added two new keybinds for rotating the View camera left and right.
Added more info to the ""Component does not exist for state" exception.
Added Reduced() and FlipPositive() public functions to Angle.

* Fix a copy/paste bug.

* Adds missing code to bind/unbind CameraRotateLeft.
Camera snapping now actually uses the CameraSnapTolerance constant.
2020-03-25 02:22:18 +01:00
Pieter-Jan Briers
c4b9c1cc4e C# interactive REPL for the client.
It's fancy.
2020-03-25 02:16:00 +01:00
Pieter-Jan Briers
2608229210 [ViewVariables] for ReflectionManager 2020-03-25 02:14:28 +01:00
Pieter-Jan Briers
50abd155c2 Opened() hook for SS14Window 2020-03-25 02:14:01 +01:00
Pieter-Jan Briers
50ad9bacf0 Replace OutputPanel.RemoveLine(int) with RemoveEntry(Index) 2020-03-25 02:13:50 +01:00
Pieter-Jan Briers
d057fdf74f Disable assembly load context on content-start client. 2020-03-25 02:13:23 +01:00
Pieter-Jan Briers
ff1bfde979 Optimize CommandParsing a bit and add tests. 2020-03-25 02:12:23 +01:00
PrPleGoo
2aea10168e Fix issue651 and370 (#1017)
* Switch Mobs and Items DrawDepth

* Add Y compare to SpriteDrawingOrderComparer
2020-03-15 08:05:16 +01:00
ShadowCommander
2f819cf781 Refactor Controls to default to MouseFilterMode.Ignore (#1011)
* Refactor Controls to default to MouseFilterMode.Ignore

* Clean up MouseFilterMode.Ignore from Controls

* Fix BoxContainer eating UI clicks

* Fix ScrollContainer using the wrong variable

* Refactor ContainerButtons to use a StyleClass for formatting instead of typeof

* Refactor BaseButton to work when child has MouseFilter.Pass
2020-03-15 07:29:51 +01:00
PrPleGoo
8cee7ba685 Reworked how friction impacts velocity. (#1015)
* Rework friction to work as a sum instead of indiviually

* Removed comments

* Changed how friction works from reducing movement to increased the effect of mass.
2020-03-15 07:28:32 +01:00
PrPleGoo
5c461a8500 Added unit tests for some collision code and a small rename (#1014)
* Changed how collision checks work

* Undid asym collision

* Push to switch machines

* Added UnitTest to clarify the logic in CollidesOnMask

* moved test into testcase
2020-03-15 07:27:25 +01:00
Acruid
0a32938c23 DebugCoordsPanel now just prints the Map and Grid coordinates. This looks more uniform, gives more info, and saves a line in the pannel. 2020-03-05 14:42:11 -08:00
Tyler Young
3856a16463 flip writing check 2020-02-28 19:12:57 -05:00
Víctor Aguilera Puerto
0a306514a2 IntersectRay can now ignore bodies that aren't hard collidables. (#1008) 2020-02-28 06:35:06 +01:00
ShadowCommander
726341981e Fix StyleBox (#1009) 2020-02-28 06:34:26 +01:00
Pieter-Jan Briers
850d277354 Fix EventBus tests 2020-02-28 06:30:36 +01:00
Tyler Young
38aeca2342 Automatic Partial Shader Reloading (#1005)
* merged in shader automatic reloading, remove internal shader reloading

add support for includes to shader reloading, modified includes reload shaders that depends upon them

* add some fault tolerance to allow playing with the file a bit

* prevent multiple watch attempts

* fix spacing

* revert project change

* add cancellation to Reload with a default of 30s

fix case sensitivity comparison

assume windows & mac are case insensitive
2020-02-28 06:27:35 +01:00
Pieter-Jan Briers
3e62e6d1f6 Fix a bunch of tests 2020-02-28 04:05:56 +01:00
Acruid
d7e0edd1a3 Removed the IEntityManager dependency out of EntityNetManager.
Removed the component message queue inside of EntityManager. There should be no time where messages are coming in before the EntityManager is initialized.
Removed the ability to send EntityEvents, you need to send either component or system messages.
2020-02-27 16:01:19 -08:00
Acruid
8f968760cb Replace IMapManager.FindGridAt with IMapManager.TryFindGridAt.
Grid spatial queries do not return the default grid anymore.
2020-02-27 02:10:18 -08:00
Tyler Young
36ee8a0c90 use generic type to fix call IsValueDefault
found a way to dedupe
2020-02-27 02:37:22 -05:00
Pieter-Jan Briers
d5872ce66d Make transform move messages use EventBus to improve perf. 2020-02-27 01:23:25 +01:00
Pieter-Jan Briers
84b5322e83 Optimize EventBus. 2020-02-27 01:23:03 +01:00
Pieter-Jan Briers
643c76b28e Optimize ComponentManager.GetComponents() 2020-02-27 00:16:08 +01:00
Pieter-Jan Briers
d9ae0efada Fix FOV being broken when lighting is disabled. 2020-02-26 14:03:28 -08:00
Pieter-Jan Briers
d0e537b8b9 Fix GetEntitiesIntersecting for Nullspace. 2020-02-26 14:03:28 -08:00
Swept
2532ecc021 Readme Updates (#998)
* Updates

* Update readme.md

Co-Authored-By: Pieter-Jan Briers <pieterjan.briers@gmail.com>

Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>
2020-02-25 22:40:35 -08:00
metalgearsloth
209b94a6f1 Add SnapGrid method to get neighbor GridCoordinates (#1002)
Just saves using a bunch of variables on content-side.
At this stage it's just used for puddles.
2020-02-25 22:38:39 -08:00
Tyler Young
a8f615d64b Fix lockers making items uninteractable (#1004)
* remove setter for MapPosition

change DetachParent to set WorldPosition after re-parenting to correct Map entity or MapGrid entity

* workaround until default grid not needed due to items can't be picked up if map ent parent
2020-02-25 22:31:46 -08:00
Pieter-Jan Briers
3dcdcd7f20 Make it so no broken entity gets created if AllocEntity is called with invalid prototype. 2020-02-25 22:25:42 +01:00
Acruid
fec386b190 Wraps exception handling in ApplyEntityStates with EXCEPTION_TOLERANCE preprocessor directives. This removes the exception handling from debug builds. 2020-02-25 13:07:33 -08:00
Acruid
446e91af28 Wraps game state entity initialization in try/catch blocks so that a single exception will not prevent the entire state from being applied. Broken entities that fail to Initialize/Startup are immediately deleted. 2020-02-25 12:41:30 -08:00
Pieter-Jan Briers
640deaa8e6 "Fix" addmap & loadbp crashing clients when PVS is enabled. 2020-02-25 20:29:05 +01:00
Tyler Young
52358d8fbe minor docs improvement 2020-02-24 20:10:16 -05:00
Tyler Young
b63d02d96d woo 2020-02-24 20:04:17 -05:00
Pieter-Jan Briers
2bb9105ed9 Fix compiler warnings. 2020-02-25 00:50:44 +01:00
Acruid
a2ca399cd0 Refactors SpriteSystem to use the GetEntitiesIntersecting spatial query instead of depth-first traversal of the scene graph, for increased performance. 2020-02-24 13:22:58 -08:00
Acruid
827727e136 Exposes the approximate argument for all spatial query methods in IEntityManager. 2020-02-24 13:20:50 -08:00
Pieter-Jan Briers
0b1f088f8c Better entity exception tolerance (#996)
* Use separate define constants for exception tolerance stuff.

* Improve handling of exceptions during entity creation.

The entity in question now gets marked as deleted immediately.

* Glorious.

* Testing components, tests, wrapper exception type.
2020-02-24 03:56:50 +01:00
Pieter-Jan Briers
fc212f983e Fix PvsEnabled not being respected correctly. 2020-02-24 03:05:35 +01:00
Pieter-Jan Briers
32bafb66a8 Shadows & FOV. (#992)
* Work on shadow casting.

* Shadowcasting depth works, code cleanup

* Adds #include support to SWSL parser.

* Move lighting shader to swsl.

Also more shader parser fixes.

* Move PI constant to correct file.

* Got functional FOV, working on wall bleed.

* Hey, it kinda works.

* Occluder component now lives in shared.

* Optimizations.

* Fix light map color format.

I set it to something else while testing perf.

* Front face cull final FOV pass.

* Fix holes in occlusion geometry due to disabled occluders.

* Starting work on better wall handling.

* Some comments.

* Improve font-face-culled FOV pass.

* Improve various light biasing things.

* VSM, smooth shadows.

Also unused VSM blurring because it didn't work but committing it like this will forever keep it in Git somewhere.

* FOV smoothing, looks kinda awful.

* Base wall bleed blur strength on camera size.

* The part where I give up.

* Comments. Many comments.

* Allow eyes to disable FOV.

* Improve OccluderComponent on the client.

* Update for occluder component changes.

* Maybe do this properly...
2020-02-23 17:18:58 +01:00
Pieter-Jan Briers
5f4cd8f98a Fix crash on map deletion. 2020-02-23 17:05:53 +01:00
Pieter-Jan Briers
4fa7fa89ef Fix stack overflow in PVS. 2020-02-23 15:50:16 +01:00
Tyler Young
214f9f0323 Implement client bubble PVS. (#983)
* bubble implementation

include contained entities

fix line edit crash when clipboard contents are null somehow

use CVar for update bubble range

remove seenMovers that get NaN'd out of MaxUpdateRange - huge reduction in network traffic from bullets

cut default of MaxUpdateRange down to 12.5 for now

maybe handle teleported things

handle removing player state on disconnect

fixed positional audio errors

make UpdateEntityTree also update player's last seen ents

make net.maxupdaterange cvar tunable at runtime w/o impacting performance

back to position nan as means to hide from client

revert work pooling as the wrong player was getting the wrong game state

ffs needed to think less about *if* something is *seen* and more about *when* it must be *unseen*

clean up usings

handle parenting and sequencing issues that arise on the client

gather needed ents to update recursively

applied suggestions from code review

fix missing recursively contained ents

make assumption that client last saw things on first tick instead of tick zero, as zero would be the "from tick" and first would be he "to tick"

add First tick as constant to GameTick due to relevance above

renamed includedEnts to checkedEnts to make usage more clear

added comments

inverted some conditions to flatten parts of the pvs logic

fixed sending states when already seen (lastChange < lastSeen to lastChange <= lastSeen)

fix sending states when no actual changes (other bugs?)

local caching of currentTick, remove priorTick

* make TransformComponent's Parent setter call Dirty() to handle replicating network state if AttachParent isn't invoked

* fixed parent changed by setting Parent on Transform not updating parent's Children collection and other stuff

rotating parent entities now are visible with their orbiting children if one of their children moves into view

* break out duplicated code as GetLastSeen

* remove unused net.parallelstates

introduce net.pvs to configure enabling/disabling PVS
2020-02-23 14:42:54 +01:00
Acruid
2cacf00d1a The VV system now has a PropertyEditor for EntityUid.
The Parent EntityUid property is now exposed on ITransformComponent.
2020-02-22 14:36:45 -08:00
Acruid
a5e47d9307 Adds more unit tests for EntityEventBus. 2020-02-22 12:49:17 -08:00
Acruid
728f58465d EntitySystem Event Refactor (#989)
* Removed the EntitySystem event implementation, it now uses the more advanced EventBus.
Removed EntitySystem.RegisterMessageTypes() function.
Removed EntitySystem.SubscribeEvents() function.
Added EntitySystemMessage.NetChannel field. This holds the remote net channel the event originated from.

* Removed the Sender object from events. If you needed this field, add it to the event class.

* Removed unused event proxy methods from Entity.
SubscribeEvent() has been split into SubscribeNetworkEvent() and SubscribeLocalEvent() methods on EntitySystem.
Most methods on EntityEventBus now require callers to specify the source (Local or Network) of the events.
2020-02-22 17:59:43 +01:00
ShadowCommander
91467ecdb9 Implement HistoryLineEdit (#990)
* Implement HistoryLineEdit

* Refactor DebugConsole to use HistoryLineEdit

* Clean up LineEdit

Add args.Handle() for each BoundKeyFunction

Clean up if statements

* Rearrange LineEdit variables

* Reimplement DebugConsole saving and loading
2020-02-22 17:56:35 +01:00
ShadowCommander
2a825ffe9e Fix ButtonGroup (#991) 2020-02-21 12:19:17 +01:00
Pieter-Jan Briers
e7d5604889 Fix assemblies not being loaded into correct load context in certain circumstances. 2020-02-21 12:18:53 +01:00
Pieter-Jan Briers
eae2a9283d Fix compiler warnings 2020-02-17 13:57:18 +01:00
Pieter-Jan Briers
b282881482 Key name API, slight input manager cleanup. (#985)
* Adds API for retrieving correct key names & key combination strings.

* Remove (most) bit flag stuff from InputManager.cs.

Replaced it with a union.
2020-02-17 11:13:12 +01:00
ShadowCommander
3b49e0df82 Implement ContainerButton and refactor buttons (#975)
* Add style to TextureRect

* Implement ContainerButton

ContainerButton is a button that resizes to fit the Controls it contains.

* Refactor OptionButton to use ContainerButton

This allows OptionButton to have an inverted triangle icon on the right to make it more obvious that the button is an OptionButton.

* Fix Popup not updating size when opened

* Fix DrawMode not getting updated when _pressed is changed

* Refactor Button to inherit from ContainerButton

* Refactor CheckBox to inherit from ContainerButton

* Fix Control.StyleClasses.GetEnumerator

It was calling GetEnumerator in an infinite loop instead of getting _styleClasses.GetEnumerator like it was supposed to do.

* Update Button references

* Fix Styling
2020-02-17 11:06:16 +01:00
Pieter-Jan Briers
cb095b28bd Fix not being able to VV content components on release. 2020-02-15 21:56:37 +01:00
Pieter-Jan Briers
a07c068a8c Implement lsasm command.
Just something I needed to debug something.
2020-02-15 21:53:56 +01:00
Pieter-Jan Briers
44c7ff552e Optimizations.
Removed use of ConcurrentDictionary. It was slow.
Other minor optimizations around the codebase.
Added option for parallel game state generation. Seems slower than doing it single-threaded so off by default for now.
2020-02-15 17:22:32 +01:00
Pieter-Jan Briers
115795c38e Game state netcode improvements (#978)
* Fix server sending ALL game states reliably.

Now only large enough game states get sent reliably. This means that when a single client stops ACKing the server isn't spamming a bunch of massive game states into Lidgren to reliably deliver.

* Do not send prototype-duplicated data in game  states.

This cuts out component states and ComponentChanged data if this can already be inferred by deserialization of the prototype on the client.

* More comments.

* Remove debugging code.

* Use GetNetComponents instead of GetAllComponents.

Nice little optimization.
2020-02-15 13:45:52 +01:00
moneyl
e2ce1ffb2a Improve error handling and help messages on several console comm… (#980)
For `loglevel`, `testlog`, and `gc`.
2020-02-15 13:41:41 +01:00
Pieter-Jan Briers
69c2163988 Fix input commands firing even if GUI handles them. 2020-02-15 01:41:10 +01:00
Pieter-Jan Briers
a0c1415873 Update Lidgren to master from the repo. (#979)
Should improve stability or whatever. Also some convenient stream features.
2020-02-15 01:21:30 +01:00
4dplanner
4470443445 SpriteView checks for deleted sprites (#977) 2020-02-13 23:12:05 +01:00
ShadowCommander
b9fdda85ef Add check to LineEdit cursor position (#971) 2020-02-13 13:35:02 +01:00
Tyler Young
a3a8a8b3cf Use Kestler for StatusHost (#966)
* implement StatusHost as a minimal Kestler based HTTP Rest service

break up and organize StatusHost

* handle weird disposal mechanics exposed by testing facility
2020-02-09 23:16:16 +01:00
Acruid
f5c4012408 Fixes issues with certain components that prevented network interpolation from working.
Added try/catch around call to IComponent.HandleComponentState().
Prevent interpolating entities with large changes in position (teleporting).
2020-02-09 02:24:07 -08:00
ShadowCommander
56bda966ba Fix client reconnect after getting disconnected (#965)
The _clientConnectionState wasn't reset to NotConnecting when disconnected by the server (compared to the client disconnecting from the server).
2020-02-09 10:26:24 +01:00
Tyler Young
8bcc5808cc Console commands; gc_mode and szr_stats (#964)
* add some console commands; gc_mode and szr_stats

* add latency mode list to gc_mode
2020-02-09 10:15:01 +01:00
Pieter-Jan Briers
76956448e6 Set max connections count in Lidgren. 2020-02-08 23:13:44 +01:00
Pieter-Jan Briers
179267df24 Add [ViewVariables] to LocalPlayer. 2020-02-08 21:51:43 +01:00
Pieter-Jan Briers
2322aa6aa8 Allow modifying send and receive buffer sizes on the NetPeerConfiguration. 2020-02-08 21:22:36 +01:00
Pieter-Jan Briers
4a1dd9a650 Add CanAdminPlace permission and adds ability for content to block placement. 2020-02-08 20:41:17 +01:00
Tyler Young
42c22c1041 Physics fixes (#963)
DynamicTree now no longer uses a ConcurrentDictionary for proxy look ups
2020-02-08 20:07:13 +01:00
Pieter-Jan Briers
64a8708762 Fix crashes from deleting oneself. 2020-02-08 17:10:37 +01:00
Pieter-Jan Briers
bc630d9b01 Disable status host in integration tests. 2020-02-08 15:36:48 +01:00
Pieter-Jan Briers
ecd4bbbba3 Change default for status to bind to *. 2020-02-08 15:30:18 +01:00
Tyler Young
b6e0359b06 Correct ray casting (#957)
fix weird merge artifacts

fix aabb extraction happening too early on ray casting
2020-02-08 11:05:18 +01:00
moneyl
a8618b339e Fix crash when playing audio on grid that does not exist (#959)
Adds a check to the `PlayAudioPositionalMessage` case of client `AudioSystem` to make sure the grid it's playing on actually exists. If it doesn't, an error is logged and the message is ignored instead of crashing the client.
2020-02-08 11:03:58 +01:00
Pieter-Jan Briers
7841368eeb Allow server to specify custom content pack downloads. 2020-02-08 11:03:20 +01:00
Tyler Young
5d37780f4e Have PhysicsManager use DynamicTree (#955)
* have PhysicsManager use DynamicTree

* remove BroadPhaseNative

add BroadPhase wrapping DynamicTree

replace IBroadPhase with regards to DynamicTree

* add collision enumeration capability for proper BroadPhase

* fix slow app exit due to MapId being unavailable at various stages of shutdown

reduce code footprint of alternate query in AnyEntitiesIntersecting by using existing query (only used rarely)
2020-02-07 15:15:33 -08:00
Pieter-Jan Briers
b3288d1d5c Work around OpenGL drivers not respecting GL_DEBUG_OUTPUT_SYNCHRONOUS. 2020-02-08 00:13:17 +01:00
Tyler Young
3cc10f7eb7 Fix crash from destruction of containers containing containers (#956) 2020-02-07 17:53:22 +01:00
Víctor Aguilera Puerto
8a2ae5ec85 Makes spawnlist use prototype ID if prototype name is null or em… (#954) 2020-02-06 16:12:34 +01:00
Pieter-Jan Briers
568dee4c55 SpriteSystem optimizations. 2020-02-06 16:10:14 +01:00
Pieter-Jan Briers
3d30e86e8c Fix CullDeletedEntities() not working. 2020-02-06 16:09:51 +01:00
Pieter-Jan Briers
418e40d254 Optimize EntityManager.GetEntitiesIntersecting
Removes a stray .ToArray().
2020-02-06 14:39:03 +01:00
Pieter-Jan Briers
0df2d7c89d More Clyde refactoring, FOV works now. 2020-02-06 14:14:27 +01:00
Tyler Young
755675eaab Introduce DynamicTree, Separate Ray from CollisionRay (#951)
* separates Rays from CollisionRays, removing collision masking from Ray

* Entity, ClientEntityManager and EntityManager classes occasionally need to UpdateEntityTree

Entity intersection queries now use a DynamicTree

DynamicTree now correctly reports Count and separately NodeCount

DynamicTree now has optionally precise queries

DynamicTree no longer incorrectly Adds on AddOrUpdate if Update is not necessary

Entity startup now starts Transform, then Collidable, then remaining components

EntityManger's Entity dictionary is now a ConcurrentDictionary to support iteration under modification

DynamicTree freeing root leaf no longer results in invalid tree

SnapGridComponent has been extended to support additional area and directional queries

* added lots of calls to UpdateEntityTree, will need to scale back during review

fixed moved/changed AABB updates to DynamicTree, missed a ref

converted other methods in EntityManager to use the tree for spatial queries

* add unit tests for DynamicTree

make Capacity and EnsureCapacity public, setting Capacity will call EnsureCapacity

* fix brace style

* Box2 Grow -> Enlarged, Combine -> Union
2020-02-06 14:13:15 +01:00
Acruid
58b460e9f5 Removes incorrect debug assertion, resolves https://github.com/space-wizards/RobustToolbox/issues/953. 2020-02-05 12:15:39 -08:00
Acruid
1545340d5c Fixed bug in matrix multiplication that caused entities to be drawn in the wrong spot in the world. 2020-02-04 22:24:22 -08:00
Pieter-Jan Briers
0169312c0b Not actually functional FOV system.
There's enough various changes in here that this is worth committing already.
2020-02-05 00:10:58 +01:00
Quantomicus
cff6a9a5a7 Remove selector support in the RSI format (#952) 2020-02-04 23:43:27 +01:00
Quantomicus
3d34265c6f Fixes #923 (#950) 2020-02-04 19:14:44 +01:00
Tad Hardesty
f8037df56a Replace TransformComponent.OnMove with component message (#946) 2020-02-03 18:05:55 +01:00
moneyl
21cd0f41b4 Increase default vv window size for convenience (#948)
Makes all tabs and information visible by default instead of needing to resize every vv window.
2020-02-03 18:05:30 +01:00
Tad Hardesty
41fa37b955 Update Travis to Bionic and Python 3.6 (#947)
* Update Travis to Python 3.6

* Let's try bionic

* It's just python3 on bionic

* apt update

* Maybe this

* Use generic build image

* >defaults to Ruby
2020-02-03 18:03:40 +01:00
Pieter-Jan Briers
76933003ad Improve native downloading spaghetti, use own Freetype on macOS 2020-01-30 13:29:19 +01:00
Pieter-Jan Briers
322ac488a1 Split part of Clyde rendering off to another file. 2020-01-28 17:05:47 +01:00
Pieter-Jan Briers
fc9f7827d5 Remove package dir override. 2020-01-28 16:06:06 +01:00
DamianX
8e19f7f14c Workaround for the discord rich presence library spamming the logs (#942) 2020-01-27 07:29:42 +01:00
Pieter-Jan Briers
ada2c3f39c Fix handling of disconnects in the integration test netmanager.
Clients would treat any message coming in as being from the server they're connected to, instead of ignoring them if they're not correct.

This made the client crash inside integration tests because messages came in while disconnected.

This fixes that.
2020-01-26 23:51:57 +01:00
Pieter-Jan Briers
11f4f3820c Skip entity drawing if we are in nullspace. 2020-01-26 18:34:40 +01:00
Pieter-Jan Briers
d3997b51e8 Add assert that function in InputSystem.HandleInputCommand is correct. 2020-01-26 03:32:12 +01:00
Pieter-Jan Briers
2a3624c89c Add debugging to ModLoader.cs 2020-01-25 23:16:16 +01:00
Pieter-Jan Briers
62b31d36a4 Uhhh try to figure out why the public server is brokn. 2020-01-25 22:41:10 +01:00
Acruid
f33f9a7b52 Move raycasting into the broadphase algorithm.
Raycasts now require a MapID so that the ray is restricted to a single map.
2020-01-25 12:14:09 -08:00
Pieter-Jan Briers
467dd0dc28 Fix threaded lazy loading of content assembly dependencies.
This is necessary because content now loads the preferences database from the thread pool. This causes the assembly loads for that (they're lazy by the runtime) to run in that thread, which means that the resolver callback we set up in ModLoader did not work (it has to do an IoC resolve).

This change creates a new AssemblyLoadContext for every ModLoader and as such we can tie the loading in said context to a specific ModLoader, thus cutting out the need for a static IoC resolve.

This also paves the way to assembly unloadability a bit.
2020-01-25 20:39:07 +01:00
Pieter-Jan Briers
768121bc57 Fix popups going off-screen with a new PopupContainer. 2020-01-25 17:26:37 +01:00
Pieter-Jan Briers
3d11cf2f87 No running AssemblyTypeChecker unless necessary, use less dumb byte copies. 2020-01-25 16:27:30 +01:00
Acruid
4eb29a9e80 Removed GridCoordinates.ConvertToGrid because it is completely pointless.
Removed GridCoordinates.ToWorld in preparation for removing Map Default Grids.
2020-01-25 01:37:37 -08:00
Acruid
42932b3ff6 Adds IMapGrid.CollidesWithGrid() which tests if a point is actually inside a non-empty tile. 2020-01-24 17:10:05 -08:00
Acruid
9f956cef95 Renamed SpawnEntityAt to SpawnEntity.
SpawnEntity now throws an exception if an invalid GridID is passed in the coordinates.
2020-01-24 15:44:08 -08:00
Acruid
bd7b316f1d Pulled all entity spatial queries up from client/server EntityManagers to shared EntityManager. 2020-01-24 14:53:12 -08:00
Acruid
df9be436c4 Removed the StateType property from every component. This field was completely unused except for a debug assertion. 2020-01-24 14:07:46 -08:00
Pieter-Jan Briers
6870cef9e6 Fix YamlException handling in PrototypeManager.LoadDirectory 2020-01-24 16:38:43 +01:00
Pieter-Jan Briers
5fd0718f6a Add error log to SpriteSpecifierExt.Frame0. 2020-01-24 16:31:46 +01:00
Pieter-Jan Briers
343667442b Make MarshalHelper.cs use .NET Core 3 Marshal functions. 2020-01-24 13:18:39 +01:00
Pieter-Jan Briers
9fd675a8b9 Handle SIGTERM on Linux again. 2020-01-24 01:33:31 +01:00
Pieter-Jan Briers
e10707982c Add assertions to Control.cs 2020-01-24 00:49:10 +01:00
Pieter-Jan Briers
4b5cf26153 Try to fix Windows builds... (#939)
* Try to fix Windows builds...

* AppVeyor stop being drunk.

* Attempt 3
2020-01-23 00:42:00 +01:00
Pieter-Jan Briers
9b8c122f03 Enable nullability for Robust.Shared.Maths 2020-01-22 23:56:13 +01:00
Pieter-Jan Briers
766e2c81e2 Fixes debug coords panel throwing in main menu.
Fixes #938
2020-01-22 23:55:41 +01:00
Pieter-Jan Briers
a4bf3161fc Clyde windowing improvements:
Pauses rendering if the window is minimized.
Fixes #931

I apologize in advanced for the non-atomic commit.
2020-01-22 23:45:12 +01:00
Pieter-Jan Briers
4a3aacedea I am a very big idiot. 2020-01-22 20:24:48 +01:00
Pieter-Jan Briers
f360978973 Fix spaces in filenames of build directory. 2020-01-22 20:23:32 +01:00
Pieter-Jan Briers
d945247f31 Add necessary infrastructure to allow content to launch game from itself.
This allows us to make Content.Client and Content.Server Exe projects so that they can be executed directly via your IDE. This'll help wtih not forgetting to do a full rebuild and such.
2020-01-22 20:16:29 +01:00
Pieter-Jan Briers
997f1c031f Use shutil.copy2 instead of shutil.copyfile for git_helper.py 2020-01-22 17:09:17 +01:00
Tad Hardesty
613368edde Fix Sonar warnings in MidiRenderer (#937) 2020-01-22 08:23:57 +01:00
L.E.D
33a62127a9 Assert for normalized direction vector (#936) 2020-01-21 23:28:37 +01:00
Pieter-Jan Briers
28fe0313d1 Added stencil testing support to shader instances. 2020-01-21 18:10:44 +01:00
moneyl
8f16b188dd Add delete key behavior to LineEdit (#934)
* Add delete key behavior to LineEdit

Pressing delete will now delete the character in front of your cursor like usual.

* Update Robust.Client/UserInterface/Controls/LineEdit.cs

Co-Authored-By: Pieter-Jan Briers <pieterjan.briers@gmail.com>

Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>
2020-01-21 18:10:26 +01:00
DamianX
ae1e9c3a71 Entity spawn window's search bar grabs keyboard focus (#928) 2020-01-21 18:10:04 +01:00
moneyl
d1dc84c632 Fix crash when minimizing game window (#933)
Returns early if the window or framebuffer width or height = 0 to avoid dividing by zero. Checked the vector components individually instead of using `Vector2i.Equals()` because you can end up in a situation where width is non-zero and height is zero if you manually resize the window instead of using the minimize button.
2020-01-21 03:18:11 +01:00
Pieter-Jan Briers
861e19da76 Clarify terminology in debug memory panel. 2020-01-21 02:11:09 +01:00
Pieter-Jan Briers
3ab02acf46 Try to avoid server integration tests causing weird output on Travis. 2020-01-20 22:36:31 +01:00
Pieter-Jan Briers
103fca8bc7 Add MapCoordinates.Nullspace. 2020-01-20 22:26:04 +01:00
Pieter-Jan Briers
dd98f3cbad Adds IntegrationInstance.Assert to aid using assertions. 2020-01-20 22:09:15 +01:00
Pieter-Jan Briers
e7ccef53de Update NuGet dependencies. 2020-01-20 20:41:01 +01:00
Pieter-Jan Briers
4e3f5508e9 Custom command line args & CVar override on Client. 2020-01-20 20:33:11 +01:00
Pieter-Jan Briers
a2ea21c3c5 Gave custom command line parser an "unknown argument" error condition. 2020-01-20 20:32:53 +01:00
Pieter-Jan Briers
e2bbffd509 Fix CVar overriding not running ValueChanged correctly. 2020-01-20 20:32:36 +01:00
Pieter-Jan Briers
0e721feea3 Add --cvar command line option.
Also rewrote the command line parser to be manual. Removes a dependency, speeds it up, and actually makes --cvar capable of using a sane syntax.
2020-01-20 19:49:07 +01:00
Pieter-Jan Briers
ab465d2af8 Fix unit tests. 2020-01-20 18:47:44 +01:00
Pieter-Jan Briers
9b77ba4605 Fix building on release. 2020-01-20 18:40:53 +01:00
Pieter-Jan Briers
132f15b32d Rendering optimizations. 2020-01-20 17:45:33 +01:00
Acruid
6249ae8d0d Fixes issue where map entity was not being deleted from Nullspace on restart. 2020-01-20 00:04:13 -08:00
Pieter-Jan Briers
0cda9ecbee Fix sprites not cloning the serialization cache correctly. 2020-01-20 08:17:29 +01:00
Pieter-Jan Briers
ae85645e23 IRobustRandom.Shuffle<T>(IList<T>) 2020-01-19 19:07:12 +01:00
Pieter-Jan Briers
237c6e433c dumpentities command is now sorted. 2020-01-19 12:41:41 +01:00
Pieter-Jan Briers
dfc1e99092 Fix OptionButton throwing an exception when the first item added doesn't have ID 0. 2020-01-19 03:17:08 +01:00
Pieter-Jan Briers
1f0ec7fa68 Pulling down debug console no longer captures all mouse input. 2020-01-18 03:18:33 +01:00
DamianX
18f90bd125 HOME and END keys work in LineEdit (#929) 2020-01-16 13:19:47 +01:00
Pieter-Jan Briers
22cf53fd1c Optimizations:
Use PLINQ for prototype loading. Most of the time is spent reading YAML so this should help a lot.
Don't regenerate collision for every tile placed by the map loader.
2020-01-15 16:13:22 +01:00
Pieter-Jan Briers
0739367013 Fix a bunch of compiler warnings. 2020-01-15 14:50:46 +01:00
Pieter-Jan Briers
d14348dfa5 Ignore framework version warnings. 2020-01-15 14:39:21 +01:00
Pieter-Jan Briers
0348919104 Implement Slider UI control. 2020-01-15 14:10:05 +01:00
Pieter-Jan Briers
414a264ea9 Adds Range.SetAsRatio. 2020-01-15 14:10:05 +01:00
Pieter-Jan Briers
c09fc5f021 TabContainer no longer crashes on controls without name. 2020-01-15 14:10:05 +01:00
Pieter-Jan Briers
b458dd96a3 Fix Clyde erroneously culling on chunk rendering.
Fixes #912
2020-01-15 14:10:05 +01:00
Acruid
ed134da488 MapManager_Tests now work on both client and server sides. 2020-01-15 03:07:37 -08:00
Acruid
32db0f82f1 Grid chunks now use the GridChunkPartition method for generating a set of collision rectangles and their bounds.
Grid collision rectangles are now drawn as a blue overlay in the CollisionOverlay debug view.
GridChunkPartition now also returns the bounding rectangle, which is a union of all the collision rectangles.
Each IPhysShape now handles it's own debug drawing with a new method, DebugDraw.
2020-01-13 13:40:09 -08:00
Acruid
6817969c8b Adds a helper class that can partition a map grid chunk into a set of rectangles. 2020-01-13 11:23:35 -08:00
Pieter-Jan Briers
5c77c1a8b8 Color.[Try]FromHex now takes ROS<char> and no longer allocates.
Also added a test to ensure it works.
2020-01-12 01:56:27 +01:00
Acruid
30db86fae8 Collidable Components are now added to grids when they are created. 2020-01-11 15:13:15 -08:00
Acruid
78a33076f9 Merged client and server CollidableComponent into a shared version. Now shared code can add collidable components to entities. 2020-01-11 14:10:25 -08:00
Acruid
7a77fa59e2 Switched physics collision broadphase from spatial partition to Naive.
Grid->Grid collision works.
2020-01-10 15:39:34 -08:00
Acruid
22bf1516cf Adds the new PhysShapeGrid.
Grids now have their own collision group.
2020-01-09 18:26:54 -08:00
Pieter-Jan Briers
14116cdbdf Fix LayoutContainer on HiDPI. 2020-01-09 03:12:35 +01:00
Pieter-Jan Briers
74a940ca9e Apparently that's not how window scaling works in GLFW.
Fixes mouse input issues on certain non-macOS platforms.
2020-01-09 03:09:16 +01:00
Pieter-Jan Briers
7339be51fe Fix unit test. 2020-01-09 00:42:54 +01:00
Pieter-Jan Briers
dadaa3fb8f Very basic GUI animations. 2020-01-09 00:13:37 +01:00
Acruid
150c899f6f Removed generic constraints from TryGetComponent<T> to match all the other functions. 2020-01-08 15:12:24 -08:00
moneyl
928a5e3521 Fix the entity spawn panel clear button (#926)
Previously the entity spawn panel clear button caused nothing to show up. This fixes that so it rebuilds the entity list with a empty search.
2020-01-08 17:37:13 +01:00
ShadowCommander
5037ace00b Fix mouse input on HiDPI monitors (#927) 2020-01-08 11:50:25 +01:00
Pieter-Jan Briers
3faa52ee01 Call MinimumSizeChanged on AddChild and RemoveChild. 2020-01-05 15:47:27 +01:00
Pieter-Jan Briers
7d8992e0ca Some doc comments for type abbreviations. 2020-01-05 15:42:20 +01:00
Pieter-Jan Briers
131a1ee3bd Type Abbreviation utility.
Just to neaten up VV a little.
2020-01-05 01:51:25 +01:00
Acruid
ba390ba466 Hopefully fixes the client freezing when a GameState is lost in transit (or is never sent). 2020-01-04 16:19:19 -08:00
Pieter-Jan Briers
a69738a7a4 Terrible fix for physics crashes. 2020-01-05 00:48:45 +01:00
Acruid
8d30bcb041 Added a ShowContents flag to containers so that the contents can be rendered.
Added `bool TryGetContainer(IEntity, out IContainer)` to containers.
Changed the API of ContainerHelpers.
2020-01-03 15:16:07 -08:00
Pieter-Jan Briers
da579d6b57 Replace a glBufferSubData call with a glBufferData call.
No real reason to subdata this.
2020-01-02 11:16:18 +01:00
Pieter-Jan Briers
4e6906fa7f Remove unused code in Clyde.Windowing.cs 2020-01-02 02:04:08 +01:00
Pieter-Jan Briers
45c77e10a1 Console command to add component to entity. 2020-01-02 02:04:08 +01:00
Acruid
4a900cbd7f Removed IoCManager.Resolve calls from IMapGrid. 2019-12-29 23:20:36 -08:00
Acruid
9b5b8205b9 Renamed GridCoordinates.Nullspace to GridCoordinates.InvalidGrid, because it has nothing to do with Nullspace anymore. 2019-12-29 18:12:29 -08:00
Acruid
37aee07596 Rename GridId.Nullspace to GridId.Invalid, because it has nothing to do with Nullspace anymore. 2019-12-29 18:02:02 -08:00
Acruid
58d0a771e8 TransformComponent.GridID now returns GridID.Nullspace instead of throwing when the entity in question is not on a grid.
Added MapManager.Restart().
Added MapManager.CreateNewMapEntity() and MapManager.SetMapEntity() for manipulating the map root entity.
You can now spawn entities directly into Nullspace, after setting up the Nullspace map entity.
2019-12-29 16:08:46 -08:00
Pieter-Jan Briers
aa3e126249 Fix dump entities command blowing up due to grid entities. 2019-12-29 01:20:43 +01:00
Pieter-Jan Briers
1c39a36297 Fix SpriteComponent not respecting SetAutoAnimated anymore. 2019-12-29 01:20:31 +01:00
Pieter-Jan Briers
259f6c8ea4 Fix bullets crashing the server.
This is not a proper fix. A proper fix would be a better physics engine.

But as it stands I really wanna get a progress report out and having to refactor physics to do it would just suck.
2019-12-29 01:06:57 +01:00
Pieter-Jan Briers
6d8bfcc7bb Avoid breaking batching on every shader change.
This fixes batching not working for sprite layers. They'd set & reset the active shader constantly which broke batching.

Active shader is now part of batch meta data and broken like other data like textures.
2019-12-28 13:25:28 +01:00
Pieter-Jan Briers
900910e4de Fix crime of using static for stock Textures. 2019-12-28 12:52:19 +01:00
Pieter-Jan Briers
3f979ef7f2 Fix crash on server shutdown.
This also fixes integration tests.
2019-12-28 12:45:29 +01:00
Acruid
1a4196697f Refactors HandleEntityState off of Entity.
Refactors GetEntityState off of Entity.
IComponentManager.GetNetComponents(EntityUid) now returns deleted entities.
2019-12-27 21:41:12 -08:00
Pieter-Jan Briers
a76191c138 Use R11FG11FB10F for lighting framebuffer.
This halves the memory necessary for the lighting framebuffer, so probably helps with bandwidth usage (especially on integrated GPUs) too.

I couldn't notice a decline in visual quality on my (admittedly) bad laptop screen.
2019-12-28 03:28:41 +01:00
Pieter-Jan Briers
cb563c75fd Update map loader to work with grid entities. 2019-12-28 03:22:09 +01:00
Pieter-Jan Briers
472bd67ace Fix edge sliding.
The "too close" threshold on Transform WorldPosition set was way too high, so the low movement speed when edge sliding was seen as not moving at all.
2019-12-24 15:26:23 +01:00
Pieter-Jan Briers
2f94beb4b5 Fix ContainerManagerComponent.ContainsEntity not returning correct results for multiple containers. 2019-12-24 15:16:14 +01:00
Pieter-Jan Briers
47d4a8f628 Improve ModLoader to fix loading issues for Dapper.dll 2019-12-24 02:52:38 +01:00
Pieter-Jan Briers
3c08f56619 Sprite orientation improvements (#917)
* Fold animation delays into a single set for all directions.

* Update systems to use new RSI animations API.

* Fetching layer directions now done in sprite render.

* Allow overriding direction in SpriteView.
2019-12-24 01:15:44 +01:00
Pieter-Jan Briers
761b06d68a Add threading assertions to IoCManager. 2019-12-22 21:47:00 +01:00
Pieter-Jan Briers
2b037c3bf2 Synchronize containers to the client. 2019-12-22 21:43:03 +01:00
Pieter-Jan Briers
f2c8b343bb Fix initialize not getting called for components added during initialize. 2019-12-22 21:42:30 +01:00
Pieter-Jan Briers
531cfeb9e6 KVPair<K, V> now shows in VV. Client only. 2019-12-22 21:38:21 +01:00
Pieter-Jan Briers
21b29e26e2 Fix a bunch of warnings. 2019-12-22 13:50:29 +01:00
Pieter-Jan Briers
2b8645b60f Fix some Robust.Server namespaces in Robust.Shared. 2019-12-22 13:40:43 +01:00
Acruid
f5c0dba194 Map & Grid Entities (#916)
* Adds Map components to the ECS system.

* Grid entities are now created along with map grids.
Grid components are now properly reused from map deserialization when a grid is created through the MapManager.

* Make MapGridComponent shared.
Don't send Nullspace default grid to client, they have their own.
Properly link the new grid with the entity sent from the server.

* Fixes nullRefException when ToString() is called on an Entity with no Prototype.

* Adds logging debug info about binding a map/grid to an entity.
Nightly Commit.

* Client map networking now properly pivots a grid from the client entity to the shared entity.
Added IMapGridComponent.ClearGridId() to properly dissociate the component from a grid before deleting it.
WorldPosition of a default grid is always 0,0 regardless of the entity transform (if any).
Nullspace map and default grid are not bound to an entity.
Nullspace map and default grid cannot be deleted.

* Map Entities are now created along with new maps.

* Client & Server load with new scene hierarchy.

* Fix rebase damage.

* Added ContainerHelpers helper class.

* Fix Container checks.

* Fixed clothes.

* Fixing unit tests.

* Removed disabled code.

* Actually initialize and startup the Map and Grid entities.
2019-12-21 22:11:17 +01:00
Acruid
2c7630f4f1 Adds assertions in various places to make sure entities are being initialized properly before the game state is built. 2019-12-19 11:16:43 -08:00
Pieter-Jan Briers
610bfea95c Clyde improvements.
Reduced the amount of buffer data calls to the OpenGL driver significantly, cleaned some code up to make it easier to extend Clyde.
2019-12-18 12:21:52 +01:00
Pieter-Jan Briers
6c0c395dc7 Remove lite stuff from Clyde. 2019-12-17 19:25:05 +01:00
Pieter-Jan Briers
99f96aee27 Remove Robust.Lite 2019-12-17 16:09:55 +01:00
Pieter-Jan Briers
d075c82041 Switch to C# 8 2019-12-17 16:06:46 +01:00
DamianX
f71d72d88c Added Sqlite dependency (#915) 2019-12-17 15:58:21 +01:00
Acruid
df34ce025a Entities now require a location when being spawned. 2019-12-16 21:43:24 -08:00
DamianX
5ff164e762 Expose IWritableDirProvider.RootDir (#913)
* Expose IWritableDirProvider.UserDir

* Update WritableDirProvider.cs
2019-12-16 09:56:37 +01:00
Pieter-Jan Briers
9f7a1e066b Try to fix crash loop on game server 2019-12-16 01:03:55 +01:00
Pieter-Jan Briers
58dcea5bda Try to fix AppVeyor. 2019-12-15 22:31:29 +01:00
Pieter-Jan Briers
3f0032911a Try to fix travis.. 2019-12-15 22:28:33 +01:00
Pieter-Jan Briers
c8c17da176 Remove reference to System.Net.Http. 2019-12-15 22:26:48 +01:00
Pieter-Jan Briers
08ba611fe6 Forgot to commit the travis script. 2019-12-15 22:24:33 +01:00
Pieter-Jan Briers
7442f52297 Try to fix CI. 2019-12-15 22:22:24 +01:00
Pieter-Jan Briers
ba80ba5cc1 Try to fix CI. 2019-12-15 22:17:18 +01:00
Pieter-Jan Briers
1db0694541 Try to fix CI. 2019-12-15 22:13:54 +01:00
Pieter-Jan Briers
f6b894f274 .NET Core time. 2019-12-15 16:01:08 +01:00
Pieter-Jan Briers
52e5afd277 Switch to GLFW for windowing (#914)
* Use GLFW instead of OpenTK windows

* Seems to work pretty well now.

* Fix stackalloc issue on Framework.

* Add GLFW project to sln.

* Fix package downgrade.

* Fix SLN more.

* Please work.

* Fix C# version error.
2019-12-15 15:53:30 +01:00
Pieter-Jan Briers
1899544500 Server optimizations.
1. NetManager.IsConnected no longer uses LINQ.
2. creating net messages for sending/receiving now uses cached DynamicMethods to improve speed (bypasses Activator.CreateInstance and params allocations)
3. Entity.GetComponentStates uses GetNetComponents now.
4. PhysicsManager allocates significantly less now.
2019-12-11 17:08:46 +01:00
Pieter-Jan Briers
f893d308ad Cut cruft from DebugCoordsPanel. 2019-12-11 07:50:19 +01:00
Pieter-Jan Briers
2fc8e6af46 Remove dependency on ConcurrentDataStructures by pulling in their PriorityQueue<T> implementation. 2019-12-11 07:16:52 +01:00
Pieter-Jan Briers
3095952dcb Use our own SpaceWizards.SharpFont for better .NET Core support. 2019-12-11 06:46:26 +01:00
Acruid
ea8e5e9fe7 EventBus Refactor (#909)
* Extracts the ECS event system out of EntityManager, and into a new class called EventBus.
XML Docs and full test coverage for EventBus.
2019-12-08 19:36:52 -08:00
Pieter-Jan Briers
026f6cb118 Use new icon 2019-12-06 17:38:08 +01:00
Pieter-Jan Briers
12787db8de Avoid crash in Clyde if the GLSL compiler optimizes out uniforms. 2019-12-06 02:29:58 +01:00
Pieter-Jan Briers
31fb926127 Remove selection outline code from ClickableComponent 2019-12-06 01:18:37 +01:00
Pieter-Jan Briers
66ea13684b Remove GameScreen from engine. 2019-12-06 00:40:37 +01:00
Pieter-Jan Briers
69ff3638ba Make framegraph not catch clicks. 2019-12-06 00:10:14 +01:00
Pieter-Jan Briers
6cfe6caae2 guidump lists attached properties. 2019-12-05 15:37:11 +01:00
Pieter-Jan Briers
ab1f4fb0e7 UI layout v2. (#908)
* UI layout v2.

All controls now act like containers.
Moved anchor/margin layout model to LayoutContainer

Implement basic WPF-like attached properties for the above LayoutContainer.

* Fix VV.
2019-12-05 13:37:58 +01:00
Pieter-Jan Briers
9b15070126 Remove allocations from PhysicsSystem HandleMovement.
LINQ is bad alright.
This removes approx 20% of allocations on the server.
2019-12-04 13:48:45 +01:00
Pieter-Jan Briers
4eb100076d Entity spawn window no longer lags when opening. 2019-12-04 13:26:37 +01:00
Pieter-Jan Briers
6156a9eae8 Fix crash on detaching from deleted entity. 2019-12-04 02:16:20 +01:00
Pieter-Jan Briers
2e762fbaf4 Give RSISchema.json a logical name in the csproj.
This *should* fix random occurrences of the compiler putting it somewhere else and the schema failing to load.
2019-12-01 15:15:57 +01:00
Pieter-Jan Briers
dec9ea744d Static localization manager class for convenience. 2019-12-01 15:13:00 +01:00
Pieter-Jan Briers
89094458cd Add documentation to ILocalizationManager 2019-12-01 15:12:35 +01:00
Pieter-Jan Briers
31adf9e4fc Mention thread locality in IoCManager documentation. 2019-12-01 15:12:06 +01:00
Pieter-Jan Briers
563cc262cb Add !Deleted assertion to Entity.GetComponent() 2019-12-01 15:08:53 +01:00
Pieter-Jan Briers
13ef4e8423 Various optimizations focused on the entity spawn panel:
Give BoxContainer a preset capacity to reduce allocations in layout.

Removed Control.GetChild(string) and similar. This was no longer used (and was a pretty bad idea in general), and the implementation had a lot of wasted book keeping to do.

Use UpdateLayout() instead of DoUpdateLayout() in Control minsize changed to avoid doing redundant layout, and by extension style & minsize, updates.

Used RemoveAllChildren instead of DisposeAllChildren in EntitySpawnWindow because it's faster (way less stuff to clear, just let the GC handle it).

Optimized ResourcePath with a better GetHashCode(), better Equals, replacement for List<T>.ToArray()

Fixed enumerator allocations in stylesheet SelectorElement matching to speed up style updates.

ResourceCache now caches fallbacks to avoid constructing Resource instance when fetching fallback explicitly.

ResourceCache now has nested dictionaries for Type -> ResourcePath -> BaseResource storage of resources.

Use calculated property instead of auto property for TextureResource.Fallback
2019-11-28 14:19:02 +01:00
Pieter-Jan Briers
f3669e6646 Sound system improvements.
This just makes the sound system more flexible so content can do more stuff.
2019-11-27 00:33:54 +01:00
Acruid
d9a411b260 Shared IMap/Map class removal (#904)
* Moved IMap from Shared/Interfaces/Map to Shared/Map namespace.

* Extracted Map class out of the MapManager class.

* Removed the Map class and interface.

* Fully removed the Map and IMap class.
2019-11-26 20:47:04 +01:00
Acruid
9de0c9b299 Adds the RemoveMap concommand rmmap to the engine.
Adds the RemoveGrid concommand `rmgrid` to the engine.
2019-11-25 23:13:07 -08:00
Acruid
73e89f9e27 Fixes a bug where the using the TP player command with a destination on top of a grid resulted in the player teleporting to the wrong location. 2019-11-24 15:45:01 -08:00
Peter Wedder
063c30e2bf Scrollbar minimum size (#903) 2019-11-24 11:35:52 +01:00
ShadowCommander
1263e10f5e Add exception to catch rendering deleted entities in UI (#902) 2019-11-24 10:44:42 +01:00
Pieter-Jan Briers
36822462ba Improve ray debug drawing.
Fixes unit tests.
Made ray color change if successful hit.
Made ray length based on actual ray results.
2019-11-24 00:44:47 +01:00
Ephememory
519c28cad2 Add a DebugDrawingManager for drawing server side events like Ra… (#892)
* add basis for debug drawing raycasts

* rays

* this was too much work

* i assumed you could do string object stuff. you cant.

* fixed a crash

* Greatly improved DebugDrawingManager code with a struct and list as opposed to dictionary

* change default ray debug color from green to magenta

* reviewed changes

* reviewed changes and adds network message to physicsmanager so it works without much user config
2019-11-23 13:09:48 +01:00
Acruid
e82f969589 Adds missing using statement, Master compiles again. 2019-11-22 15:04:29 -08:00
DamianX
c67a1475f9 Added Color.TryFromHex (#900) 2019-11-22 19:50:58 +01:00
Pieter-Jan Briers
1353dde41d Implement shader instances and uniforms. 2019-11-22 17:55:39 +01:00
Pieter-Jan Briers
a9ce50a6a5 Invert icon cutout.
This fixes the ugly border around the exported png.
2019-11-22 12:53:09 +01:00
ShadowCommander
134141feaf Implement SpawnRepeating (#898)
* Implement SpawnRepeating

Allows repeating timer events to be used.

* Update doc comments
2019-11-21 23:21:14 +01:00
DamianX
844e9776f3 Public YamlMappingFix (#897) 2019-11-21 20:27:19 +01:00
Ephememory
cbe2fe698a Fix window width/height being equal to 0 equal game crash (#896)
* Fix window width/height being equal to 0 equal game crash

* suggested changes
2019-11-18 19:11:55 -08:00
Pieter-Jan Briers
da440bbf28 Use new logo 2019-11-18 00:51:07 +01:00
Pieter-Jan Briers
5025178203 Very shitty allocation rate tracker. 2019-11-17 22:31:21 +01:00
ShadowCommander
1493f67c94 Add to OptionButton and SpinBox (#893)
* Add prefix to OptionButton

* Add validation to SpinBox
2019-11-17 18:38:56 +01:00
Pieter-Jan Briers
07b0548532 Input monitor. 2019-11-17 17:28:20 +01:00
bgare89
d3e7e12adf Code smell for loop braces (#884)
* Use curly braces or indentation to denote the code conditionally executed by this 'for'

* 7 less code smells.
2019-11-13 22:42:27 +01:00
Pieter-Jan Briers
89f6a0917a I'm bad at coding 2019-11-12 19:36:59 +01:00
Pieter-Jan Briers
a3879b7bbd Remove outline shaders from engine 2019-11-12 18:47:39 +01:00
Pieter-Jan Briers
64112c556e Work to make the client launchable by launcher. 2019-11-11 08:36:13 +01:00
bgare89
a7abfcdf0f CodeSmell: The variable 'e' is declared but never used (#883) 2019-11-10 16:39:14 +01:00
Pieter-Jan Briers
344325c9a4 Enable status always, add connection redirect address to status under /info. 2019-11-09 13:21:23 +01:00
Víctor Aguilera Puerto
ffe506ef94 Adds Midi playback, Midi input, etc. (#873)
* raw PCM audio for clyde

* Remove soundfont.cs

* Midi stuff

* Some more work

* This actually works now!

* update

* Add nfluidsynth submodule.

* fuck

* Midi audio works!

* Lots of stuff, and cool interfaces for items

* Update

* Note limit

* Moving out of range of UI raises OnClosed now as well

* It just works

* Update nfluidsynth submodule

* Remove managed-midi, remove unused methods I added to clyde

* Remove remnants of older NFluidsynth

* Update nfluidsynth submodule.

* Fix some of MidiManager

* Add changes PJB made to soundfont loading

* Delete OpenAL source/buffers when disposed

* Remove remnants of "Rendering"

* Use ReadOnlySpan, make interface/implementation arguments consistent

* Improve EmptyBuffers performance

* Make renderers use an enum for their status

* MidiRenderer events are now invoked on the main thread

* MidiManager now has a method to dispose renderers

* Lock player

* Fun stuff

* Update nfluidsynth submodule.

* Fix midi audio rendering

* Address a few reviews

* Revert changes made to Clyde

* Create sfloader per midi renderer

* Midi file size check

* Now OpenMidi/OpenInput and their respective close methods return bools.

* Update nfluidsynth submodule.

* Move number to constant.

* Use BufferedAudioSource

* Remove unused using statements

* Use new API

* Lock player and synth correctly

* Use midi sawmill

* Adds "Disposed" property to MidiRenderer

* Remove DisposeRenderer, let midi render thread handle it instead

* Renderer position is updated from main loop

* Use nfluidsynth from nuget

* Fix appveyor, lazy fluidsynth init

* Only join MidiThread if it actually exists...
2019-10-30 16:45:11 +01:00
moneyl
b105ef3e7b Add way to check permissions client-side (#880)
Added IClientConGroupController and implemented it as ClientConGroupController. Lets client-side code check what commands the client can use based on their console group. Serves the same purpose as the server-side IConGroupController except it doesn't load a list of permissions from groups.yml. Instead,  the server ConGroupController sends updated permissions to clients whenever they change.
2019-10-25 12:00:32 +02:00
Pieter-Jan Briers
a7d7fdd12b Fix crash apparently. 2019-10-22 18:55:12 +02:00
Pieter-Jan Briers
86be98005c Some engine optimizations. 2019-10-22 18:05:08 +02:00
DamianX
6e621f6398 Scrollbars properly handle clicks (#881) 2019-10-20 01:45:31 +02:00
Pieter-Jan Briers
5c550888f6 Fix DefaultSeparation in BoxContainer being hardcoded. 2019-10-20 01:36:04 +02:00
Pieter-Jan Briers
bc6a0f4578 Server no longer logs a warning if config file is missing.
server_config.toml should eventually be removed from the repo since defaults should be in-code.
2019-10-20 01:27:33 +02:00
Pieter-Jan Briers
e2fcf919c5 Fix changing minsize not updating controls outside containers. 2019-10-20 01:16:56 +02:00
Pieter-Jan Briers
3f1c33fc96 Implement radio buttons. 2019-10-20 00:50:35 +02:00
Pieter-Jan Briers
0494d59a5a Fix GridContainer minimum size calculation. 2019-10-19 02:13:58 +02:00
Pieter-Jan Briers
5b35e1b016 Make vv command able to vv hovered GUI control. 2019-10-19 02:13:13 +02:00
Pieter-Jan Briers
d092a63b28 Adds debug panel to show Clyde info & stats. 2019-10-18 14:28:54 +02:00
Acruid
182c4fb5dc Fix integration tests. 2019-10-17 20:55:52 -07:00
Pieter-Jan Briers
631ff903b4 Implement tiling textures in StyleBoxTexture. 2019-10-18 01:05:36 +02:00
Pieter-Jan Briers
e3d28423c5 Add some helpers for working with style sheets. 2019-10-18 01:05:36 +02:00
Pieter-Jan Briers
64b33439e5 Fix disposed controls getting deferred updates ran. 2019-10-18 01:05:36 +02:00
Pieter-Jan Briers
bf7c49041f Fix UriOpener on .NET Core. 2019-10-18 01:05:35 +02:00
Pieter-Jan Briers
68db826e8e Add + (float, float, float, float) operators to UIBox2.
Extremely convenient to work with.
2019-10-18 01:05:35 +02:00
Pieter-Jan Briers
e519b6b53d Delete some dead code. (#876)
Mostly utility classes and ancient legacy.
2019-10-17 01:52:58 +02:00
Víctor Aguilera Puerto
0a976b5438 Add BufferedAudioSource to Clyde.Audio (#877)
* Add BufferedAudioSource

* Address reviews

* Address reviews 2: Span boogaloo

* Update EmptyBuffers to use new API.

* Only map needed handles

* Delete buffers on dispose.
2019-10-17 01:52:23 +02:00
Pieter-Jan Briers
cd7a4f0b15 Clean up styleboxes and add support for padding. 2019-10-15 13:11:33 +02:00
Pieter-Jan Briers
30fff3fba5 Fix config file loading on server. 2019-10-15 13:10:51 +02:00
Pieter-Jan Briers
9d4dec2ea7 Fix SnapGridComponent not correctly cleaning up when moved between grids. 2019-10-14 17:09:28 +02:00
Pieter-Jan Briers
6e2458f708 Sort ListCommand output. 2019-10-14 14:50:05 +02:00
Pieter-Jan Briers
5c64190733 Don't use ReadOnlySpan<char> yet. 2019-10-13 23:40:41 +02:00
Pieter-Jan Briers
44ada991f2 Fix plural bugs in LocalizationManager. 2019-10-13 22:48:13 +02:00
Pieter-Jan Briers
5e37c7a746 Add BBCode-like markup parser for FormattedMessage. 2019-10-13 22:47:51 +02:00
Pieter-Jan Briers
08c4ef1ccf Fixes entity prototypes not inheriting description. 2019-10-13 17:08:27 +02:00
Pieter-Jan Briers
baf85f6ab2 Uninitialized maps are treated as paused. 2019-10-13 16:25:51 +02:00
Pieter-Jan Briers
72402f3983 Cull entity, light & chunk rendering. 2019-10-13 15:23:20 +02:00
Pieter-Jan Briers
5252b1e99b Add some extra helpers to Box2. 2019-10-13 15:22:47 +02:00
Pieter-Jan Briers
896b664590 Make ItemList ScrollFollowing default to false. 2019-10-13 01:27:14 +02:00
Pieter-Jan Briers
381efbd857 Any focusing input drops current mouse focus. 2019-10-13 01:27:04 +02:00
Pieter-Jan Briers
be2904ca17 Fix Scrollbar and ItemList while placement is active. 2019-10-12 23:27:28 +02:00
Pieter-Jan Briers
414177973d Fix SS14Window handling with UI Scaling applied. 2019-10-10 17:23:36 +02:00
Pieter-Jan Briers
8aaacce195 Fix TextureRect and TextureButton UI scaling.
Thanks to nirnael for helping me investigate this and getting me to do it.
2019-10-10 17:14:00 +02:00
Pieter-Jan Briers
6ecd86b9af Fancy animation for debug console opening. 2019-10-10 16:18:57 +02:00
Pieter-Jan Briers
324770630d Reduce speed of scrollbar animation.
Makes it way easier to track for me.
2019-10-10 16:17:27 +02:00
Pieter-Jan Briers
78ebf99296 Fix a compiler warning. 2019-10-10 15:48:00 +02:00
Pieter-Jan Briers
ac254c3eac Add TypeHelpers.GetAllNestedTypes 2019-10-10 12:14:58 +02:00
moneyl
9d8d712aea Make IConGroupController and ConGroupIndex public so they can be used in content (#875)
By making these public they can now be used by content to check if players are in the right group (admin, mod, etc) before doing certain things. Required for PR 380 on content (https://github.com/space-wizards/space-station-14/pull/380)
2019-10-09 23:39:11 +02:00
Pieter-Jan Briers
dc2c139692 Actually run MarshalHelper_Test. 2019-10-08 00:50:51 +02:00
Pieter-Jan Briers
6fdb09aa06 Show collections count in memory debug. 2019-10-08 00:50:20 +02:00
Pieter-Jan Briers
ce44aa0060 Make ResourceManager thread safe. 2019-10-06 23:14:28 +02:00
Pieter-Jan Briers
5baf2678c3 Update NetSerializer to latest version. 2019-10-05 15:37:48 +02:00
Pieter-Jan Briers
650b93ce37 Fix PlayerStatusChanged old value being the new value. 2019-10-02 10:44:31 +02:00
Pieter-Jan Briers
9f20366c43 Adds IEntity.EnsureComponent extension methods. 2019-09-25 00:25:59 +02:00
Pieter-Jan Briers
333801b1c9 TypeEntityQuery improvements.
Added TypeEntityQuery<T> which requires T : IComponent
Added an assert to TypeEntityQuery so the type must inherit IComponent.
2019-09-25 00:25:23 +02:00
Pieter-Jan Briers
7067c120ed Mark PrototypeAttribute as MeansImplicitUse. 2019-09-24 23:07:14 +02:00
Pieter-Jan Briers
9868f186f3 Remove some unecessary NuGet dependencies. (#871)
Also made the window icon work again.
2019-09-24 12:42:59 +02:00
moneyl
56f566af7b Add support for OnMouseEntered and OnMouseExited actions to Cont… (#870)
Allows adding custom hover & mouse enter/exit behavior to a control without creating a derived class for control or modifying an existing one.
2019-09-22 18:04:27 +02:00
DamianX
437fd04e87 AnimationTrackSpriteFlick ignores missing RSI states (#869)
* AnimationTrackSpriteFlick ignores missing RSI states

* changed the thing
2019-09-21 23:19:56 +02:00
Acruid
72f7310890 Entities without a prototype were causing an exception in the MetaDataComponent networking. 2019-09-20 13:15:59 -07:00
DamianX
7dde058319 Removed debug message from ItemList (#868) 2019-09-19 16:53:20 -07:00
Acruid
55a50ff7ba Setting the Component.Running property now calls the Startup/Shutdown methods automatically. Startup/Shutdown are now protected. This makes the system more foolproof, previously if the component did not call the base method inside Startup/Shutdown, everything would break. This also allows a component to be started/stopped from the VV system by simply setting the property. 2019-09-18 11:24:15 -07:00
Acruid
1da37d24ae Removes the old obsolete input system where the state system directly handles input. Everything is using the InputManager/InputSystem now. 2019-09-17 16:24:10 -07:00
Acruid
81641f49dc Command handlers now return a boolean signaling if the command was "handled" or not. This allows clientside handlers to intercept input commands and optionally handle them before they are sent to the server. Previously, registering a clientside handler would completely block the input command from being sent to the server. 2019-09-17 16:04:26 -07:00
Pieter-Jan Briers
5d5b897a9b Property animations track (#867)
* WiP property animations system

* Use better lerp for Angle property animations.

* Fix handling of offset in sprite component.

* Allow animating some sprite layer properties.

* Allow animating some Transform properties.

Obviously not advisable for server entities, but great for client side entities!

* Improve animation property interpolation handling.

Added a "previous" mode.
Made values that cannot be sanely interpolated fall back to this mode.

* Improve some animation docs.
2019-09-17 22:57:12 +02:00
Pieter-Jan Briers
65a8d33d0c Optimize YamlHelpers to avoid allocations by using a thread local. 2019-09-17 15:38:03 +02:00
Pieter-Jan Briers
b397a43845 Implement light masks. 2019-09-17 15:24:14 +02:00
Pieter-Jan Briers
2651a3db56 Texture loading improvements.
Can load non-sRGB Gray8 images.
Allow disabling sRGB on textures.
2019-09-17 15:24:13 +02:00
Acruid
2fc636b7b9 The YamlSerializer now properly checks that the type is an enum. Previously it checked if the typed equaled Enum, which isn't the same thing and is always false. 2019-09-16 16:26:33 -07:00
Acruid
fd47179d79 The intention was to delete the key, not set it to null. Previously if ContainerManagerComponent.ForceRemove was called multiple times with a Deleted container, it would throw a NullRefException. 2019-09-16 16:24:47 -07:00
Acruid
6ed7684954 Reverts 00f982cb89.
Reverts b40413dfd6.
Decorates EntityPrototype.Name with CanBeNull.
The entity spawn window now properly handles prototypes with null names. Previously, a null name would throw a NullException. Entities with null names will never show up in the spawn window search results.
2019-09-16 13:08:59 -07:00
Acruid
b40413dfd6 Fixes issue with prototype parent's name not being deserialized properly. This fixes the failing unit test. 2019-09-16 12:17:26 -07:00
Pieter-Jan Briers
3d2228e64e Add a command to spawn entities client side. 2019-09-16 20:57:00 +02:00
Acruid
60fa8080c4 Properly implements the Concrete Type Tag system for serialization. 2019-09-16 11:13:09 -07:00
Acruid
11046f8068 Apply a work-around fix to a bug in the current version of YamlDotNet, where it would not serialize Tags on a mapping. 2019-09-16 11:08:37 -07:00
Acruid
8a61259c11 Renames the yaml key name for the BodyType on CollidableComponent so that it does not collide with the component type field. This previously caused deserialization to fail. 2019-09-16 11:06:33 -07:00
Acruid
7239e70294 When an item is inserted into a container, it's LocalPosition is set to (0,0). This causes the position of the contained entity to == the container's position. Entities are now spatially inside their containers. Previously, the local position was not set, so contained entities could be tens of meters away from their containers, preventing things like FindInSphere from working intuitively. 2019-09-15 14:47:09 -07:00
Pieter-Jan Briers
00f982cb89 Entity prototypes default to empty name instead of null 2019-09-15 20:15:07 +02:00
ShadowCommander
d08823322a Implemented SpinBox and added a filter to LineEdit (#866)
* Implemented SpinBox and added a filter to LineEdit

* Update SpinBox.cs

* Added requested changes and summaries
2019-09-15 20:07:28 +02:00
Víctor Aguilera Puerto
7fc99ee528 Improved ItemLists (#863)
* Improve ItemList

* Address reviews

* Items can only be at one ItemList at a time

* Nested Item class
2019-09-13 15:23:04 +02:00
DamianX
dc57178258 Added FirstOrDefault extension method (#865) 2019-09-11 23:11:12 +02:00
Pieter-Jan Briers
b87adb2294 Actually use SpriteComponent.Offset for rendering. 2019-09-11 20:02:54 +02:00
Acruid
e2c60871e9 ContainerManagerComponent now checks if the container is deleted before trying to remove an entity from it. Previously it would blindly call ForceRemove on a deleted container, causing a NullRefException.
Added some debug assertions to Container. These should help verify that a deleted container is not being accessed.
2019-09-09 12:22:32 -07:00
Acruid
c8ff91bf72 Entity Containers now raise a ContainerContentsModifiedMessage Component Message when their set of entities is modified.
Code cleanup in Container.cs
2019-09-09 10:37:10 -07:00
Pieter-Jan Briers
1108fd94ce Add Vector3 & 4 support to YamlObjectSerializer. 2019-09-09 16:20:33 +02:00
Pieter-Jan Briers
73a34fc53a Use DynamicMethod for dependency injection. (#864)
* Use DynamicMethod for dependency injection.

Should be way faster to initialize types and also have no allocation overhead

* Cleanup, don't make injectors for types without dependencies

* Fix Framework, maybe?

* Test the new system explicitly.
2019-09-09 01:43:22 +02:00
Pieter-Jan Briers
64ff64ea77 Add command to dump memory usage on server. 2019-09-08 21:06:41 +02:00
Pieter-Jan Briers
566ed9cbdc Fix EffectSystem timing.
The bug with effects dying in transit has since been fixed,
so proper timing can be re-added.
2019-09-06 22:42:14 +02:00
DamianX
782f36ee63 Create BoundUserInterfaces with DynamicTypeFactory (#862) 2019-09-06 15:05:37 +02:00
DamianX
f05f3eec3e Added PopupRoot to draw popup messages above UI windows (#861) 2019-09-06 10:04:17 +02:00
Acruid
240c9a2df0 Removes EyeComponent's reliance on TransformComponent.OnMove. Now is uses an EntitySystem that is ran every frame. (#860)
Refactored some functions off of Eye, removed the IEyeManager dependence from it.
2019-09-06 08:09:49 +02:00
Acruid
ea18d6983e If the current map an eye is on does not exist, fallback to the default eye's map. Previously Clyde would throw an exception, crashing the process. 2019-09-05 16:08:57 -07:00
Acruid
ebc7c1ab3f Removed the LocalPlayer.EntityMoved event. This was unused and has known issues. 2019-09-05 16:04:33 -07:00
Acruid
4d30d5af78 TransformComponent now properly rebuilds its matrices on startup. This resolves https://github.com/space-wizards/space-station-14/issues/224.
Fixed bug with ParentChangedMessage using the wrong entity in its OldEntity argument.
2019-09-05 16:00:41 -07:00
Acruid
dba0815585 When an entity is deleted, its children are now implicitly deleted as well. Previously, the children were orphaned onto the map. This resolves space-wizards/RobustToolbox/#855. 2019-09-04 11:44:27 -07:00
Acruid
5b3aaea5ec A null event handler delegate cannot be subscribed to an event type.
Resolved https://github.com/space-wizards/RobustToolbox/issues/575.
2019-09-03 13:36:52 -07:00
Acruid
58aac5ea2b Refactored the entity event handling spaghetti.
Renamed some of the code regions to better reflect what the functions were a part of.
2019-09-03 13:32:11 -07:00
Acruid
f2eb035ed8 Physics Shapes (#847)
* Adds a new IPhysicsShape object where you can define what collisions shape a PhysBody has.
AABB is now accessed through the PhysicsShape, so the BoundingBoxComponent is not required.

* Default PhysShape now copies the AABB of the BoundingBoxComponent.

* Fixed issue with serialization of PhysShapeAabbComp.

* Spatial queries now use ICollidableComponent instead of BoundingBoxComponent.
showbb now draws entities using the obsolete BoundingBoxComponent in Aqua.

* Renamed PhysShapeAabbComp to PhysShapeAabb.
Removed BoundingBoxComponent.

* Default CollidableComponent does not collide with anything now.

* Renamed ICollidable to IPhysBody.
Moved ICollidable to the Robust.Shared/Physics namespace.

* PhysShapes are now a collection of primitive shapes that contribute to the whole PhysBody.
ObjectSerializer.DataField can now deal with abstract types using YAML tags.

* Added LocalBounds property to ClickableComponent.
Added state to ClickableComponent.

* Added a Rectangle physics shape.

* ClickableComponent now actually checks that a click is inside its bounds.

* Reverted the addition of a try/catch around map loading. Any errors can propagate to the code trying to load the map again.
2019-09-03 22:06:50 +02:00
Pieter-Jan Briers
dccdbe743c Fix hitting ctrl-C crashing on Core. 2019-09-03 21:57:28 +02:00
Pieter-Jan Briers
5fee08e68b Fix NuGet mess again hopefully 2019-09-01 09:53:41 +02:00
Acruid
0477b58861 Removed IEntityNetworkManager.SendDirectedComponentNetworkMessage. The directed functionality was added to implementations of IEntityNetworkManager.SendComponentNetworkMessage (it already existed on server anyways). This resolves https://github.com/space-wizards/RobustToolbox/issues/717. 2019-08-31 20:25:13 -07:00
Acruid
c5c9f2dbd3 Move ClientChangedHandMsg to Content assembly. This Resolves https://github.com/space-wizards/RobustToolbox/issues/703. 2019-08-31 17:46:52 -07:00
Pieter-Jan Briers
1c059e2437 Fix client build for some people 2019-08-31 19:13:22 +02:00
Pieter-Jan Briers
94e1f90c97 Add console commands to force run the GC 2019-08-31 18:39:31 +02:00
Pieter-Jan Briers
daf0d1dd6c Fix memory leak with entity spawn window 2019-08-31 18:39:19 +02:00
Pieter-Jan Briers
f2ac151917 Scrolling so smooth it puts half the apps I use daily to shame. 2019-08-31 17:32:48 +02:00
Pieter-Jan Briers
5c445229d4 Fix build related to old OpenTK package. 2019-08-31 14:24:07 +02:00
Acruid
8765c67872 All entities are now allocated with a TransformComponent.
Prototypes will now use existing components, like transform, when loading an entity. Previously they blindly created new ones on the entity.
AddComponent now cannot overwrite a protected component, ie TransformComponent and MetaDataComponent. Entity caches these components, they cannot be changed.
Regular RemoveComponent functions are now not able to remove protected components.
2019-08-30 00:49:20 -07:00
Pieter-Jan Briers
c0b19dcca1 Hide property overrides in VV.
Fixes #857.
2019-08-30 09:38:02 +02:00
Pieter-Jan Briers
3d00d491c4 BoxContainer ignores invisible children for minsize calculations.
This is inline with what Godot does and it makes VV a hell of a lot compacter.
2019-08-30 08:53:13 +02:00
Víctor Aguilera Puerto
b421143463 Clear server VVTraitEnumerable cache on refresh (#856) 2019-08-30 05:59:49 +02:00
Pieter-Jan Briers
25f14ff1b6 Great that PrivateAssets stuff breaks .NET Core publishes. 2019-08-29 23:50:30 +02:00
Pieter-Jan Briers
0a5f9d4b0b Fix parallax gen being broken on Windows. 2019-08-29 23:08:33 +02:00
Pieter-Jan Briers
4cc30823a6 Fix build on .NET Framework. 2019-08-29 20:29:36 +02:00
Pieter-Jan Briers
e790e97a50 Fix some compiler warnings. 2019-08-29 16:59:52 +02:00
Pieter-Jan Briers
62f25669c7 Make it possible to VV containers. 2019-08-29 14:36:07 +02:00
Pieter-Jan Briers
814b686cb7 Explicitly dispose ImageSharp images. 2019-08-28 12:08:05 +02:00
Pieter-Jan Briers
d0ec77e804 Blit fonts manually to reduce created garbage. 2019-08-27 23:13:06 +02:00
Pieter-Jan Briers
eff7fa8408 Remove PrivateAssets rules from shared. 2019-08-27 23:11:01 +02:00
Pieter-Jan Briers
51989a8ccc Mark a bunch of packages as private assets.
This will prevent them being referenced in content, so stuff like OpenTK isn't "accessible" from Content.Client.
2019-08-27 22:51:31 +02:00
Pieter-Jan Briers
c16ef6ce77 Update all the NuGet packages. 2019-08-27 22:38:49 +02:00
Pieter-Jan Briers
2a08389235 Remove dependency on Smocks.ExtensionPackage.
It didn't support .NET Standard and it wasn't used anyways.
2019-08-27 22:34:32 +02:00
Pieter-Jan Briers
dd7159eec0 Update CommandLineParser. Refactor some code to make it work. 2019-08-27 21:47:15 +02:00
ShadowCommander
366d0ab2d5 Fixed LineEdit triggering when hovered but not selected (#854)
* Revert "Don't fire regular keybinds for controls under the mouse."

This reverts commit bb322e30ee.

* Fixed LineEdit triggering when hovered
2019-08-26 00:23:09 +02:00
DamianX
7dc32af73f DefaultColorsInverted ignores duplicates (#853) 2019-08-25 23:45:33 +02:00
DamianX
943b000950 Things for wires (#852)
* Things for wires

* Fixed things
2019-08-25 23:18:03 +02:00
Pieter-Jan Briers
bb322e30ee Don't fire regular keybinds for controls under the mouse. 2019-08-25 22:53:49 +02:00
ShadowCommander
117cf14e5c Add a check in OnContextChanged to fix some crashes and refactored BaseButton (#851)
* Add a check in OnContextChanged to fix some crashes

Fixes crashes due to double input like the Quit button in the Esc menu

* Changed BaseButton to only trigger on KeyBindDown and KeyBindUp on the same control
2019-08-25 13:13:07 +02:00
Pieter-Jan Briers
081ced42df Make fetching minimum size force style update if necessary. 2019-08-25 12:55:16 +02:00
Pieter-Jan Briers
3a9ccfe470 Fix more bad logging categories. 2019-08-25 12:55:16 +02:00
Acruid
19d7cd4455 ViewVariables can now edit Enums. The input field will accept either an enumeration label or a numerical value. 2019-08-22 13:43:00 -07:00
Pieter-Jan Briers
97d8f7d936 Remove code from EntityPrototype to change Entity container type. 2019-08-22 21:54:18 +02:00
Pieter-Jan Briers
6833ffd19f Fix build. 2019-08-22 20:16:47 +02:00
Pieter-Jan Briers
509497b784 Check that file paths are valid on all file systems.
Fix #525
2019-08-22 15:46:14 +02:00
Pieter-Jan Briers
d3b8a07350 Try to fix weird integration tests issues. 2019-08-22 10:21:36 +02:00
Pieter-Jan Briers
8291294aa1 Fix tests on .NET Core. 2019-08-21 23:39:52 +02:00
ShadowCommander
a8d6c294ab Input System Refactor (#840)
* Fixes right click menu stopping input

Removed a flag change when the modal stack was showing, which preventing the click from getting passed to the next function.

* Added parsing for mod2 and mod3 from Keybind YAML

* Fixes a crash on context change when a keybind is not defined in keybinds.yml

* Implemented ShowDebugConsole Hotkey

* Refactored input system

Refactored input system to run Key and Mouse input through the InputManager before doing stuff.

* Upgraded LineEdit and classes that use it. Fixed input while KeyboardFocused.

Upgraded LineEdit to use Keybinds.
Upgraded DebugConsole to use Keybinds.
Replaced all references to MouseDown, MouseUp, KeyDown, and KeyUp with KeyBindUp and KeyBindDown.
Moved UserInterfaceManager call from GameController.Input to InputManager event.
Stopped input going to simulation while a control has focus in UserInterfaceManager.

* Some fixes for input system

Fixed keybinds getting stuck when selecting a LineEdit.
Changed MenuBar to not error.
Fixed a few cases where LineEdit would eat input if you hovered over it and where mouse input got eaten when clicking in the world while a LineEdit was selected.

* Removed extra dependencies

* Added GUIBoundKeyEventArgs to ButtonEventArgs

* Fixes for input with LineEdit selected

Fixed multiple keybinds mapped to the same key not triggering.
Fixed keybind input not getting to LineEdit when hovering over a control.

* Implemented Key Repeat for LineEdit

* Fix for input on Robust.Lite Launcher

* Renames NonFocusKeybinds to EnableAllKeybinds

Renamed NonFocusKeybinds to EnableAllKeybinds and added comment to clarify usage

* Adds repeating keybinds

Used for TextBackspace, TextCursorLeft, and TextCursorRight
Reverts a change to LineEdit that implemented repeating keys
Adds some documentation comments
2019-08-21 17:13:48 +02:00
CatTheSystem
fc67c5069c Allowed multiple Pseudo Classes per element. (#846)
* Quick fix to flashlight radius

* SomethingAbout CSS Class

* Shitty update

* fuck

* Creativ!

* Last But not least

* Quick Change

* Fixed version

* Tiny fix

* Next Fix

* Another fix
2019-08-20 21:22:14 +02:00
DamianX
7f9f593989 Implemented RobustRandom (#845)
* Implemented RobustRandom

* Fixed RandomString
2019-08-16 21:43:59 +02:00
CatTheSystem
ff5334f446 Quick fix to flashlight radius (#844) 2019-08-15 09:52:54 +02:00
Pieter-Jan Briers
cb5f2ffae1 Refactor UI system. (#843)
* Refactor UI system.

Deferred updating is used for styling & layout. This fixes the awful time complexity of containers.
Removed SetDefaults and Initialize. They were a bad idea alright.

* Fix build on .NET Framework.
2019-08-14 22:03:51 +02:00
Pieter-Jan Briers
cdac0d5757 Correctly delete disposed audio sources on the main thread. 2019-08-14 10:48:54 +02:00
Pieter-Jan Briers
c727dbd07e Gets rid of some [SRV] loggings. 2019-08-14 10:32:23 +02:00
Pieter-Jan Briers
95f9126d12 Detect exception-loop softlocks and shut down server if it happens. 2019-08-13 23:51:54 +02:00
Pieter-Jan Briers
265a9abeb6 Metadata component can send component state with null prototype ID. 2019-08-13 23:21:42 +02:00
Pieter-Jan Briers
6e32588be7 Adds new placement alignment mode to place lights correctly. 2019-08-13 12:05:08 +02:00
Pieter-Jan Briers
71fd6d427c Fix prototype manager not compiling on .NET Framework. 2019-08-13 10:30:31 +02:00
Pieter-Jan Briers
aff2631f23 Make VV command not crash as easily. 2019-08-13 01:02:42 +02:00
Pieter-Jan Briers
3f01fb0879 More VV attributes for Control. 2019-08-13 00:55:56 +02:00
Pieter-Jan Briers
02ca521cc5 Adds useless version label to main menu. 2019-08-12 18:53:41 +02:00
Pieter-Jan Briers
468fbda539 Ensure stable sort in the entity rendering sort. 2019-08-12 18:46:34 +02:00
Pieter-Jan Briers
175085f32e Make prototype loader ignore unix hidden files. 2019-08-11 23:13:25 +02:00
Pieter-Jan Briers
96543421f2 Update help for monitor command. 2019-08-11 22:50:01 +02:00
Pieter-Jan Briers
10261a15b2 Fix flick animations. 2019-08-11 16:45:59 +02:00
Pieter-Jan Briers
11ac144ae1 Make component state type check an assert. 2019-08-11 01:38:25 +02:00
Pieter-Jan Briers
db6d9160e4 Remove LINQ usage from Entity.cs 2019-08-11 01:33:09 +02:00
Pieter-Jan Briers
896758e176 Make IEntity.GetAllComponents no longer return duplicates.
Remove the Instances method that did that instead.
2019-08-11 01:22:59 +02:00
Pieter-Jan Briers
768fed2421 Optimize Matrix3 Vector2 transforms. 2019-08-11 01:01:40 +02:00
Pieter-Jan Briers
98c1e43fe6 Optimize that color lerp more because I wanted to mess with SIMD. 2019-08-11 00:21:05 +02:00
Pieter-Jan Briers
7fce46ec44 Fix some issues Sonar caught. 2019-08-10 14:17:13 +02:00
Pieter-Jan Briers
b1b6e2dd5c Fix cache rules in .appveyor.yml. 2019-08-10 13:54:38 +02:00
Pieter-Jan Briers
9ea9f452ec Maybe fix AppVeyor? 2019-08-10 13:49:38 +02:00
Pieter-Jan Briers
d9968e2e62 Fix failing test harder. 2019-08-10 01:22:12 +02:00
Pieter-Jan Briers
5e2a1d889d Fix failing test. 2019-08-10 01:18:55 +02:00
Pieter-Jan Briers
72c4d56639 Remove a bunch of oldcode from FloatMath.
Did we need to store 256 KiB worth of inaccurate sin/cos lookup? Nah.
2019-08-08 00:41:03 +02:00
Pieter-Jan Briers
e7bf2d0ac9 Use MathF for sqrt in vector types. 2019-08-07 23:16:05 +02:00
Pieter-Jan Briers
daa13de9ed Did you know that working on two things at once can
cause you to forget to commit files?
2019-08-07 20:56:37 +02:00
Pieter-Jan Briers
8d0012223e Optimize sRGB conversions on .NET Core. 2019-08-07 15:47:49 +02:00
Pieter-Jan Briers
78416ad157 Refactor Color.InterpolateBetween to be faster and make more sense. 2019-08-07 14:52:14 +02:00
Pieter-Jan Briers
fc4e3be40a Replace SS14 noise dependency with FastNoise. 2019-08-07 14:51:23 +02:00
Pieter-Jan Briers
57fb38c04d Improve Random.NextFloat() to be faster. 2019-08-07 14:50:48 +02:00
Pieter-Jan Briers
5fd7f9a6d8 Re-add tile build overlay. 2019-08-06 13:50:23 +02:00
Acruid
096b7f6bca Removed TransformComponent.VisibleWhileParented.
Removed `TransformComponent.ParentChangedEventArgs`, this was dead code from the removed `TransformComponent.OnParentChanged` event.
2019-08-05 13:21:55 -07:00
Pieter-Jan Briers
6a331cfdf6 Re-organize OpenGL init so debug callback gets initialized earlier. 2019-08-05 15:58:58 +02:00
Pieter-Jan Briers
b6bc2e591b Very rough menu bar control. 2019-08-05 14:45:38 +02:00
DamianX
89726ebeec Fix missing semicolon (#839)
* Fix missing semicolon

* Fixed CopyToArray
2019-08-04 11:42:40 +02:00
Pieter-Jan Briers
0a41ef3c9a Unified those messy FrameEventArgs. 2019-08-04 01:08:44 +02:00
Pieter-Jan Briers
0e65843f39 Memory debug panel to show memory usage info. 2019-08-03 23:59:54 +02:00
Acruid
066f6b9443 Adds a Setup function to the AILogicProcessor that is called once when the processor is initialized. 2019-08-03 12:43:38 -07:00
Pieter-Jan Briers
be0c520455 Fix examine crash. 2019-08-03 15:20:45 +02:00
Pieter-Jan Briers
e62021cb92 Try to work around space-wizards/space-station-14#284 2019-08-03 15:07:43 +02:00
Pieter-Jan Briers
c0eca4f6c2 .NET Core support. 2019-08-02 02:07:03 +02:00
Pieter-Jan Briers
bcf60c404d More optimized ImageSharp blit. 2019-08-01 19:43:00 +02:00
Pieter-Jan Briers
6f201ccddc Renderer optimizations.
Nothing major, but it should be a bit faster now.
2019-08-01 02:14:03 +02:00
Pieter-Jan Briers
85a4375905 Various performance optimizations. 2019-08-01 00:10:20 +02:00
Pieter-Jan Briers
fa10e1c330 Automatic component registration attributes. 2019-07-31 15:00:33 +02:00
Pieter-Jan Briers
170b8717c1 Fix some compiler warnings. 2019-07-31 13:47:34 +02:00
Pieter-Jan Briers
effb731340 GameScreen: don't wipe StateRoot. 2019-07-31 13:43:10 +02:00
Pieter-Jan Briers
7e08c5d743 Only load prototypes from .yml files.
I had some .directory files that were being loaded. This fixes that.
2019-07-31 13:16:35 +02:00
Pieter-Jan Briers
0e31193e7f Improve rich text system.
Improved word wrapping to reduce edge cases.
Allowed setting a "maximum" size for rich text label.
2019-07-30 23:10:03 +02:00
Pieter-Jan Briers
97c8297ce1 Noise generator improvements:
Added method to generate 1D noise.
Made all the methods take in doubles.
  They already converted to it anyways.
2019-07-30 18:49:56 +02:00
Pieter-Jan Briers
120cab811f Implement tuple -> vector conversions for double vectors. 2019-07-30 18:48:05 +02:00
Pieter-Jan Briers
d7e5c12a3d Make FpsCounter internal so it gets out of my face. 2019-07-30 13:55:58 +02:00
Pieter-Jan Briers
4eb4e47975 Remove unused SpeechBubble.cs 2019-07-30 13:50:27 +02:00
Pieter-Jan Briers
3d0d999f25 Remove ControlWrapAttribute. 2019-07-30 13:46:33 +02:00
Pieter-Jan Briers
7e13447455 Remove Godot scene instantiation. 2019-07-30 13:39:56 +02:00
Pieter-Jan Briers
fdfbf92223 Remove a ton of lighting system cruft.
Basically just kills the light manager.
Clyde was already using the ECS anyways.
2019-07-30 13:31:05 +02:00
Pieter-Jan Briers
9290ab445a Fix Stylesheet tests. 2019-07-30 13:02:40 +02:00
Acruid
51bbc7e565 Removed obsolete TransformComponent.OnParentChanged event. Use the component or entity system message for this event. 2019-07-29 16:16:55 -07:00
Pieter-Jan Briers
be379b2e20 Remove a bunch of cruft from the engine.
Unused textures & fonts, really.
2019-07-30 00:56:51 +02:00
Pieter-Jan Briers
6d377ee1e3 Robust Lite, also known as "Qt was too hard to distribute". 2019-07-29 23:08:50 +02:00
Pieter-Jan Briers
a1d899ee31 Updating control size flags now notifies parent container. 2019-07-29 23:08:49 +02:00
Pieter-Jan Briers
39a2c9db86 Fix parenting a control not correctly setting its layout. 2019-07-29 23:08:49 +02:00
Pieter-Jan Briers
66999a4a5d Extract user data dir locating to a helper class. 2019-07-29 23:08:49 +02:00
Pieter-Jan Briers
2d30eb0321 Adds way to open URIs in the user's browser. 2019-07-29 23:08:49 +02:00
Acruid
b26a370504 You can now call IoCManager.Clear() regardless of the container being instantiated for your thread. Previously you would get a null exception. Now the function does nothing (as expected) if the container does not exist. 2019-07-29 11:39:42 -07:00
Acruid
30cafea218 Adds a debug net graph to the game state system. 2019-07-29 11:25:20 -07:00
Pieter-Jan Briers
d9297fa1c9 Add [ViewVariables] to PlayerData. 2019-07-26 23:37:26 +02:00
Pieter-Jan Briers
9355938f6a Don't try to send unserializable value types over the wire with VV. 2019-07-26 23:36:24 +02:00
Pieter-Jan Briers
c5ef7fd134 Fix VV crash when viewing empty enumerable. 2019-07-26 22:56:37 +02:00
Pieter-Jan Briers
112b694099 Better error feedback on VV command. 2019-07-26 18:39:00 +02:00
Pieter-Jan Briers
e0512a1052 Use RemoveAllChildren() in GameScreen switch. 2019-07-26 17:55:30 +02:00
Pieter-Jan Briers
ed56c39e1b Add more parent/child helpers to Control. 2019-07-26 17:55:06 +02:00
Pieter-Jan Briers
117fcf2aa2 Make entity spawn window text more in line with the tile spawn window. 2019-07-26 17:54:10 +02:00
Pieter-Jan Briers
4fd24e8de9 Optimize UI system somewhat.
Especially styling should be significantly faster now.
2019-07-26 17:32:58 +02:00
Pieter-Jan Briers
a4f2441153 Adds SnapGridComponent.GetLocal() 2019-07-26 13:49:09 +02:00
Pieter-Jan Briers
e1f2742c8f Optimize RSI loading significantly. 2019-07-26 12:21:50 +02:00
Pieter-Jan Briers
6f26f77ce6 Add efficient ImageSharp blitting method. 2019-07-26 12:20:59 +02:00
Pieter-Jan Briers
da1baba550 Add cast from Vector2u to Vector2i. 2019-07-26 12:20:34 +02:00
Pieter-Jan Briers
dd53239554 Change to new freetype build.
This hopefully fixes #835
2019-07-25 14:03:40 +02:00
Pieter-Jan Briers
25f9ba5ec2 Remove debug drawing of rotated rect. 2019-07-25 14:03:40 +02:00
Acruid
ed97cbb42d The *World functions on TransformComponent now properly account for the grid world location. This fixes entities being drawn around the world origin when they touch a grid that isn't at 0,0 in the world. 2019-07-24 10:29:40 -07:00
Pieter-Jan Briers
78bbac52f0 Fix entity spawn erase mode. 2019-07-24 16:10:12 +02:00
Pieter-Jan Briers
83c738e423 Correctly handle fractional scrolling coming in from OpenTK. 2019-07-24 09:31:16 +02:00
Pieter-Jan Briers
b0a8e3923b Give bad username feedback before attempting connection. 2019-07-24 00:40:49 +02:00
Pieter-Jan Briers
311bd2b874 Fix UIManager popups. 2019-07-24 00:27:51 +02:00
Pieter-Jan Briers
59caaeca8c Better feedback for why usernames are invalid. 2019-07-24 00:27:21 +02:00
Pieter-Jan Briers
832be75c5c Fix UITest command. 2019-07-24 00:27:09 +02:00
Pieter-Jan Briers
08e214b3d2 Add SS14Window.OpenCenteredMinSize 2019-07-24 00:27:03 +02:00
Pieter-Jan Briers
f75ee08030 Add some separators to the main menu to make grouping easier. 2019-07-23 23:28:52 +02:00
Pieter-Jan Briers
cd9aed6696 Less ugly debug console color. 2019-07-23 23:14:36 +02:00
Pieter-Jan Briers
040dc2445c Use new IDynamicTypeFactory extension method. 2019-07-23 21:34:13 +02:00
Pieter-Jan Briers
414bd95eb2 DynamicTypeFactory improvements:
Can now make instances with constructor arguments.
Adds some helpers.
2019-07-23 21:08:01 +02:00
Pieter-Jan Briers
17424cc3f3 TextureButton can now be scaled. 2019-07-23 19:44:24 +02:00
Pieter-Jan Briers
795af9d0f4 Fix precise scrolling. 2019-07-23 19:43:03 +02:00
Acruid
91d0936a99 Eye now uses MapCoordinates instead of Grid Coordinates when building the view matrix. This fixes the bug where the view offsets from the map origin when the player touches a grid in the world that isn't positioned at the origin. 2019-07-20 14:07:38 -07:00
Acruid
89ff434528 Fixes ScreenToWorld entity picking. Now when you mouse over a grid it does not pick entities at the map origin. 2019-07-20 12:47:09 -07:00
Acruid
8c46c06497 Setting the world position of a Transform now properly sets the grid index. 2019-07-20 12:37:46 -07:00
Acruid
04c95d4ff8 Fixes a bug where the VV window did not open. 2019-07-20 12:18:45 -07:00
Pieter-Jan Briers
ecb641f403 Allow scaling SpriteView. 2019-07-20 15:49:44 +02:00
Pieter-Jan Briers
e10e7d165a Make outlines less ugly. 2019-07-20 15:49:11 +02:00
Pieter-Jan Briers
03edfc46cb Actually apply fullscreen preference on client restart. 2019-07-19 23:59:49 +02:00
Pieter-Jan Briers
13ad6f3f37 Show a warning in the main menu on old OpenGL versions. 2019-07-19 23:57:41 +02:00
Pieter-Jan Briers
8ec83a7654 Allow Clyde to draw rotated boxes. 2019-07-19 22:12:33 +02:00
Acruid
de68a62187 Box2Rotated & Vector2 Rotation (#827)
* Adds a function to rotate a vector by an Angle.
Adds the Box2Rotated struct for holding a rotated box.

* Use ApproxEqualityConstraint
2019-07-19 21:48:40 +02:00
Pieter-Jan Briers
95197075a5 Prune dead NetIDs. 2019-07-19 16:35:14 +02:00
Pieter-Jan Briers
167aa4791b Remove instance of Visibility = false for windows. 2019-07-19 16:08:19 +02:00
Pieter-Jan Briers
f38eb13866 Make opening a window twice not crash. 2019-07-19 16:07:01 +02:00
Pieter-Jan Briers
0c1c6cee0e Generate basic cyrillic for font atlasses. 2019-07-19 14:13:37 +02:00
Pieter-Jan Briers
c8a28b8c83 Allow using C# Object Initializers for Controls layout.
It's far from a good declarative syntax, but better than before.
2019-07-19 12:38:54 +02:00
Pieter-Jan Briers
81b521a8e4 Re-organize entity spawn window. 2019-07-19 12:07:58 +02:00
Pieter-Jan Briers
441980e1cb Remove spawnwindow command. 2019-07-19 12:07:41 +02:00
Pieter-Jan Briers
8f976ce810 Window titles left aligned, text clipping if necessary. 2019-07-19 11:31:04 +02:00
Pieter-Jan Briers
c2e8ee0fcd Change default rich text entry color to 200,200,200.
Less blinding white in the tutorial.
2019-07-19 10:55:43 +02:00
Pieter-Jan Briers
8d2ea9aed1 Remove SS14Window.AddToScreen and related systems. 2019-07-18 22:48:51 +02:00
Pieter-Jan Briers
31ca502418 Less fragile kdialog detection. 2019-07-17 14:03:13 +02:00
Pieter-Jan Briers
7318247da2 Do not attempt to open file dialogs on headless 2019-07-17 14:00:54 +02:00
Pieter-Jan Briers
bed9a082bc Probably fix AppVeyor. 2019-07-17 13:56:01 +02:00
Pieter-Jan Briers
5694f4ff28 Actually use sprite layer colors.
They were previously ignored.
2019-07-17 00:35:29 +02:00
Pieter-Jan Briers
0865398fe1 Never trust me to actually commit files. 2019-07-14 08:54:14 +02:00
Pieter-Jan Briers
fb2feee93b Finish file dialog support.
Implemented automatic download of swnfd.
Made swnfd run synchronously on macOS to prevent issues.
2019-07-14 08:53:00 +02:00
Pieter-Jan Briers
093481cb77 Better documentation for FileDialogManager. 2019-07-13 22:05:34 +02:00
Pieter-Jan Briers
60f46afddd Tooltips do not block the mouse. 2019-07-13 22:03:38 +02:00
Pieter-Jan Briers
c504e58226 Remove a bunch of cruft from RobustUnitTest. 2019-07-13 21:55:47 +02:00
Pieter-Jan Briers
4cb9bd3332 Deduplicate IoC init. 2019-07-13 21:51:57 +02:00
Pieter-Jan Briers
f2cdb0d68c File dialog API.
Only works on KDE Linux right now until I compile the natives.
I'll ship libswnfd when I got it compiled for all platforms.
2019-07-13 17:54:21 +02:00
Pieter-Jan Briers
e3720ebe01 Implement MinSize for TextureButton 2019-07-13 14:49:46 +02:00
Pieter-Jan Briers
5d07887251 TextureRect can now be scaled. 2019-07-12 19:11:43 +02:00
Pieter-Jan Briers
ed340f7df9 Optimize the code to reduce a ton of allocations. 2019-07-11 14:51:20 +02:00
Pieter-Jan Briers
0de8615033 Document some GUI controls. 2019-07-08 23:02:59 +02:00
Pieter-Jan Briers
091c1b935b Implement GrowDirection on controls. 2019-07-08 21:00:28 +02:00
Pieter-Jan Briers
04b14e92e7 Fix #265 2019-07-08 16:45:08 +02:00
Pieter-Jan Briers
e6c4cbb662 Make placement respect map init. 2019-07-08 13:46:14 +02:00
Pieter-Jan Briers
1b57d4ec0b Remove TrySpawn* entity methods. (#833) 2019-07-07 22:24:21 +02:00
Pieter-Jan Briers
2a6696f7e3 Make outline corners smoother. 2019-07-06 22:38:58 +02:00
Pieter-Jan Briers
981bbc61ee Re-implement hollow rectangle drawing.
I missed a TODO.
2019-07-06 22:37:58 +02:00
Pieter-Jan Briers
78c393aac5 Fix Travis 2019-07-06 19:19:37 +02:00
Pieter-Jan Briers
09c36b57cd Shift half of Clyde around to implement better outline rendering. (#830)
* Attempted Clyde cleanup, didn't get far.

* Add negation operator to Vector2i.

* Add RenderOrder to ISpriteComponent.

* Post process shaders.

Adds "post process" shaders to sprite component.
These are executed on the WHOLE sprite component (every layer)
in one draw.

This is necessary to implement functional outlines.
2019-07-06 19:17:33 +02:00
Pieter-Jan Briers
a8be3a2844 Delete dead closewindow.png 2019-06-29 19:55:17 +02:00
Pieter-Jan Briers
4ae2f6b667 Helping content get AppVeyor 2019-06-29 16:55:53 +02:00
Pieter-Jan Briers
eb683e1838 Damnit Rider. 2019-06-29 01:56:56 +02:00
ZNixian
222e19ddc4 Add support for diagonal RSI sprites (#828) 2019-06-29 01:54:34 +02:00
Pieter-Jan Briers
ae42a3e3fa Integration testing improvements.
They no longer load system-wide config or user data.
User data is emulated through a VFS.

Also added more hooks to improve the customizability of the test,
for example allowing content to hijack their IoC registrations.
2019-06-29 01:51:40 +02:00
Pieter-Jan Briers
9a4c1cae1e Networked integration tests work. 2019-06-28 16:03:58 +02:00
Pieter-Jan Briers
67f433aeb2 Maybe fix loading on Windows 2019-06-23 11:29:17 +02:00
Pieter-Jan Briers
413680b602 Try to figure out why the launcher doesn't work with better logs. 2019-06-23 11:08:18 +02:00
Pieter-Jan Briers
822e6b7f6d Clean up signal handling and make it work on the client. 2019-06-05 12:12:10 +02:00
Pieter-Jan Briers
d3a67107bb Fix Join Public Server button. 2019-06-05 11:12:58 +02:00
Pieter-Jan Briers
00995d6a30 Do not try to set server console title in non-interactive shells. 2019-06-04 23:25:28 +02:00
Pieter-Jan Briers
ef57a4f4c3 Improve QoL of integration test API, document it. 2019-06-04 23:25:08 +02:00
Pieter-Jan Briers
1c2caca7e1 Fix dependency copy. 2019-06-04 19:07:49 +02:00
Pieter-Jan Briers
9115610d2f Integration testing v2 (#826)
* Rewrite Integration testing, add support for the client.

* Rewrite AssemblyLoader to not be static.

* Adds ability to post messages into thread.
2019-06-04 19:05:16 +02:00
Injazz
99c956dfb4 Circle Ranges (#825)
* Circle Range for Tiles

* fixes
2019-06-03 20:13:38 +02:00
Pieter-Jan Briers
6a1bed31ae Fix integration tests. 2019-06-02 20:15:28 +02:00
Pieter-Jan Briers
017a63f41c How the hell did I fail to commit this file. 2019-06-02 06:59:52 +02:00
Pieter-Jan Briers
5e872ec1e3 Implement animated RSI rendering for effects.
Fixes #822.
2019-06-02 01:14:14 +02:00
Pieter-Jan Briers
e314446575 Allow components to be created while iterating them. (#821)
This is necessary to avoid tons of papercuts with entity systems.
Without this it is not possible to create entities inside the update loop of an entity system, which is too common for me to disallow.

As for performance, I offset it by removing the LINQ usage.
It's marginally faster than before even.
2019-06-01 00:16:19 +02:00
Pieter-Jan Briers
58c7255087 Can now load wav PCM audio.
Clyde had the code for a while now but I didn't expose it because Godot
didn't either.
2019-06-01 00:13:34 +02:00
Pieter-Jan Briers
58ac8f0dba Log warning when using stereo audio positionally.
OpenAL doesn't support this so this should help avoid confusion.
2019-06-01 00:06:32 +02:00
Pieter-Jan Briers
e5024e80f4 Update Nett dependency. 2019-05-29 01:48:25 +02:00
Pieter-Jan Briers
00f6564351 Update some NuGet dependencies. 2019-05-29 01:45:31 +02:00
Pieter-Jan Briers
b32f695509 Make Sonar ignore Lidgren. 2019-05-29 01:18:36 +02:00
Pieter-Jan Briers
f74bf680e7 Add an assert to lighting rendering. 2019-05-29 01:11:45 +02:00
Pieter-Jan Briers
02802c0e70 Clip VV ToString() text to reduce some ridiculous cases. 2019-05-29 01:06:05 +02:00
Pieter-Jan Briers
300c2c05e4 Implement Label ClipText. 2019-05-29 01:05:43 +02:00
Pieter-Jan Briers
f9e192b01e Vertically center checkboxes. 2019-05-29 00:55:34 +02:00
Pieter-Jan Briers
7c6c8dcd41 Do not crash if client disconnects during initial handshake. 2019-05-28 20:59:39 +02:00
Pieter-Jan Briers
18c91e6be4 Fix bad copypaste with DebugPositions 2019-05-28 20:34:36 +02:00
moneyl
6a9a727e1f Add Control.SetOnlyStyleClass (#820)
This clears the collection of style classes and adds the new one. This allows controls to easily switch between several style classes without needing to keep track of the active one in their own code.
2019-05-28 20:32:32 +02:00
Pieter-Jan Briers
d7f5c1d9db Debug drawing to show exact entity positions. 2019-05-28 13:35:24 +02:00
Pieter-Jan Briers
97dfe3c216 Fix GetEntitiesInArc's using half range. 2019-05-28 13:35:09 +02:00
Pieter-Jan Briers
b65f108268 Load vsync from config on startup. 2019-05-28 01:59:27 +02:00
Pieter-Jan Briers
4892d0d0fa Fix some compiler warnings and remove dead code. 2019-05-28 00:30:18 +02:00
Pieter-Jan Briers
bb4a1eda8e Project file refactor (#819)
* Project file refactor

Move all the .csproj files to the new .NET Core style.
This doesn't make any difference for compiling for Framework,
but it does reduce a ton of useless boilerplate.

As an extension of this, killed a bunch of uncompiled & unmaintained .cs files.

Compiling for release (to profile) works now.
Removed AnyCPU targets from the solution file.

* Fix compiler warnings.
2019-05-28 00:16:01 +02:00
moneyl
110bd0921a Add StyleBox overrides to ProgressBar (#818)
* Add StyleBox overrides to ProgressBar

The overrides are StyleBoxFlat instead of StyleBox as StyleBox does not expose or possess a color property. _getBackground and _getForeground were also changed to return StyleBoxFlat instead of StyleBox to keep things simple.

* Change ProgressBar _getBackground and _getForeground back to StyleBox

* Change ProgressBar style box overrides from StyleBoxFlat to StyleBox
2019-05-25 01:41:39 +02:00
Acruid
61aba8fc50 Create Entities Without Prototypes (#815)
* Retrofitted ComponentManager_Test to use DependencyCollection.

* Renamed ComponentManager_Test to ComponentManager_Tests to follow naming conventions.

* Added component add/remove/delete events to IComponentManager.
Removed IEntity dependency from ComponentManager.

* Entities can now be spawned without a prototype.

* Removed unused function.

* CreateEntity now actually works with a null prototype ID. The other spawn functions should work as well.
Updated doc comments for IEntityManager.SpawnEntity().
2019-05-24 21:37:28 +02:00
Acruid
dc4cc71c72 Fixes game crashing because the player entity got deleted. (#814) 2019-05-24 17:03:13 +02:00
Acruid
322c706924 Allows you to use 0 (false) and 1 (true) as boolean arguments in the cvar concommand. (#817) 2019-05-24 16:59:17 +02:00
Acruid
8650143b8c ECS Events are now sent as reliable, and have their own category. (#816) 2019-05-24 16:57:45 +02:00
moneyl
b92ea9a2aa Remove GUI dependence on tscn files (#812)
* Remove unused options menu tscn

* Move SS14Window to pure C#

* Move SpriteView to pure C#

* Move EntitySpawnWindow and EntitySpawnItem to pure C#

* Removes using statements accidentally added by resharper

* Set EntitySpawnWindow default size to normal value

Note that in construction menu and storage menu this had to be done in the object initializer and didn't work if it was set in the Initialize function for the respective menus. For whatever reason setting it in the EntitySpawnWindow.Initialize works fine.
2019-05-24 16:57:13 +02:00
digitalis
1b38996905 Fixes incorrect null check in PredicateEntityQuery (#813) 2019-05-24 16:51:10 +02:00
Pieter-Jan Briers
e7a8e9b1aa Fix client side entity positions. (#811)
They were being interpolated to the origin.
2019-05-16 20:15:20 +02:00
Pieter-Jan Briers
a7d3b31ec4 Fix outline rendering. 2019-05-16 14:40:05 +02:00
Pieter-Jan Briers
10440648bc Remove IDisplayManager dependency from SS14Window 2019-05-16 14:27:51 +02:00
Pieter-Jan Briers
5226039b7c VV for PlayerManager. 2019-05-16 14:02:03 +02:00
Pieter-Jan Briers
3bad55a705 Move escape menu out of engine. 2019-05-14 15:19:27 +02:00
Pieter-Jan Briers
bb7288d26a ItemList only shows scrollbar when necessary. 2019-05-14 12:54:26 +02:00
Pieter-Jan Briers
b30c2155c7 Improve ItemList rendering to correctly handle margins. 2019-05-14 11:26:37 +02:00
Pieter-Jan Briers
70449b9ca2 Fix client not handling player state disconnects. 2019-05-14 11:25:36 +02:00
Pieter-Jan Briers
7323e454e4 Fix StyleBox.GetContentOffset(). 2019-05-14 11:18:26 +02:00
Pieter-Jan Briers
f7ccac2c11 Make Label align individual lines to center. 2019-05-14 01:19:01 +02:00
Pieter-Jan Briers
4d233ef6c2 Add [StringFormatMethod] to localization manager. 2019-05-14 00:22:52 +02:00
Pieter-Jan Briers
c10f7f2707 Document and clean up Control. 2019-05-13 19:06:57 +02:00
Pieter-Jan Briers
9db3473b7a Containers handle size flags better. 2019-05-13 14:51:50 +02:00
Pieter-Jan Briers
0b63dbd1f2 Move TileSpawnWindow to pure C#. 2019-05-13 09:15:03 +02:00
Pieter-Jan Briers
1403c14acb Fix MarginContainer layout. 2019-05-13 09:14:23 +02:00
Pieter-Jan Briers
ab8feee660 Add ItemList.ClearSelections() 2019-05-12 15:07:07 +02:00
Pieter-Jan Briers
e6417582c8 Fix OptionButton popup going under other controls. 2019-05-12 12:09:38 +02:00
Pieter-Jan Briers
977f51a9be Remove dead Godot references. 2019-05-12 11:56:10 +02:00
Pieter-Jan Briers
9977d64e2f Remove exception-catch tests from timers.
These tests were ensuring that exceptions were logged,
we decided these should bubble up instead.
2019-05-12 11:47:20 +02:00
Pieter-Jan Briers
2d6a529725 Make LocalizationManager fall back if not initialized.
This fixes unit tests.
2019-05-12 11:46:44 +02:00
Pieter-Jan Briers
ddbeccdb8c Some work supporting localization.
Far from complete, but a good start.
2019-05-11 23:59:48 +02:00
Pieter-Jan Briers
1fd6488362 Use Dns.GetHostEntryAsync.
I can't believe I missed this in the documentation.
2019-05-11 16:10:57 +02:00
Pieter-Jan Briers
f954bcb3e8 Switch to .NET Framework 4.7.2 2019-05-11 16:09:55 +02:00
Pieter-Jan Briers
17ebeac107 UI Scaling Support. (#809)
Not quite perfect, but quite usable.

Adds the ability to scale the UI. Scaling is controlled via a cvar,
and can be changed at runtime.
Fractional scaling is supported.

Some controls could be better (SpriteView, TextureRect),
but for now it's a good start.
2019-05-11 16:04:14 +02:00
Acruid
c4fb96b5e8 Tile Placement Improvements (#808)
* Tile Placement box actually uses the mouse snapgrid, not the players.

* Placement box only snaps to grids if cursor is over grid.
First tile of new grid is centered on cursor, instead of bottom left on cursor.

* Place square now sticks to the edge of a grid.
Cannot place tiles that would touch two grid Bounds.
2019-05-11 15:58:28 +02:00
Pieter-Jan Briers
2a9441a6da Remove redundant log. 2019-05-08 23:14:08 +02:00
Pieter-Jan Briers
55cf1c10a8 Do not catch async exceptions on debug.
Also renamed SS14SynchronizationContext to Robust*
2019-05-08 23:12:03 +02:00
Pieter-Jan Briers
967f144970 Do not catch timer timer exceptions on debug. 2019-05-08 23:11:38 +02:00
Pieter-Jan Briers
f548fd970e Do not catch Input exceptions in GameLoop on Debug. 2019-05-08 23:11:17 +02:00
Pieter-Jan Briers
5077b5ec4e Do not hide exceptions thrown in IoC service Dispose. 2019-05-08 22:59:45 +02:00
Pieter-Jan Briers
cd919302f8 Remove debug Console.WriteLine from SingleStreamLoader 2019-05-08 22:59:24 +02:00
Pieter-Jan Briers
f1c450e588 Make most tests parallel.
Now that IoC is thread local, this should be safe.
2019-05-08 22:33:46 +02:00
Pieter-Jan Briers
d6f288b667 Fix IoCManager_Test 2019-05-08 22:33:22 +02:00
Pieter-Jan Briers
6a9dac1b4e Fix GodotParserTest. 2019-05-08 22:33:15 +02:00
Pieter-Jan Briers
dec103ac1b Remove GameController.Mode
The difference between headless and Clyde is now handled by IoC.
2019-05-08 22:24:50 +02:00
Pieter-Jan Briers
d6a9343635 Make GameController created by IoC, remove GameControllerProxy. 2019-05-08 21:55:16 +02:00
Pieter-Jan Briers
dc6e186a26 Ensure Window Close does not fire from Dispose on Clyde. 2019-05-08 21:27:30 +02:00
Pieter-Jan Briers
4c02a2c059 Clean up GameController shutdown.
IoC is now cleared after the main loop finishes, not on Shutdown() call.
2019-05-08 21:27:02 +02:00
Pieter-Jan Briers
7d8ba30844 Don't include deleted components in GetAllComponents 2019-05-08 15:40:29 +02:00
Pieter-Jan Briers
1b4cbf58b8 Make all exceptions crash the game on debug. 2019-05-08 15:40:09 +02:00
Pieter-Jan Briers
6da21ab6c1 Clyde correct sRGB support.
This makes light stacking look less... awful.

Also minor cleanup.
2019-05-08 14:37:48 +02:00
Pieter-Jan Briers
0340cecd6d Clean up entity events some more. 2019-05-08 09:54:04 +02:00
Pieter-Jan Briers
878fade1bd Timers get cancellation support. 2019-05-08 09:48:57 +02:00
Pieter-Jan Briers
285f68b4dd Minor clean up of entity events. 2019-05-07 23:13:35 +02:00
Pieter-Jan Briers
afc2a747c8 Fix deleting entities that have containers. 2019-05-06 19:30:51 +02:00
Pieter-Jan Briers
3c9bcae474 Delete GodotWrapFont. 2019-05-06 16:44:34 +02:00
Pieter-Jan Briers
5c8986c075 Fix Texture.LoadFromImage not passing load params to Clyde. 2019-05-06 15:08:12 +02:00
Pieter-Jan Briers
454e5df939 Do not open tooltips for controls that have none. 2019-05-05 19:27:57 +02:00
Pieter-Jan Briers
c83ad3ab94 Map grid serialization fixes:
1. Actually makes grids stored row-major instead of column-major
2. Optimizations and cleanup.
2019-05-05 15:44:49 +02:00
Pieter-Jan Briers
1572d1fb3d Improve wording in the map format documentation file. 2019-05-05 15:44:11 +02:00
Pieter-Jan Briers
e032557c08 Fix Angle.Equals(object). 2019-05-05 15:43:59 +02:00
Pieter-Jan Briers
4979620486 Container improvements.
Make containers actually handle automatic removal of entities,
like say on unpartenting.
This was because a lot of content code was doing this manually,
and it broke, really badly.

They also emit events now that said content code can use instead.
2019-05-05 13:07:59 +02:00
Pieter-Jan Briers
3889066e9c Make parenting a transform to its current parent a no-op. 2019-05-05 13:05:31 +02:00
Pieter-Jan Briers
2c523115ab Fix compiler warning. 2019-05-05 11:48:51 +02:00
Pieter-Jan Briers
d62a6041ed Fix AppVeyor. 2019-05-05 11:26:14 +02:00
Pieter-Jan Briers
cde26f0567 Remove misc Godot references I missed. 2019-05-05 02:00:57 +02:00
Pieter-Jan Briers
cf2995437f Remove Godot support. (#805)
Let's be real, it's pretty damn broken already and will never be fixed.
2019-05-05 01:58:24 +02:00
Pieter-Jan Briers
296d39bee6 Make fonts use A8 textures.
Reduces VRAM usage.
2019-05-04 22:17:06 +02:00
Pieter-Jan Briers
772b680723 Render extended ASCII font glyphs. 2019-05-04 21:20:06 +02:00
Pieter-Jan Briers
e2c7a0086c Integration Testing Framework. (#804)
* Server works if not connected to a tty.

* Rich presence does not run IoC resolution at runtime anymore.

* Work towards integration tests.

Mostly work related to making it so the server and client can run in
parallel, and allowing more control over main loop for testing.

* Lots of code relating to integration tests.
2019-05-04 17:51:20 +02:00
Pieter-Jan Briers
6dc5b09005 Move escape menu over to C#, fix layout issues. 2019-05-04 17:51:01 +02:00
Pieter-Jan Briers
e538ca3879 Delete unused main menu scene files. 2019-05-04 17:50:47 +02:00
Pieter-Jan Briers
d621b1a611 Button default text align is centered.
This is in line with Godot's behavior.
2019-05-04 17:49:51 +02:00
Pieter-Jan Briers
130e8b7cf1 SS14Window now handles minsize correctly.
This means the root of it is now a container.
2019-05-03 17:12:01 +02:00
Pieter-Jan Briers
702f38e1fd Fix SplitContainer when constrained by minsize. 2019-05-03 17:11:13 +02:00
Pieter-Jan Briers
1a54d5f513 Load MarginContainer margins from tscn. 2019-05-03 17:10:50 +02:00
Acruid
39eeab14ea Disable Extrapolation (#803)
* Split GameState processing logic out of ClientGameStateManager into the new GameStateProcessor class.

* Adds a test fixture for GameStateProcessor with a basic use test.

* More unit tests and added Extrapolated property to GameStateProcessor.
2019-05-03 13:26:06 +02:00
Pieter-Jan Briers
ca97a46387 Fix headless client. 2019-04-29 13:13:09 +02:00
Pieter-Jan Briers
f4b0b69cbb Map Init & Map Loading improvements. (#801)
* MapInit v1, so people can criticize my code.

* Map init v1.

* Improve LocalPlayer to fix aghosting.

* Fix map saving.

* Map command improvements:

Implement loadbp
Made certain commands aware of uninitialized maps.

* Adds IMapManager.GetAllGrids()

* Add lsgrid and lsmap commands.

* MetaData component serialization fixes.

Serialize name and description default as null.
Don't serialize prototype.

* Explicit UID indices in map files.

* Update map format doc again.
2019-04-29 12:50:28 +02:00
Acruid
1b3cc8aba6 Grid Bounds (#800)
* Added centered unit box static field to Box2.

* MapGrid is more testable.

* Added some unit tests for MapGrid.
Fixed bug in MapChunk.GridTileToLocal().
MapGrid.UpdateAABB() actually expands properly now.

* Moved IMapChunk to Robust.Shared.Map.
Moved Chunk class out of MapManager class.

* Added unit tests for MapChunk.

* Bounds reduce by 1, so almost working.

* Now bound shrinking works :D

* Moved MapGrid out of MapManager.
Moved IMapGrid into the Shared/Map folder.
Replaced all calls to IMapGrid.ParentMap.Index with IMapGrid.ParentMapId.

* Added more MapGrid unit tests.
Fixed a bug in TryGetTileRef.
2019-04-29 12:43:20 +02:00
Acruid
d74151d242 Fixes ExposeData issue in MetaDataComponent. (#799) 2019-04-28 11:13:19 -07:00
Pieter-Jan Briers
0d00a6a659 Add Random.Prob extension method helper. 2019-04-27 21:16:30 +02:00
Pieter-Jan Briers
b2067da28f Remove dead folder reference from server csproj. 2019-04-26 16:08:33 +02:00
Pieter-Jan Briers
2d418eddf0 Prevent SpriteComponent spamming exceptions if RSI fails to load. 2019-04-26 15:48:22 +02:00
Acruid
5fe0bd6e55 EntityStates (#798)
* Added a new special MetaDataComponent to store entity data that isn't specific to a component.

* Adds ExposeData to MetaDataComponent.
Name of the entity now defaults to the prototype name.

* EntityStates changed so that the list of networked components is not sent every tick for a modified entity.

* Code cleanup & doc comments.

* MetaDataComponent Name and Description are taken from the prototype before storing them in the component.

* Adds the EntityState serializer benchmark. This isn't a test, but is really useful.

* Redesigned the logic in ServerGameStateManager.

* Adds MetaDataComponent registration to the UnitTesting project.
2019-04-26 15:38:56 +02:00
Víctor Aguilera Puerto
dabc3194b0 ItemLists now have a scrollbar and can be scrolled with the mouse wheel as well. (#797)
* You can scroll ItemLists now.

* ScrollBar actually appears!

* Remove System.Drawing

* Move total content height away from the drawing loop, recalculate it...

...when needed.

* Take ActualBackground minimum vertical size into account

* Fix cases where lists didn't scroll to the very bottom.

* Fix CalculateMinimumSize for real I hope
2019-04-23 01:51:42 +02:00
Acruid
7053fb15f8 Map System Code Refactor (#796)
* Removed unused method TileRef.GetStep().
Removed unused property TileRef.TileSize.
Removed unused property TileRef.Tile, made the field public with the same name.
Made the TileRef struct readonly.
Removed property TileRef.TileDef.
Removed property TileRef.LocalPos.
Renamed GridTile to GridIndices.
Implemented IEquatable on TileRef.
Implemented Equality operators on TileRef.
Added PublicAPI attribute to TileRef.
Added doc comments to TileRef.

* Modified Tile:
Added the PublicApi annotation.
Made struct readonly.
Filled out doc comments.
Changed auto properties to readonly fields.
Renamed TileId to TypeId.
Added a static Empty tile to the struct.
Implemented IEquatable.

* Modified MapCoordinates:
Added PublicApi attribute.
Implemented IEquatable.
Filled out doc comments.
Removed Map property.

* Modified ScreenCoordinates:
Filled out doc comments.
Added the PublicApi attribute.
Implemented IEquatable.

* Modified GridCoordinates:
Removed method IsValidLocation.

* Removed property GridCoordinates.Grid.

* Removed GridCoordinates.Map.

* Removed GridCoordinates.MapId.

* Removed property GridCoordinates.IsWorld.
Removed constructors taking a MapId.

* Removed static IoCManager calls from GridCoordinates.

* Modified GridCoordinates:
Added attribute PublicApi.
Filled out doc comments.

* Filled out doc comments for MapGrid.
Filled out doc comments for MapIndices.
Misc refactors for both.

* added command to teleport grids.

* Added method Box2.Intersect.
Added method Box2.Union.
Placement manager now spawns new grids to place tiles not connected to an existing grid.
2019-04-20 20:37:37 +02:00
Acruid
a5a3a539dc Tick Logic Timing and Bandwidth Improvements (#795)
Code was changed so that time starts at tick zero, and all entities are initialized in the space between tick 0 to 1. This was a solution to the fact fromSequence was including entities with lastStateUpdate tick one less than the actual sequence number. This is purely an issue about when exactly the game does its logic relative to the tick signals, ie positive or negative edge of the tick. Right now the game is set up to run the game logic on the positive edge of a Tick (enforced by GameLoop).

The second big part is that an empty collection takes 5ish bytes more than a null collection in the NetSerializer, even though they are conceptually the same thing in a game state. This PR puts null checks around everything and allows GameStates to have whole sections of itself null. This reduced the payload size of an empty game state from 49B to 15B.

This PR also fixes the bug where the physics system marks every movable entity as dirty every tick.
2019-04-20 18:08:43 +02:00
Acruid
faf99d2231 By default events raised on the ECS event bus are now dispatched immediately. (#794)
Added a new EntityManager.QueueEvent() method that queues the event for the next tick.
2019-04-20 10:58:04 +02:00
Pieter-Jan Briers
55fb70af8b Fix some compiler warnings. 2019-04-19 23:24:19 +02:00
Pieter-Jan Briers
33480f5527 Improve StatusHost
Now uses a list of handlers to make it easier to add REST API endpoints.
2019-04-17 23:24:36 +02:00
Pieter-Jan Briers
ce052d4db3 Add method to post a delegate to the main thread.
Helps for writing threaded code.
2019-04-17 23:23:35 +02:00
Pieter-Jan Briers
28290614a1 Fix CVar command not working to set string CVars with null value. 2019-04-17 23:22:30 +02:00
Silver
25926a17b7 Renames SS14.* to Robust.* (#793)
RobustToolbox projects should be named Robust.* 

This PR changes the RobustToolbox projects from SS14.* to Robust.*

Updates SS14.* prefixes/namespaces to Robust.*
Updates SpaceStation14.sln to RobustToolbox.sln
Updates MSBUILD/SS14.* to MSBUILD/Robust.*
Updates CSProject and MSBuild references for the above
Updates git_helper.py
Removes Runserver and Runclient as they are unusable
2019-04-15 20:24:59 -06:00
tentekal
3aec6eb561 Quick fix for wall draw depth being above the player (#792)
I guess I accidentally removed some comment strings and didn't realize until I pushed. Related to issue #180 on the content repo. I'll put in a separate PR on that repo to fix the prototype for walls too.
2019-04-15 11:28:18 -06:00
PrPleGoo
02f2e051dc Actual lockers (#787)
Adds storing entities into lockers the way we all know and love.
2019-04-14 21:17:33 +02:00
Pieter-Jan Briers
aa5581f10f Discord Rich Presence improvements:
Makes it toggle-able with a CVar.
2019-04-13 21:07:30 +02:00
Pieter-Jan Briers
8875b88e0f Fix the main menu breaking upon disconnect.
Simulation is necessary for UI to work but it was getting paused.
2019-04-13 21:06:34 +02:00
Pieter-Jan Briers
0a3b2e9bf7 Change config system so you can get notified on config changes. (#791)
Fixes #257
2019-04-13 19:57:14 +02:00
Pieter-Jan Briers
39bfa9f0c3 Change default tick rate back to 60 2019-04-13 13:38:20 +02:00
Pieter-Jan Briers
6b8311100b Fix crash on client connect. 2019-04-13 13:38:15 +02:00
Pieter-Jan Briers
e9b45adf1c Remove chat from the engine. (#790)
* Remove chat from the engine.

* I could've sworn I ran tests
2019-04-13 09:41:28 +02:00
Acruid
a2c1ddb22c Entity Interpolation (#789)
* add a new GameTick struct.

* Everything now uses the new GameTick struct.

* TickRate was changed to a byte, no way it is going over 255.
Fixed bug with changing TickRate after the loop has started.
Client now properly sets the TickRate when connecting to a server.

* Removed the old CurTime fields from game states.
Getting to the Connected runlevel on the client does not require a gamestate.
GameState processing now only starts after the client runlevel >= Connected.
Added some preprocessor conditions to not catch exceptions in Debug builds.
Nightly work on the GameStateManager, it is still pretty broken.

* NetMessages now have a Size property.
Player states were fixed, you can now join the game again!

* Frame interpolation kinda works.

* Frame Interpolation pretty much works!

* simulation can now catch up if a lag spike causes it to fall behind.

* Added concommand to debug draw the interpolation targets.

* Fixed a bug with applying just the NextState to an entity.

* Skip/replay a tick to slow down if the client is running ahead of the server.

* Solved a null ref exception when an extrapolated packet is applied.

* The TickRate is now officially 10.

* ClientGameStateManager stops running when the client leaves the server.

* Replaced poorly implemented FastForward with new TickTimingAdjustment.

* Update System.Runtime.CompilerServices.Unsafe to get rid of version conflict.

* Added 'net.interp' cvar.

* Disabled frame interpolation by default. The entire feature will be disabled until clientside input prediction is working.

* Removed or disabled log spam.
Fixed Transform unit test.

* Fix compile.
2019-04-13 09:33:01 +02:00
Acruid
613ad10f29 Remove InjectDependencies Calls (#784)
* Removed Static IoC calls from MapLoader.
Misc Code cleanup in MapLoader.

* Removed static IoC calls from ViewVariablesPropertyControl.

* StateManager now uses the DynamicTypeFactory to create States.
Removed static IoC calls from States.

* EntitySystemManager now uses the DynamicTypeFactory to create States.
Removed static IoC calls from EntitySystems.
Minor code cleanup.

* Removed static IoC calls from DebugDrawing.

* ComponentFactory now instantiates Components with IDynamicTypeFactory.
Removed static IoC calls from all engine components.
Misc code cleanup.

* Removed static IoC calls from all DebugMonitors.
Misc code cleanup.

* Removed static IoC calls from spawn windows.

* Removed static IoC calls from UserInterface/CustomControls.

* Fixed unit tests.

* Removed static IoC calls from AppearanceComponent.
2019-04-12 21:04:03 -07:00
PrPleGoo
eec287c19a Locker shoving (#785)
Added a bool to ICollidable to indicate friction with the floor, for thrown items down the line.
Added a bool to PhysicsComponent to indicate if movement is possible.
Added list of PhysicsComponent that are slowing "this" down.
PhysicsComponent handles BumpEntMsg by adding the bumping entity to that list.
Implemented ICollideSpecial to prevent collision with items in that list.
Reworked movement code:
- Separated calculating movement from doing movement;
- Calculating movement now involves several recalculations to see who is on "that" list;
- Friction of a tile now slows movement down depending on an object's mass;
Optimized collision code by building a Dictionary with a snapped grid location for key, reducing the amount of bodies that need to be checked significantly.
2019-04-12 19:40:21 +02:00
PrPleGoo
fb21726dfa Rendering order now done by who was last dirty instead of Uid (#786) 2019-04-12 00:09:55 +02:00
Pieter-Jan Briers
4b663fd508 Implement RichTextLabel, move FormattedMessage to shared. 2019-04-09 16:42:25 +02:00
Pieter-Jan Briers
277647e0c7 Add a helper to async await net messages in entity systems. 2019-04-09 14:41:42 +02:00
Pieter-Jan Briers
5c7a8624c4 You cannot click invisible entities. 2019-04-09 13:40:13 +02:00
Pieter-Jan Briers
f6b7601575 Prevent infinite loop when parenting control to itself. 2019-04-09 13:40:04 +02:00
Pieter-Jan Briers
afc8048d8a Refuse to start if content is not loaded. 2019-04-09 13:03:29 +02:00
Pieter-Jan Briers
dd60ca8883 Shoddy SplitContainer implementation. 2019-04-09 01:41:17 +02:00
Pieter-Jan Briers
25615842c5 Do not render lights on a different map. 2019-04-08 23:14:08 +02:00
Pieter-Jan Briers
b172a47d9e Implement Tree if shoddily. 2019-04-08 18:57:56 +02:00
Pieter-Jan Briers
e40cda6c99 Fix ForceSpawnEntityAt on client throwing an exception. 2019-04-08 18:03:34 +02:00
Acruid
d58d576677 Entitiy Queries & TypeFactory (#783)
* Changed EntityQueries for 3x perf increase for the EntitySystemManager.Update() method.
Removed the useless giant list EntityQuery.
Allowed the DependencyCollection to be able to inject itself as a dependency. Hopefully it won't be abused too bad.
Added the new IDynamicTypeFactory to IoC for instantiating arbitrary types. This removes the need for Activator.CreateInstance() and IoCManager.InjectDependencies() anywhere in code.
Utilized IDynamicTypeFactory in IComponentManager as an example of its use.

* Added IDynamicTypeFactory to SS14UnitTest.
2019-04-08 12:11:01 +02:00
tentekal
e689da51ba Implemented IEquatable on Angle (#782)
* Implemented IEquatable on Angle

* Removed extrenous code to GetHashCode
2019-04-08 12:10:13 +02:00
Pieter-Jan Briers
42e883c097 Move keybinds OUT of the engine. 2019-04-06 18:06:24 +02:00
Víctor Aguilera Puerto
a890957d30 Implement ItemLists. (#781)
Resolves #756
Style in https://github.com/space-wizards/space-station-14/pull/183

It works, but I'm sure it can be improved further.
2019-04-06 17:04:32 +02:00
Pieter-Jan Briers
1640eb2b6b Fix warning in Lidgren. 2019-04-06 14:41:48 +02:00
Pieter-Jan Briers
506d9a8c22 Stop using Encoding.UTF8. Use EncodingHelpers.UTF8
Apparently, Encoding.UTF8 defaults to inserting a BOM.
This is very dumb.

EncodingHelpers.UTF8 does not emit BOMs.
2019-04-05 01:57:44 +02:00
Pieter-Jan Briers
1b72be9923 Adds GridCoordinates.Distance(GridCoordinates) helper method. 2019-04-05 00:19:35 +02:00
Pieter-Jan Briers
685f9dc07a Copy paste is a dangerous thing. 2019-04-04 19:44:10 +02:00
Pieter-Jan Briers
7e6b5ec290 Adds a frame graph to F3. 2019-04-04 19:20:43 +02:00
Pieter-Jan Briers
6db4722a13 Actually draw ScreenSpace overlays. 2019-04-04 16:23:41 +02:00
Pieter-Jan Briers
fa15950b91 Remove player movement code from the engine. (#780) 2019-04-04 16:18:06 +02:00
Injazz
9ff6a7ec02 Initial Discord Rich presence (#776)
thanks @occune for initial work
put some edits there
doesnt work on macos(waiting on nuget update again)
btw future reference: https://discordapp.com/developers/docs/rich-presence/how-to
2019-04-04 15:14:28 +02:00
Pieter-Jan Briers
c8d939a732 Rework entity initialization. (#779)
* Rework entity initialization.

Map loading now correctly processes entity load stages:
1. First all entities are allocated. This allocates the entity and gives
   it a UID, nothing more. No user code is executed.
2. Then all entities are loaded. This runs ExposeData on components.
3. Then all entities are initialized. This runs Initialize.
4. Then all entities are started. This runs Startup.

Entity spawning methods on IEntityManager now actually set position
before Initialize.

Also cleaned up a lot of spaghetti.

* Add some comments.
2019-04-04 15:07:34 +02:00
Injazz
b1bf694c35 Prettyfying README.MD (#777)
Adds header, fixes few links
![rtgithubheader](https://user-images.githubusercontent.com/43905364/55467941-bb6b7c00-561b-11e9-9e11-998f6d158914.png)
2019-04-04 15:06:59 +02:00
Pieter-Jan Briers
0c1c9fae33 Mark YamlHelpers as pure. 2019-04-04 01:37:53 +02:00
Pieter-Jan Briers
5e711072d9 Remove unused field. 2019-04-04 00:36:07 +02:00
Pieter-Jan Briers
0c93f3756a Fix IconSmooth being ignored in engine instead of content. 2019-04-04 00:35:41 +02:00
Pieter-Jan Briers
322fb06be1 Add TileRef GetTile(MapIndices tileCoordinates) to IMapGrid. 2019-04-04 00:33:39 +02:00
Pieter-Jan Briers
d71218943d Expose MapIndices for TileRef. 2019-04-04 00:33:21 +02:00
Pieter-Jan Briers
d7d0363cc3 Refactor tile IDs. (#778)
* Refactor tile IDs.

Tile IDs are now automatically assigned at runtime.
A mapping is also stored in map files to avoid compatibility issues.
Also removed tile prototypes. Content is now responsible for it.
This is so content can define its own data for tiles.

* Update map format specification.

* Fix tile placement.
2019-04-03 21:19:55 +02:00
Pieter-Jan Briers
2bb73aa93d Fix macOS builds. 2019-04-01 21:43:05 +02:00
Pieter-Jan Briers
d4cd328f96 Implement UI tooltips. 2019-04-01 20:05:25 +02:00
Pieter-Jan Briers
633eaade45 Prevent empty usernames. 2019-04-01 15:53:29 +02:00
Pieter-Jan Briers
c176392599 New main menu.
Has a join public server button and a username field.
2019-04-01 15:53:21 +02:00
Pieter-Jan Briers
78fc0af6cb Try to fix macOS 2019-04-01 15:14:09 +02:00
Pieter-Jan Briers
c1ec11b4c2 Fix bad log call in AssemblyLoader. 2019-04-01 02:00:36 +02:00
Pieter-Jan Briers
859a39b41b Fix server going in infinite loop. 2019-03-31 16:24:07 +02:00
Pieter-Jan Briers
e5ee9c19ab Fixes server exceptions from #773 (#775) 2019-03-31 14:54:11 +02:00
Pieter-Jan Briers
9e9508937a Fix lights going weird when resizing the window (#774) 2019-03-31 14:50:28 +02:00
Silver
d337fda1e9 localpath special character work around 2019-03-30 18:09:09 -06:00
Pieter-Jan Briers
25a485aea7 NetManager connection handshake improvement. (#773)
* Reworked the net manager connection sequence.
* Correctly handle IPv4/IPv6 prioritization and fallback.
* Making a proper handshake for an auth system further down the line should be much easier now too.
* Added feedback to connection sequence in the main menu.
2019-03-31 00:51:10 +01:00
Pieter-Jan Briers
b5635201c2 Automate GodotSharp.dll download 2019-03-30 23:17:29 +01:00
Silver
e758c114bd Update download_ss14_noise.py 2019-03-30 00:43:47 -06:00
Silver
4fda7867b1 Update readme.md 2019-03-29 14:10:32 -06:00
Pieter-Jan Briers
b72962ac14 Made server data self contained. 2019-03-28 20:45:15 +01:00
Pieter-Jan Briers
5069a2b1a9 Options menu now includes a high res lights toggle. 2019-03-28 19:31:33 +01:00
Pieter-Jan Briers
65e3b0d0d9 Fix default user name being invalid. 2019-03-28 19:30:36 +01:00
Pieter-Jan Briers
f4cd69139d Config refactor.
Config is now stored in the user data directory.
User data directory is now correctly set depending on system.
2019-03-28 16:59:25 +01:00
Pieter-Jan Briers
92bb1d05ba Fix compiler warning in server. 2019-03-28 14:28:57 +01:00
Pieter-Jan Briers
0852561cc1 Implement line rendering in Clyde.
Fixes #754
2019-03-28 14:24:36 +01:00
Pieter-Jan Briers
d4c56c7e9f Fix scrolling not working in entity spawn panel. 2019-03-28 11:31:34 +01:00
Pieter-Jan Briers
20f29fa899 Make entity spawn panel not hang (as much) with this one simple trick. 2019-03-28 11:24:45 +01:00
Pieter-Jan Briers
a30334fc74 Try to work around CAS violations on Windows 10. 2019-03-28 11:12:22 +01:00
Pieter-Jan Briers
8a478326a0 SubscribeEvent<T>(EntityEventHandler<T> evh) for EntitySystem. 2019-03-28 11:12:22 +01:00
Nirnael
287dfceb81 Adds a frame counter to timing debug monitor (#769)
Use case explained in its documentation. I could probably make it a long in case someone runs at thousands of fps for days, or make it debug only.
2019-03-28 09:32:56 +01:00
Pieter-Jan Briers
9661c4490c Merge branch 'master' of github.com:space-wizards/space-station-14 2019-03-27 22:57:22 +01:00
Pieter-Jan Briers
a2e9e0d15f Adds "hide UI" keybind.
Man posting screenshots is much nicer when there's no ugly chat window.
2019-03-27 22:50:19 +01:00
Nirnael
6481a22a71 Establish standard format for runtime log naming and future-proof it until the human race perishes (#767)
This PR establishes the format "Runtime-yyyy-MM-dd-THH-mm-dd.txt" for runtime logs from the server, preventing locale from messing with string escape characters and causing directory runtimes at next line. ~I've replaced the dash with an underscore as they can cause problems in some shells such as windows CLI.~ Dashes are staying because whoever has a shell that complains needs to get a new one.

~~**_I have most importantly made sure that SS14 can live on until the year of our Lord God Emperor and veritable saviour 99,999 Anno Domini of the Gregorian Calendar by extending the runtime-log-naming  year range to 5 digits._**~~ 
~~_Let the meme PRs begin if they haven't already_~~

4 digits so logs will display until 9999, godspeed future maintainers.
2019-03-27 22:46:11 +01:00
Víctor Aguilera Puerto
72fcf86227 AudioParams can be defined in YAML now (#768) 2019-03-27 22:45:49 +01:00
Pieter-Jan Briers
84b4b3d6b5 Bind QuadVAO in _drawQuad.
This fixes lighting if parallax isn't initialized yet.
2019-03-27 18:18:19 +01:00
Pieter-Jan Briers
14bfb8aa5b Suppress gdparse warnings. 2019-03-27 17:16:27 +01:00
Pieter-Jan Briers
6d4612e40b Fix edge sampling issues on nvidia. 2019-03-27 15:53:53 +01:00
Pieter-Jan Briers
4c3ed1181d Allow toggling light rendering with a command. 2019-03-26 19:46:55 +01:00
Pieter-Jan Briers
0763f949a5 Properly fix ClipboardManagerLinux. 2019-03-26 14:52:47 +01:00
Pieter-Jan Briers
46a89686bc Half lightmap dimensions by two on Intel iGPUs.
I was unable to reach 60 FPS steady on my Intel UHD 630,
so I'd say this is probably warranted.

It doesn't reduce visual quality in any way I can tell.
2019-03-26 14:38:01 +01:00
Pieter-Jan Briers
b26bab1361 Implement SpriteComponent Rotation on Clyde. 2019-03-26 11:45:32 +01:00
Injazz
27a91e3880 Implements move disabler (#765)
blocks entity movement
2019-03-26 11:17:13 +01:00
Pieter-Jan Briers
2043a1e345 Fix exception if trying to delete air with placement. 2019-03-26 09:32:04 +01:00
Pieter-Jan Briers
2850bc80d1 Make Clyde more uuuh robust against problems. 2019-03-26 09:31:47 +01:00
Pieter-Jan Briers
5942e6fba6 Deleting an entity deletes entities in containers too.
If you want to avoid this behavior, the entity can be ejected early.
2019-03-26 09:04:22 +01:00
Pieter-Jan Briers
458a5a05b2 Fix inability to move while placing. 2019-03-26 08:46:28 +01:00
Pieter-Jan Briers
8efd997810 Implement OptionButton shoddily but functionally. 2019-03-26 08:28:50 +01:00
Pieter-Jan Briers
0dd5f72b3b Fix Popup control defaulting to visible. 2019-03-26 08:28:34 +01:00
Pieter-Jan Briers
ab9f9a99d6 Implement modal popups correctly. 2019-03-26 01:10:15 +01:00
Pieter-Jan Briers
7870a540cf IList<T>.Pop() Helper. 2019-03-26 01:09:47 +01:00
Pieter-Jan Briers
74e002b5a0 I fixed'nt it in the wrong direction. 2019-03-26 00:09:32 +01:00
Pieter-Jan Briers
eac17e5b25 Placement manager cleanup. 2019-03-26 00:01:36 +01:00
Pieter-Jan Briers
df6feae7f4 Fix incorrectly offset godot and clyde grid rendering.
Every tile was incorrectly one tile down.
2019-03-26 00:01:23 +01:00
Pieter-Jan Briers
120beb29ad More verbose TileRef ToString. 2019-03-26 00:00:44 +01:00
Pieter-Jan Briers
522ce2fe59 Current grid tile in debug coords panel. 2019-03-26 00:00:32 +01:00
Pieter-Jan Briers
bc9b490169 Fix placement modes not centering large sprites correctly. 2019-03-25 23:13:51 +01:00
Pieter-Jan Briers
34a5649462 Fix reconnect exception. 2019-03-25 14:04:05 +01:00
Pieter-Jan Briers
1ff08f70ef More culture fixes for YamlObjectSerializer 2019-03-25 13:26:07 +01:00
Pieter-Jan Briers
cc0948c1e2 Adding entity while iterating all entities works now. 2019-03-25 13:09:26 +01:00
Pieter-Jan Briers
e3117263ac Ah crap. 2019-03-25 12:55:00 +01:00
Pieter-Jan Briers
83baaea8f1 Fix locale issues with map saving. 2019-03-25 12:47:56 +01:00
Pieter-Jan Briers
75ebdb4a00 Remove debug code from clipboard managers. 2019-03-25 12:47:55 +01:00
Remie Richards
f4983cc1cc Expose a readonly version of YamlObjectSerializer's TypeSerializer dict. (#763) 2019-03-24 23:37:43 +01:00
Pieter-Jan Briers
00694aa46b AppVeyor fix attempt 2 2019-03-24 20:39:16 +01:00
Pieter-Jan Briers
8e80e3a5c3 AppVeyor fix attempt 1 2019-03-24 20:28:05 +01:00
Pieter-Jan Briers
1f42e9672d Re-implement RSI atlassing with norma atlasses. 2019-03-24 20:01:45 +01:00
Pieter-Jan Briers
6328fb86b3 Fix incorrect tile atlas generation. 2019-03-24 20:01:20 +01:00
Pieter-Jan Briers
226ec200ca Use Rgba16f for lighting framebuffer.
This significantly improves performance and I can't tell a difference.
2019-03-24 17:31:25 +01:00
Pieter-Jan Briers
1c460e1d85 Fix unit tests. 2019-03-24 17:20:39 +01:00
Pieter-Jan Briers
54c920b2d4 Grid rendering improvements:
1. tile sprite is no longer hardcoded so multiple floor types is
possible.
2. Batches are cached across frames to improve performance.
2019-03-24 17:19:01 +01:00
Víctor Aguilera Puerto
422fe4666e Remove SS14.Shared.Bsdiff from submodules. (#762)
Seems it's not really needed anymore.
2019-03-24 13:51:49 +01:00
PJB3005
ae21b98d9a Implement clipboard on Windows 2019-03-23 20:08:44 +01:00
Pieter-Jan Briers
a74f8c9787 Re-implement UserInterfaceManager.Popup. 2019-03-23 17:21:43 +01:00
Pieter-Jan Briers
de50dcf49c Add clipboard support. 2019-03-23 17:17:10 +01:00
Pieter-Jan Briers
dd37e54e43 Switch lighting framebuffer back to Rgba32f.
Apparently implementations aren't required to implement Rgb32f.
2019-03-23 16:25:44 +01:00
Pieter-Jan Briers
43c06c81c0 Less hideous outlines. 2019-03-23 15:02:31 +01:00
Pieter-Jan Briers
4767b23fb8 Adds a camera offset to eyes. 2019-03-23 14:39:13 +01:00
Pieter-Jan Briers
9e0c33c9bf Rays do not intersect with non hard collidables.
This was causing you to be unable to fire a laser gun through an open
door.
2019-03-22 23:57:08 +01:00
Pieter-Jan Briers
ab1dfed25c Rebuild world matrix on parent change.
This fixes things getting reset to 0,0 on ejection from containers.
2019-03-22 22:15:51 +01:00
Pieter-Jan Briers
e467df24f8 Do not show nested entities in showbb. 2019-03-22 22:15:31 +01:00
Pieter-Jan Briers
bc79f07395 Remove HRTF hack.
Turns out it's HRTF and disabling it at a system level is better.
2019-03-22 22:05:41 +01:00
Pieter-Jan Briers
94e5561157 Just commit the fancy main menu already.
I've been sitting on this for weeks and I'm too lazy to make it "proper"
So I'll just push it like this.
2019-03-22 21:51:41 +01:00
Nirnael
ee3c017104 Fix runtimes log missing dir exception (#761) 2019-03-22 21:50:05 +01:00
Remie Richards
c73cb9fefc Error/Hint when using RSIs as texture in SpriteComponent (#760)
We've all ran into this before.
2019-03-22 21:49:56 +01:00
Pieter-Jan Briers
5d855b7aec Spawn command works from server console. 2019-03-22 21:49:20 +01:00
Pieter-Jan Briers
3222574b61 Load up icon. 2019-03-22 21:49:20 +01:00
Pieter-Jan Briers
dd3bd307ed Update readme. 2019-03-22 21:49:20 +01:00
Pieter-Jan Briers
cf7c401ee0 Runtime Log & Exception Catching. (#759) 2019-03-22 12:50:17 +01:00
Pieter-Jan Briers
41cd4ca888 Time for 5 commits trying to fix Travis. 2019-03-21 23:29:09 +01:00
Pieter-Jan Briers
21be226b33 Fix audio quality on Linux? 2019-03-21 23:28:25 +01:00
Pieter-Jan Briers
3c8ee48d3f Use Rgb32f instead of Rgba32f for lighting buffer. 2019-03-21 21:53:32 +01:00
Pieter-Jan Briers
d382f7e6ab SS14Serializer improvements:
1. OpenTKTypeSerializer is no longer necessary since we have our own
math types.
2. Added a check to prevent NetSerializable on server/client types.
2019-03-21 21:30:10 +01:00
Pieter-Jan Briers
2dc42a7b75 Fix missing dependency issues:
Load up OpenTK.dll.config again. PackageReference doesn't copy it due to
incorrect packaging.
I had to make packages be downloaded locally to the solution again via
nuget.config to do this, because otherwise I couldn't get a reference to the OpenTK.dll.config in the NuGet package.

Adds a Python script to auto download freetype6.dll and openal32.dll on
Windows.
2019-03-21 18:49:25 +01:00
Pieter-Jan Briers
fdc414975b Fix inability to open APC on Godot. 2019-03-21 18:08:47 +01:00
Pieter-Jan Briers
75d13cc8a1 Implement Modulate on controls under Clyde.
This fixes content notifies crashing.
2019-03-21 18:02:51 +01:00
Pieter-Jan Briers
c5f6f9b12a Correctly apply shaders to sub handles of overlays on Clyde.
Fixes lasers not being unshaded.
2019-03-21 17:52:20 +01:00
Pieter-Jan Briers
39dffd6d9e Increase darkness brightness.
This should be more in line with Godot.
2019-03-21 17:51:56 +01:00
Pieter-Jan Briers
2195c1653a Clyde now does lights.
Shadows not included.
2019-03-20 23:25:46 +01:00
Pieter-Jan Briers
505f6b2fd7 Fix config system errors due to audio device. 2019-03-20 23:25:08 +01:00
Pieter-Jan Briers
3cf0a19c36 Effects work on Clyde.
Closes #757
2019-03-20 14:33:42 +01:00
Pieter-Jan Briers
c5c74d7f1d Apply pitch and volume. 2019-03-20 01:12:13 +01:00
Pieter-Jan Briers
824e071eb6 Avoid OpenAL errors by disposing all audio sources on shutdown. 2019-03-20 00:26:53 +01:00
Pieter-Jan Briers
6d523f8551 Audio stream playback in animations. 2019-03-19 23:55:58 +01:00
Pieter-Jan Briers
fc7ca1471c Use NVorbis for Vorbis decoding.
Removes one native dependency.
2019-03-19 23:18:21 +01:00
Pieter-Jan Briers
88a0ba7172 Audio actually gets played back now. 2019-03-19 22:41:09 +01:00
Pieter-Jan Briers
492ffe159b Rename "OpenGL" to "Clyde" where applicable. 2019-03-19 17:08:43 +01:00
Pieter-Jan Briers
a6d21996c7 OpenAL beginnings and audio sample loading. 2019-03-19 16:58:00 +01:00
Pieter-Jan Briers
a236193e24 Outlines draw now. 2019-03-19 00:45:12 +01:00
Pieter-Jan Briers
835dba99a4 The big "suddenly shaders" commit.
Clyde does custom shaders. Woo!

Still some things need implementing like custom uniforms and vertex shaders,
but this commit is big enough as is.

Also gets rid of texture array based batching because it was a pain.
2019-03-18 23:52:49 +01:00
Pieter-Jan Briers
379d653117 Fix Godot. 2019-03-18 15:00:35 +01:00
Pieter-Jan Briers
9eb6a75290 Remove dead SpriteView file. 2019-03-17 22:32:38 +01:00
Pieter-Jan Briers
67528e9c20 Pretty sure this fixes Godot 3.1 support. 2019-03-17 22:32:21 +01:00
Pieter-Jan Briers
ff2a642b4a Adds list pick utility. 2019-03-17 15:48:12 +01:00
Pieter-Jan Briers
19784b4c31 Adds entity delete command. 2019-03-17 15:34:57 +01:00
Pieter-Jan Briers
d524d3138f Do not render invisible sprite components. 2019-03-17 15:34:05 +01:00
Pieter-Jan Briers
b8a7c36f0c Add EntityUid.TryParse method. 2019-03-17 15:33:53 +01:00
Pieter-Jan Briers
2d127a476b Fix incorrect ordering of godot scene siblings without explicit index in their header. 2019-03-17 14:36:44 +01:00
Pieter-Jan Briers
ee54f35185 Ensure consistent entity drawing order. 2019-03-17 13:27:13 +01:00
Pieter-Jan Briers
a1425e03fc Animation system. 2019-03-17 13:23:54 +01:00
Pieter-Jan Briers
fca69233ea Fix non-incrementing LayerSetAnimationTime 2019-03-17 13:22:47 +01:00
Pieter-Jan Briers
437f01bd14 Fix timers dropping seconds. 2019-03-17 12:14:01 +01:00
Pieter-Jan Briers
01b781ac03 Optimize SpriteComponent.LayerSetAnimationTime for going forward.
Also actually fix it setting texture.
2019-03-17 00:36:22 +01:00
Pieter-Jan Briers
19c47e93dc Allow controlling animations externally on sprite component. 2019-03-17 00:27:46 +01:00
Pieter-Jan Briers
1c3b7fe242 Animated RSI states have an animation length now. 2019-03-17 00:27:06 +01:00
Pieter-Jan Briers
8f966e2c83 Rework SpriteComponent animation code.
It now assumes that a state has the same total animation length for each
direction, this solves problems like rotating resetting animations.
Also paves the way for manual animation control.
2019-03-16 23:26:10 +01:00
Pieter-Jan Briers
866f96b912 Print exception stack trace when a command errors on the server. 2019-03-16 21:21:43 +01:00
Pieter-Jan Briers
b092aa2ccf Don't run Godot circle drawing on Clyde. 2019-03-16 21:21:25 +01:00
Pieter-Jan Briers
369e6d4f11 Actually respect the prototype default placement mode.
This is kinda just a stopgap since the selection button
isn't implemented on Clyde.
2019-03-16 21:20:43 +01:00
Pieter-Jan Briers
370302ce59 Fix ToRelativePath() for "/" 2019-03-16 21:19:33 +01:00
Pieter-Jan Briers
c2782cb0b9 Improve savebp command:
1. Now gives feedback whether the save worked.
2. Actually listen to the path argument.
2019-03-16 20:50:08 +01:00
Pieter-Jan Briers
b73df4c478 Make trying to get a nonexistant component have a better error. 2019-03-16 20:23:36 +01:00
Pieter-Jan Briers
73bd4f6301 Actually load window size from config file. 2019-03-16 19:08:15 +01:00
Pieter-Jan Briers
34821b7e9b Change GL context version to 3.3.
I have decided that we should be able to run the code on OpenGL 3.3.
Mostly because I was inspired to keep it working on that 2008 macbook.
2019-03-16 19:03:53 +01:00
Pieter-Jan Briers
fde75ad02a SpriteComponent uses WorldMatrix & handles Directional correctly.
This makes gun projectiles look correct.
2019-03-16 18:57:04 +01:00
Pieter-Jan Briers
13ce078126 Matrix3.CreateRotation override for Angle. 2019-03-16 18:56:28 +01:00
Pieter-Jan Briers
fef7fe1980 Use in parameter for DrawingHandle.SetTransform(Matrix3) 2019-03-16 18:35:06 +01:00
Pieter-Jan Briers
a3594b2ded Set anchors to zero in Container.FitChildInBox(). 2019-03-16 18:25:32 +01:00
Pieter-Jan Briers
8c184864e2 Fix MarginContainer size calculations. 2019-03-16 18:25:18 +01:00
Pieter-Jan Briers
5bc9073b26 Implement GridContainer. 2019-03-16 18:13:27 +01:00
Pieter-Jan Briers
70d18a13b1 Do not apply text align if button has to clip text. 2019-03-16 18:13:17 +01:00
Pieter-Jan Briers
68a5e75ea8 Implement CenterContainer. 2019-03-16 16:46:15 +01:00
Pieter-Jan Briers
80900ba708 Implement MarginContainer. 2019-03-15 23:51:24 +01:00
Pieter-Jan Briers
9fbaf144a6 Channels the power of spaghetti to implement SpriteView in Clyde.
I'm channeling the power of spaghetti through individual spaghett-
Wait what do you call an individual thing of spaghetti.
A noodle?
A strand?
Should I use this word every time I write bad code?

// Noodle incoming.

So many questions.
2019-03-15 19:07:03 +01:00
Pieter-Jan Briers
8d78fc41e7 Prevent crash when rendering fonts. 2019-03-13 23:20:08 +01:00
Pieter-Jan Briers
010d32424a Relicense future code to MIT. 2019-03-13 13:25:55 +01:00
Pieter-Jan Briers
ae0d34cd7e Just barely implement Popup 2019-03-12 10:01:00 +01:00
Pieter-Jan Briers
db45961936 Fix middle and right click being treated as left click. 2019-03-12 10:00:44 +01:00
Pieter-Jan Briers
b2bb711dbb CheckBox works. 2019-03-11 11:55:13 +01:00
Pieter-Jan Briers
d139203367 UITest command for testing. 2019-03-08 17:14:11 +01:00
Pieter-Jan Briers
ec314a64b2 Implement ProgressBar 2019-03-08 17:14:01 +01:00
Pieter-Jan Briers
ebbcd36524 Define CheckButton so APC UI opens 2019-03-08 17:13:49 +01:00
Pieter-Jan Briers
4874254acc Apparently I completely forgot to push this.. 2019-03-08 17:13:14 +01:00
Pieter-Jan Briers
af186959db Load Range values from tscn. 2019-03-08 17:12:37 +01:00
Pieter-Jan Briers
f6e4dd6a00 Drop keyboard focus when clicking on nothing. 2019-03-08 14:22:14 +01:00
Pieter-Jan Briers
d025065d40 Controls now lose focus when hidden or deleted. 2019-03-08 14:18:14 +01:00
Pieter-Jan Briers
7919be26f1 Fix crash on Godot as a result of bff03cd2b8 2019-03-08 14:17:58 +01:00
Pieter-Jan Briers
82d1a24f78 Entity Spawn Window now takes name into consideration for search. 2019-03-08 13:59:19 +01:00
Pieter-Jan Briers
bff03cd2b8 Placement drawing moved to overlay; works in Clyde.
Fixes #597
2019-03-08 10:23:08 +01:00
Pieter-Jan Briers
cf32f0874d Clyde improvements.
Fix some render state leaking across drawing handles.
Draw world space overlays.
2019-03-08 10:21:37 +01:00
Pieter-Jan Briers
24b6240f3b Clip culling for controls.
This significantly speeds up rendering of things like
the entity spawn panel.
2019-03-08 09:26:05 +01:00
Pieter-Jan Briers
12896f306c Fix VSync button not starting in the right color. 2019-03-08 09:06:25 +01:00
Pieter-Jan Briers
40a037a97a Fix initial LineEdit placeholder being the wrong color. 2019-03-08 08:57:46 +01:00
Pieter-Jan Briers
b533968531 Fix bad layout in tscn files for spawn panels. 2019-03-06 16:06:52 +01:00
Pieter-Jan Briers
88572c5bae Change base types of spawn panel items to PanelContainer.
To match the types in the tscn files.
2019-03-06 16:06:38 +01:00
Pieter-Jan Briers
8b23a80357 Improve the GUI dump command. 2019-03-06 16:06:06 +01:00
Pieter-Jan Briers
06675cd956 Load rect_clip_content and rect_min_size from tscn. 2019-03-06 16:05:53 +01:00
Pieter-Jan Briers
20e5fe9b4d Fix Godot 3.0 compatibility. 2019-03-05 21:56:47 +01:00
Pieter-Jan Briers
19a7e21d47 Fix inconsistent FPS on Clyde.
Fixes #729

This was simple. Client was defaulting to 50 FPS while the server was defaulting to 60.

Jeez.
2019-03-05 18:04:51 +01:00
Pieter-Jan Briers
2ff15f7fb0 Improve ridiculous VV window sizes. 2019-03-05 09:37:34 +01:00
Pieter-Jan Briers
2848d40d5d Implement Button.ClipText. 2019-03-05 09:35:18 +01:00
Pieter-Jan Briers
f8359a38e0 Change default filter mode for containers.
This fixes VV's "click to expand" functionality on the property controls
2019-03-05 09:21:35 +01:00
Pieter-Jan Briers
975439c388 VV debug command addition.
Now has a Vector2 field. I needed this to check something.
2019-03-05 09:03:51 +01:00
Pieter-Jan Briers
94e744b751 Unit test BoxContainer. 2019-03-05 09:03:27 +01:00
Pieter-Jan Briers
5c57ce1118 Fix BoxContainer with multiple expanding children. 2019-03-05 09:03:13 +01:00
Pieter-Jan Briers
c751bff500 Use the power of operator overloading to implicit cast tuples to Vector2 2019-03-05 09:02:47 +01:00
Pieter-Jan Briers
df2e2af7f2 Default vertical size flags for label correctly. 2019-03-04 17:59:58 +01:00
Pieter-Jan Briers
ba59e71b7a Control input clipping. 2019-03-04 17:40:12 +01:00
Pieter-Jan Briers
274dfb769d Increase ScrollContainer scrolling speed.
Really this shouldn't be hardcoded but oh well.
2019-03-04 15:45:09 +01:00
Pieter-Jan Briers
12a61918ab Add GUI dump command. 2019-03-04 15:41:41 +01:00
Pieter-Jan Briers
28e60109f0 Code Cleanup of Console/Commands/Debug.cs 2019-03-04 15:40:50 +01:00
Pieter-Jan Briers
e24f55476e VV can now VV VV. 2019-03-04 15:38:46 +01:00
Pieter-Jan Briers
8c5a2dedb9 Oh yeah maybe commit this. 2019-03-04 15:36:23 +01:00
Pieter-Jan Briers
07880f4352 Give VV windows a control name to ease debugging. 2019-03-04 15:36:07 +01:00
Pieter-Jan Briers
4b104c01a1 Fix StyleBoxFlat margins being a mess. 2019-03-04 15:35:37 +01:00
Pieter-Jan Briers
278e1299b8 Slap [ViewVariables] on Control. 2019-03-04 15:35:17 +01:00
Pieter-Jan Briers
46e1b10269 Fix Control.SetMarginPreset with right and bottom anchors. 2019-03-04 15:34:40 +01:00
Pieter-Jan Briers
9f24bf2602 Remove bad AutoLoad from project.godot. 2019-03-04 13:48:54 +01:00
Pieter-Jan Briers
15350e7969 Merge branch 'master' of github.com:space-wizards/space-station-14 2019-03-04 12:48:15 +01:00
Pieter-Jan Briers
88b6a7f4da DebugConsole history is less broken and saved to disk. 2019-03-04 12:47:39 +01:00
Pieter-Jan Briers
4a8fdf744e Fix all the ScrollContainer crashes.
Probably.
2019-03-04 12:47:20 +01:00
Pieter-Jan Briers
37f51a9dd1 Implement LineEdit.Editable, improve LineEdit styling. 2019-03-04 12:47:01 +01:00
Pieter-Jan Briers
9352ccf82d LineEdit improvements:
Added IgnoreNext bool to prevent keys that focus it getting entered.
Made OnTextChanged not fire when setting Text.
2019-03-04 11:27:34 +01:00
Nirnael
200bc572bf Fix viewport size on window creation for OS-imposed sizes (#743)
Adds a call to viewport on opengl init in order to properly initialize the viewport size when the OS imposes a window size on window creation. Fixes Windows OS tablet mode-imposed window sizes.

That System diff is a bug.
2019-03-01 21:04:19 +01:00
Pieter-Jan Briers
de5f3d8870 Mostly functional ScrollContainer. 2019-03-01 16:28:17 +01:00
Pieter-Jan Briers
5505ee91f0 Help the entire UI system is spaghetti and we need to fix this. 2019-03-01 16:27:58 +01:00
Pieter-Jan Briers
7340e1212c Once again remove 3.1 project.godot 2019-02-27 13:53:01 +01:00
Pieter-Jan Briers
2ec0ae41fe Add safety check to ScrollBar.IsAtEnd. 2019-02-26 17:04:58 +01:00
Pieter-Jan Briers
9e718a01d8 OutputPanel uses ScrollBars 2019-02-26 17:04:37 +01:00
Pieter-Jan Briers
45efe4f29f Implement scroll bars. 2019-02-26 15:39:57 +01:00
Pieter-Jan Briers
acd0299f1e Avoid redundant pseudo class restyles. 2019-02-26 14:31:26 +01:00
Pieter-Jan Briers
11b0c871c3 Fix MouseMove only firing on mouse focus. 2019-02-26 10:49:23 +01:00
Pieter-Jan Briers
3fb791bd0d Do not stop mouse wheel with stop filter mode.
Arguably we should have some kinda event mask for this,
but this is how Godot does it and I'm not gonna engineer a better
solution.
2019-02-26 10:49:07 +01:00
Pieter-Jan Briers
fb4b325f59 TabContainer mostly works, shoddily. 2019-02-25 10:52:30 +01:00
Pieter-Jan Briers
85da2b9a19 Add StyleBox.GetEnvelopBox. 2019-02-25 00:43:48 +01:00
Pieter-Jan Briers
9858004de8 Fix really bad copy paste mistake.
Jeez. X always comes before Y when sorting like that. Style man.
2019-02-25 00:05:08 +01:00
Pieter-Jan Briers
47180ab2d5 Use this newfound clipping power on OutputPanel. 2019-02-24 23:04:42 +01:00
Pieter-Jan Briers
fa8f4b697f Implement Control RectClipContent with Scissor testing. 2019-02-24 22:43:45 +01:00
Pieter-Jan Briers
68a2543020 Adds UIBox2i.Intersection. 2019-02-24 22:33:56 +01:00
Pieter-Jan Briers
76f47e07df Control.OnVisibilityChanged does not fire if value == _visibility. 2019-02-24 21:30:18 +01:00
Pieter-Jan Briers
4e71bd541f Controls get a ChildMoved event. 2019-02-24 21:29:57 +01:00
Pieter-Jan Briers
8747d68ee3 Change default font DPI to 96.
Windows also treats 96 as the default 100% I believe.
2019-02-24 15:54:57 +01:00
Pieter-Jan Briers
0a84fca028 I should learn to be careful with C APIs.
Fixes crashes related to the font system.
2019-02-24 15:53:37 +01:00
Pieter-Jan Briers
66bf5d7c48 Make Chatbox use OutputPanel. 2019-02-24 01:11:39 +01:00
Pieter-Jan Briers
4a7b39bc84 Prevent negative scroll amounts on OutputPanel. 2019-02-24 01:10:31 +01:00
Pieter-Jan Briers
5f3b1414f8 Fix OutputPanel with null panel override on Godot.
Also add StyleBoxEmpty.
2019-02-24 01:05:54 +01:00
Pieter-Jan Briers
0984befcae DebugConsole: remove need for separate PanelContainer. 2019-02-24 00:12:54 +01:00
Pieter-Jan Briers
91854cfd0b OutputPanel gets its own style box to draw. 2019-02-24 00:12:30 +01:00
Pieter-Jan Briers
90c351bb21 Load size flags from tscn. 2019-02-24 00:11:44 +01:00
Pieter-Jan Briers
6bd84abaf4 Rename NetDebugPanel to DebugNetPanel 2019-02-23 23:31:39 +01:00
Pieter-Jan Briers
f753b131e0 Maybe don't forget to commit the PanelContainer implementation. 2019-02-23 23:29:51 +01:00
Pieter-Jan Briers
1d23df6d79 Make DebugConsole scene purely in code. 2019-02-23 23:28:11 +01:00
Pieter-Jan Briers
72788cc263 Fix Control Size setter if minsize < margin-calculated size. 2019-02-23 23:15:09 +01:00
Pieter-Jan Briers
60d0e9c62b Debug Monitors don't update text while hidden. 2019-02-23 23:08:19 +01:00
Pieter-Jan Briers
1fd2cfa7fd Containers re-sort on resize. 2019-02-23 23:07:54 +01:00
Pieter-Jan Briers
e463718917 Fix bad copy paste bug in Container.FitChildInBox. 2019-02-23 23:07:43 +01:00
Pieter-Jan Briers
5890e08bb3 Add Control.VisibleInTree 2019-02-23 23:06:59 +01:00
Pieter-Jan Briers
a1840b9732 Control Size related convenience helpers. 2019-02-23 20:03:51 +01:00
Pieter-Jan Briers
43430b458c Prevent infinite Control parent chain recursion. 2019-02-23 19:57:56 +01:00
Pieter-Jan Briers
c99622c2f8 Improve OutputPanel scroll speed. 2019-02-23 16:55:54 +01:00
Pieter-Jan Briers
2462caf25a Improve LineEdit styling and rendering. 2019-02-23 16:35:09 +01:00
Pieter-Jan Briers
bbef6657c1 More Clyde optimizations.
Just less data copying, better data copying, reduced pooling usage.
2019-02-22 14:22:17 +01:00
Pieter-Jan Briers
096ac8624e Improve FPS significantly...
By raising the command pool capacity.
2019-02-21 22:47:04 +01:00
Pieter-Jan Briers
f9753e80ac Fix various compiler warnings. 2019-02-21 22:01:13 +01:00
Pieter-Jan Briers
b3e3066c53 More premature optimizations. 2019-02-21 18:13:03 +01:00
Pieter-Jan Briers
99cd2adfc7 Clyde rendering optimizations. 2019-02-21 17:04:18 +01:00
Pieter-Jan Briers
052125e62a Fix clear not resetting enough state on OutputPanel. 2019-02-21 17:04:07 +01:00
Pieter-Jan Briers
8f61b898b7 Improve StyleBoxTexture API.
SetMargin has been deprecated in favor of the more clear SetPatchMargin.
Added SetExpandMargin.
2019-02-21 13:49:35 +01:00
Pieter-Jan Briers
eed8b670d1 Implement Control order control. 2019-02-21 13:33:09 +01:00
Pieter-Jan Briers
2e608e2e52 Implement OutputPanel with RichTextLabel in Godot. 2019-02-21 12:10:16 +01:00
Pieter-Jan Briers
6f5d16b55a Make RichTextLabel internal & fix some bugs.
It's never going to be re-implemented on Clyde,
so I'm making it internal so content doesn't try to touch it.

Also fixed ScrollFollowing not being set.

So uh... Godot. Mind explaining why call()ing a nonexistant function
is completely silent?
2019-02-21 12:09:41 +01:00
Pieter-Jan Briers
13b5b365e3 Implement Control.SetAnchorAndMarginPreset 2019-02-21 11:40:19 +01:00
Pieter-Jan Briers
96a622f94f OutputPanel as a simpler alternative to RichTextLabel.
Godot's RichTextLabel is extremely complicated to re-implement.
OutputPanel is a stripped down version that's significantly simpler.
It does what it needs to for the purposes we use RichTextLabel.
2019-02-21 02:11:27 +01:00
Pieter-Jan Briers
016fbc1e70 Clean up FormattedMessage a bit. 2019-02-21 02:07:34 +01:00
Pieter-Jan Briers
7bba1b52eb Controls now fire Resized correctly. 2019-02-21 02:04:05 +01:00
Pieter-Jan Briers
7ef499c1da Implement MouseWheel input. 2019-02-21 02:03:25 +01:00
Pieter-Jan Briers
0b0a5d4887 Add LineSeparation to Font. 2019-02-21 02:02:22 +01:00
Pieter-Jan Briers
8fe579a104 Fix bad doc comment in ShallowClone. 2019-02-20 14:50:43 +01:00
Pieter-Jan Briers
2c8a76a8ea Improve LineEdit mouse -> cursor position. 2019-02-19 19:56:37 +01:00
Pieter-Jan Briers
2e774c5b68 Rough but functional LineEdit. 2019-02-19 16:28:13 +01:00
Pieter-Jan Briers
acfb56dca2 Add StyleBox.GetContentOffset 2019-02-19 16:28:00 +01:00
Pieter-Jan Briers
8bd30ce72e Add UTF-16 surrogate check to OpenTK's KeyPress.
I'm not sure if this can happen but if it does I'd rather blow up and have to figure out why there's random surrogates all over the place.
2019-02-19 16:27:38 +01:00
Pieter-Jan Briers
b517481014 Make BoxContainer ignore visible controls.
While this behavior is debatable, I'm mimicking Godot's behavior here.
2019-02-19 15:02:58 +01:00
Pieter-Jan Briers
c8f8fbf964 KeyUp/KeyDown now handled by UI 2019-02-19 14:45:26 +01:00
Pieter-Jan Briers
79806c397c Use KHRDebug debug groups in rendering. 2019-02-19 13:25:50 +01:00
Pieter-Jan Briers
31d0bec93e Font metrics improvements.
Adds more data to CharMetrics.

TryGetCharMetrics.
2019-02-19 12:44:38 +01:00
Pieter-Jan Briers
c8b793a8fb Do not shy away from repeated key down events. 2019-02-19 12:44:06 +01:00
Pieter-Jan Briers
1c46a156c4 Automatic keyboard focus grabbing. 2019-02-19 09:19:07 +01:00
Pieter-Jan Briers
e3ff9bf4a7 Implement TextEntered event. 2019-02-19 00:08:10 +01:00
Pieter-Jan Briers
5af16c2ef4 Some refactorings related to implementing GUI keyboard input. 2019-02-18 23:28:31 +01:00
Pieter-Jan Briers
7462aeb8f3 Fix EntitySpawnWindow crash. 2019-02-18 23:27:41 +01:00
Pieter-Jan Briers
d838f568af Do not propagate mouse events to InputManager if intercepted by GUI 2019-02-18 11:21:12 +01:00
Pieter-Jan Briers
73a1f2ec61 Implement BoxContainer separation via CSS. 2019-02-18 09:03:24 +01:00
Pieter-Jan Briers
793ae245ac Skip nonexistant glyphs in font atlas generation. 2019-02-18 01:15:28 +01:00
Pieter-Jan Briers
e44c4275e7 Make element selectors use Type instead of type names. 2019-02-18 00:43:00 +01:00
Pieter-Jan Briers
af1137418a Implement Button font color. 2019-02-18 00:14:04 +01:00
Pieter-Jan Briers
052feee756 Remove DummyUserInterfaceManager.
It was a relic of Godot. UserInterfaceManager now runs under unit tests.
2019-02-17 23:52:07 +01:00
Pieter-Jan Briers
a73e966175 Unit test UserInterfaceManager. 2019-02-17 23:51:02 +01:00
Pieter-Jan Briers
40f635483b Fix incorrect relative positioning on mouse events. 2019-02-17 23:50:33 +01:00
Pieter-Jan Briers
a30de7659f Make mouse input do propagation correctly. 2019-02-17 19:10:53 +01:00
Pieter-Jan Briers
b202cc196d Fix edge cases with child selector by making Control.Restyle sorta recursive but not really. 2019-02-16 01:06:09 +01:00
Pieter-Jan Briers
386fc519e3 Fix some size bugs with Button styling. 2019-02-16 01:04:38 +01:00
Pieter-Jan Briers
8730d6a867 Make Button styling possible. 2019-02-16 00:56:49 +01:00
Pieter-Jan Briers
97fc8d6392 Implement GetDefaultContentMargin for StyleBoxTexture. 2019-02-16 00:56:34 +01:00
Pieter-Jan Briers
e0beaf638f Style classes for SS14Window elements. 2019-02-15 14:04:36 +01:00
Pieter-Jan Briers
9d3f501240 TextureButton CSS support. 2019-02-15 14:03:37 +01:00
Pieter-Jan Briers
4804b2de2c Add ExpandMargin to StyleBoxTexture. 2019-02-15 13:55:25 +01:00
Pieter-Jan Briers
00d7717c82 Panel style can be specified via CSS. 2019-02-15 13:55:05 +01:00
Pieter-Jan Briers
0a2a1420b1 Control ModulateSelf, Pseudo classes. 2019-02-15 13:54:53 +01:00
Pieter-Jan Briers
5612e589e0 Adds persistent modulate to DrawingHandle. 2019-02-15 13:48:07 +01:00
Pieter-Jan Briers
b5a3ef0ffb Adds multiply operator to Color. 2019-02-15 13:45:44 +01:00
Pieter-Jan Briers
a31f9223e7 Fix bad handling of font height. 2019-02-15 00:55:46 +01:00
Pieter-Jan Briers
d6625f9c6a Implement CSS-like stylesheets into GUI.
Label now reads properties from the CSS system.
2019-02-14 23:24:35 +01:00
Pieter-Jan Briers
0f935fc925 Stop log spam from OpenGL performance debug info. 2019-02-14 22:32:52 +01:00
Pieter-Jan Briers
19e767031d Fix edge case with texture param loading.
And unit test it. Gotta get that coverage.
2019-02-14 17:15:03 +01:00
Pieter-Jan Briers
7e22d724fe Texture load parameter system.
Basically now you can control whether a texture has filtering or wrapping enabled or whatever. Neat huh.
2019-02-14 16:49:15 +01:00
Pieter-Jan Briers
b5d9c54893 Clean up ResourcePath.
Also fix some issues pointed out by Sonar and Rider.
2019-02-14 15:12:07 +01:00
Pieter-Jan Briers
525cee8058 Add ResourcePath.WithName() 2019-02-14 15:04:18 +01:00
Pieter-Jan Briers
5b278e54e1 Control Position and Size set tests 2019-02-13 12:29:07 +01:00
Pieter-Jan Briers
3ccb1a4f2b Control layout related unit tests 2019-02-13 12:06:52 +01:00
Pieter-Jan Briers
63988e6554 I forgot to commit UnitTesting 2019-02-13 11:03:24 +01:00
Pieter-Jan Briers
ffda71dae2 Fix window dragging.
It was using Godot.OS which doesn't work on Clyde.
2019-02-13 00:28:26 +01:00
Pieter-Jan Briers
0b4173def9 Implement MouseMove events for GUI. 2019-02-13 00:23:31 +01:00
Pieter-Jan Briers
02d4e4cf10 Implement Control.GlobalMousePosition 2019-02-13 00:22:49 +01:00
Pieter-Jan Briers
e88daac8b7 Add Control.GlobalPosition 2019-02-13 00:22:28 +01:00
Pieter-Jan Briers
4fae142722 Fix bad Control.Position setter. 2019-02-13 00:21:52 +01:00
Pieter-Jan Briers
7aeb868f38 Implement TextureRect. 2019-02-12 22:59:38 +01:00
Pieter-Jan Briers
f829896da5 Implement hover textures in TextureButton. 2019-02-12 19:35:08 +01:00
Pieter-Jan Briers
f40a65a0f2 Fix center-aligned Label rendering, implement font color override rendering in Label. 2019-02-12 19:34:52 +01:00
Pieter-Jan Briers
4ce9da7af6 WiP CSS-like style sheets. 2019-02-12 00:29:28 +01:00
Pieter-Jan Briers
9c7adb7248 Make LineEdit be drawn at the very least. 2019-02-11 15:13:38 +01:00
Pieter-Jan Briers
f6d8c5506b Fix sonar fraction loss complaints. 2019-02-11 14:16:26 +01:00
Pieter-Jan Briers
3c3396c461 Fix bad conditions in Container.FitChildInBox.
Thanks Sonar.
2019-02-11 14:14:42 +01:00
Pieter-Jan Briers
a4d567a3ec Make DebugCoordsPanel suck less. 2019-02-11 14:12:49 +01:00
Pieter-Jan Briers
efc47ee3f5 Vector2i ToString. 2019-02-11 14:11:11 +01:00
Pieter-Jan Briers
0eb702d68d Make hovered control accessible on UserInterfaceManager. 2019-02-11 12:53:50 +01:00
Pieter-Jan Briers
2a9769ff4f Implement mouse entered/exited.
And use it to implement button hovering.
2019-02-11 12:50:21 +01:00
Pieter-Jan Briers
e7b5e2a9bb Implement TextureButton roughly. 2019-02-11 12:37:19 +01:00
Pieter-Jan Briers
e1d064158c Fix TextureRect tscn loading. 2019-02-11 12:37:04 +01:00
Pieter-Jan Briers
b8c6100ab7 Prevent crash when sneezing. 2019-02-11 11:53:17 +01:00
Pieter-Jan Briers
c7fe2bb876 Mostly implement Label VAlign. 2019-02-11 11:52:45 +01:00
Pieter-Jan Briers
0c9d6f0f91 Make Options menu work. 2019-02-11 11:40:47 +01:00
Pieter-Jan Briers
605b541010 Improve button press handling. 2019-02-11 11:29:27 +01:00
Pieter-Jan Briers
f7147464c6 Button input sorta works 2019-02-11 10:16:33 +01:00
Pieter-Jan Briers
eedeb5214b Invalidate batch buffers to make life easier on Mesa 2019-02-11 09:45:04 +01:00
Pieter-Jan Briers
f40d94f39f You saw nothing 2019-02-11 09:02:44 +01:00
Pieter-Jan Briers
c70df3f504 Make Control input virtuals protected internal 2019-02-11 09:01:20 +01:00
Pieter-Jan Briers
8fa3f25f98 Fix BoxContainer layout. 2019-02-10 23:21:15 +01:00
Pieter-Jan Briers
2c0589166a Give Control a ToString to ease debugging. 2019-02-10 22:42:54 +01:00
Pieter-Jan Briers
1f28850477 Give TextureRect a minimum size so it draws something. 2019-02-10 22:41:18 +01:00
Pieter-Jan Briers
484fa31b23 Load button align from tscn. 2019-02-10 22:26:07 +01:00
Pieter-Jan Briers
60518cdc3a Handle Control size flags in containers. 2019-02-10 22:26:00 +01:00
Pieter-Jan Briers
84e6ad230b Fix unit tests. 2019-02-10 00:00:34 +01:00
Pieter-Jan Briers
985a9a798e Some work towards GUI input.
Implemented a basic screen coord -> control lookup method.
2019-02-09 23:51:20 +01:00
Pieter-Jan Briers
8f6fc42207 Implement buttons and texture rect somewhat. 2019-02-09 13:51:38 +01:00
Pieter-Jan Briers
773ad46165 Don't modify margins to fit minimum size. 2019-02-09 13:51:17 +01:00
Pieter-Jan Briers
f26b109126 Implement Label Align sorta jankily. 2019-02-08 17:38:35 +01:00
Pieter-Jan Briers
08c2737d58 Load label text from Godot assets. 2019-02-08 15:51:08 +01:00
Pieter-Jan Briers
e6191dd823 Systems for loading sub resources like StyleBoxes from Godot resources. 2019-02-08 15:45:00 +01:00
Pieter-Jan Briers
ccca5b69ea Implement more of StyleBox
Texture style boxes now render and there's a bunch of properties like ContentMargin that Godot has but we didn't.
2019-02-08 14:04:28 +01:00
Pieter-Jan Briers
673c2705ac Basic UI theming system.
Not great but it gets the job done.
2019-02-08 14:03:35 +01:00
Pieter-Jan Briers
86175c7b6f Implement Control.SetMarginsPreset 2019-02-08 14:02:07 +01:00
Pieter-Jan Briers
deb86273fe Fix grid rendering being offset. 2019-02-08 14:01:26 +01:00
Pieter-Jan Briers
a54382f9b7 Box2 variants get a ToString(). 2019-02-08 14:00:29 +01:00
Pieter-Jan Briers
86da0fc88d Round control positions before rendering.
This is to fix rounding errors.

Ideally the GUI system should just straight up use integral pixel coordinates but oh well.
2019-02-08 14:00:13 +01:00
Pieter-Jan Briers
d92cb2603c Change type of SS14Window to fix drawing of it. 2019-02-08 13:59:07 +01:00
Pieter-Jan Briers
a583de32bc Fix order issues with Control property application. 2019-02-06 12:50:53 +01:00
Pieter-Jan Briers
d21863abb9 Remove unused field in FixedEye 2019-02-06 12:23:26 +01:00
Pieter-Jan Briers
55efca6b7d _doUpdateLayout works without parent. 2019-02-06 12:19:03 +01:00
Pieter-Jan Briers
411495ce95 Apply some GUI properties from loaded scene files. 2019-02-06 12:13:59 +01:00
Pieter-Jan Briers
307c94b399 Make GUI layout updates propagate even for parentless controls. 2019-02-06 12:13:45 +01:00
Pieter-Jan Briers
f79e733b1e Resize UIRoot when window size changes. 2019-02-06 12:12:52 +01:00
Pieter-Jan Briers
5b3511b951 Parse properties from Godot scene files. 2019-02-06 12:12:39 +01:00
Pieter-Jan Briers
38cab68f89 Fix Control.SetAnchorsPreset being incorrect. 2019-02-06 12:11:57 +01:00
Pieter-Jan Briers
cdbf95bbc8 Implement a default font 2019-02-06 00:00:13 +01:00
Pieter-Jan Briers
0b76613f38 Fix grid rendering being offset 2019-02-05 23:48:13 +01:00
Pieter-Jan Briers
9fd3fdf21a Re-implement godot naming conflict avoidance in GUI to avoid crashes 2019-02-05 23:35:00 +01:00
Pieter-Jan Briers
10cc81ca5a Fix mouse position fetching 2019-02-05 23:24:56 +01:00
Pieter-Jan Briers
5072873ea1 Fix glyph metric race conditions 2019-02-05 23:10:52 +01:00
Pieter-Jan Briers
10470c65ef Make Label work 2019-02-05 22:36:59 +01:00
Pieter-Jan Briers
b541a3c40a Add fontdpi to config file 2019-02-05 21:10:45 +01:00
Pieter-Jan Briers
c99807e9c9 Fix handling of space glyph advance 2019-02-05 21:10:08 +01:00
Pieter-Jan Briers
93277e2333 More font work 2019-02-05 21:00:38 +01:00
Pieter-Jan Briers
e87ee17ada Adventures into font rendering 2019-02-05 20:02:06 +01:00
Pieter-Jan Briers
79c7b0164d Change z of final meshes to improve mesh view in RenderDoc 2019-02-05 20:01:28 +01:00
Pieter-Jan Briers
006342e4d8 Fix subregion batching in screen space. 2019-02-05 19:13:14 +01:00
Pieter-Jan Briers
4efca634b2 Allow loading of Image<Alpha8> images. 2019-02-05 16:21:34 +01:00
Pieter-Jan Briers
3c587eec49 Add Vector2i.ComponentMin/Max methods. 2019-02-05 16:20:40 +01:00
Pieter-Jan Briers
c170345b7f Implement BoxContainer layout 2019-02-04 21:09:07 +01:00
Pieter-Jan Briers
5dda42868c Fix GUI under Godot 2019-02-04 16:33:40 +01:00
Pieter-Jan Briers
c8a949d115 Implement basic GUI layout. 2019-02-04 16:27:07 +01:00
Pieter-Jan Briers
32f4e8c410 Preparations for GUI rendering 2019-02-03 19:54:19 +01:00
Pieter-Jan Briers
8d8dc9f3ce Texture Array based batching 2019-02-03 17:40:30 +01:00
Pieter-Jan Briers
d2b230c6a4 Use an UBO for projview matrices 2019-02-02 01:50:23 +01:00
Pieter-Jan Briers
2f93d8855e Use ShaderProgram 2019-02-01 00:40:41 +01:00
Pieter-Jan Briers
0ac9b94099 Use new Buffer wrapper API 2019-01-31 21:27:30 +01:00
Pieter-Jan Briers
ecd88b3752 Rewrite Buffer API already 2019-01-31 20:16:01 +01:00
Pieter-Jan Briers
48069ad519 Utility classes to wrap OpenGL objects. 2019-01-31 18:20:46 +01:00
Pieter-Jan Briers
6df91d5b19 Fix listed GLSL versions to 410. 2019-01-29 00:32:25 +01:00
Pieter-Jan Briers
6b5cbc5494 Rename DisplayManagerOpenGL to Clyde.
And give it its own namespace.
2019-01-29 00:30:58 +01:00
Pieter-Jan Briers
165538c265 Add ability to load ArrayTextures
Drawing does not work yet.
2019-01-29 00:23:01 +01:00
Pieter-Jan Briers
705a3dbfcc Move frame update to gameloop update 2019-01-28 16:37:20 +01:00
Pieter-Jan Briers
ff16ee1472 Mouse input implemented but it doesn't seem to work 2019-01-28 16:29:51 +01:00
Pieter-Jan Briers
1943cfd1b4 Implement texture rect drawing to simplify code 2019-01-28 15:25:02 +01:00
Pieter-Jan Briers
093a68dbc4 Fix crash on shutdown 2019-01-28 13:52:14 +01:00
Pieter-Jan Briers
0683202ce4 Actually bind VAO instead of relying on luck 2019-01-27 12:12:45 +01:00
Pieter-Jan Briers
23305e53a7 Actually implement batch positions 2019-01-27 11:59:20 +01:00
Pieter-Jan Briers
5c05ef98de Bikeshed painted 2019-01-27 01:24:36 +01:00
Pieter-Jan Briers
563dcc804e Switch to struct handles to avoid mixing things up 2019-01-27 01:12:36 +01:00
Pieter-Jan Briers
a55ef4268f Fixed texture mixup 2019-01-27 00:27:30 +01:00
Pieter-Jan Briers
0269a74bc7 Work in progress OpenGL batching 2019-01-26 23:39:48 +01:00
Pieter-Jan Briers
250d80eb8b Code cleanup in preparation of batching 2019-01-26 19:06:33 +01:00
Pieter-Jan Briers
b460404b7f Load textures with ImageSharp 2019-01-26 14:47:06 +01:00
Pieter-Jan Briers
88b8705b7b OpenGL 4.1 and maybe even 3.x support. 2019-01-26 14:07:29 +01:00
Pieter-Jan Briers
76280f46f9 Rename GameController.Headless to Standalone
This better fits the actual function of it now.
2019-01-26 00:07:16 +01:00
Pieter-Jan Briers
5eabe39fc4 Preparations for UI rendering 2019-01-26 00:06:25 +01:00
Pieter-Jan Briers
3de36d7a38 Implement sprite draw depth in OpenGL 2019-01-25 17:11:59 +01:00
Pieter-Jan Briers
492d0b14d0 Fix splash screen and screen space texture flipping 2019-01-25 16:38:18 +01:00
Pieter-Jan Briers
6a08536f7c Fix GraphicsContextFlags in Debug 2019-01-25 15:27:49 +01:00
Pieter-Jan Briers
361fdbe684 OpenGL 4.5 rendering backend (#728)
This is a really crappy OpenGL 4.5 rendering backend. Doesn't draw a lot of things but it's a hell of a lot better than Godot in the stability department. Mostly.

It's far from production ready but I already wrote all this. There's some minor API improvements in here too.
2019-01-25 14:57:11 +01:00
Pieter-Jan Briers
67c962b612 Add .directory to gitignore 2019-01-23 15:27:12 +01:00
Pieter-Jan Briers
dbc88e253b Allow client to run headlessly. (#727)
AKA Without Godot.

Still links against GodotSharp, but this does mean that you can run headless or not from the same binary.
2019-01-19 18:23:41 +01:00
Pieter-Jan Briers
58fb11a989 Refactor map netcode. (#726)
Maps are now synchronized as part of game states.
This instantly fixed all race conditions and the client can now live through a round restart with 0 problems (outside of Godot crashing yay).
2019-01-19 00:39:55 +01:00
Pieter-Jan Briers
8d58ad304a Fix collidable already registered spam 2019-01-18 12:04:43 +01:00
Pieter-Jan Briers
6d9a1a4e43 Refactor Transforms. (#725)
See commits.
2019-01-18 11:35:57 +01:00
Pieter-Jan Briers
6873ad70f4 Fix incorrect control disposal order 2019-01-17 20:52:10 +01:00
Pieter-Jan Briers
21ddbc1433 Modernize texture loading to use load_png_from_buffer 2019-01-17 20:51:21 +01:00
Pieter-Jan Briers
68a9b3e6ce Remove some debug logging. 2019-01-17 18:27:25 +01:00
Pieter-Jan Briers
6ee26df088 Remove hack now that godot #21667 is fixed 2019-01-17 18:24:27 +01:00
Pieter-Jan Briers
aa36a9e378 Make the code work on Godot 3.1 Alpha 4. (#724) 2019-01-17 18:11:16 +01:00
Acruid
a500a42d6f Instanced IoCManager (#723)
I took the functionality of `IoCManager` and moved it into a non-static class. This new class is called `DependencyCollection`. The static `IoCManager` is now just a proxy to a `DependencyCollection` singleton. I also added the ability to directly register instances into the collection. The Smocks library was added to `SS14.UnitTesting`.

This is super useful for unit testing, because now you can register mock instances directly into the collection and then other services can resolve them. You can also apply a shim to static `IoCManager` calls and handle them properly. Because the collection is instanced, we can now run tests in parallel (with a shim) that modify `IoCManager`. The Smocks library gives us the ability to shim static method calls.
2018-12-31 11:01:05 +01:00
Pieter-Jan Briers
d8ee7249e9 Fix Travis (#722)
Dear god.

Fuck Python.
2018-12-21 12:50:11 +01:00
Pieter-Jan Briers
a330deb249 Step 1 in fixing Travis 2018-12-21 00:49:31 +01:00
digitalis
8813d90bcb Convert PushInheritance to iteration in EntityPrototype (#718)
fixes the "TODO: remove recursion somehow" comment
2018-12-13 20:04:00 +01:00
Acruid
3cd7690c58 Unparent transform fix. (#719)
* Fixed bug where godot node is not being sync'd with SS14 transform when unparenting.

* CanInsert does not throw an exception when creating a loop.
2018-12-13 14:48:16 +01:00
Pieter-Jan Briers
4d9a243685 Keep track of child entities of transforms. 2018-12-02 13:58:33 +01:00
Pieter-Jan Briers
c76f791799 Leak shaders to work around Godot issue #24108 2018-12-01 23:41:25 +01:00
Pieter-Jan Briers
921a9de1fa Random normal distribution helper 2018-12-01 16:53:28 +01:00
Pieter-Jan Briers
468accfb08 Remove audio load debug message 2018-12-01 15:18:21 +01:00
Pieter-Jan Briers
028b8cabb9 Client-side command history 2018-11-30 17:25:54 +01:00
Pieter-Jan Briers
7c4eeb136f Add below world screen overlay. 2018-11-29 23:48:39 +01:00
Pieter-Jan Briers
6fd5e166b6 Vector deconstruction operators. 2018-11-29 23:20:08 +01:00
Pieter-Jan Briers
e427373f16 Fix Color.Blend 2018-11-29 22:26:56 +01:00
Pieter-Jan Briers
94b8359644 Bypass Mono's bullsit SharpZipLib version. 2018-11-29 22:23:05 +01:00
Pieter-Jan Briers
0fcfe1c2a4 Move to .NET 4.7.1 2018-11-29 22:22:44 +01:00
Pieter-Jan Briers
d478e2fdbb Add color dst/src factor blend helper. 2018-11-29 21:36:54 +01:00
Pieter-Jan Briers
d0e8ed10b8 Mark GodotConversions as internal. 2018-11-29 21:36:15 +01:00
Pieter-Jan Briers
4a5e330be5 Add ImageSharp for texture generation. 2018-11-29 21:36:02 +01:00
Pieter-Jan Briers
a57d9910f1 Add component-wise Vector3 multiply. 2018-11-29 21:35:16 +01:00
Pieter-Jan Briers
6ea25f95df Clean up bloat in WritableDirProvider.cs 2018-11-29 21:34:43 +01:00
Pieter-Jan Briers
6dc2b4ca0e Pull content assemblies directly from their bin folder. 2018-11-29 21:34:20 +01:00
Pieter-Jan Briers
7aa2acf652 Fix broken log calls in AssemblyLoader. 2018-11-29 21:33:56 +01:00
Pieter-Jan Briers
c3b857343f Throw if prototypes get accessed before first load.
Fixes #716
2018-11-29 13:44:50 +01:00
Pieter-Jan Briers
4f48774a26 Rust-based noise generation API. (#715)
Supports tileable 2D, 2D, 3D & 4D Ridged & FBM noise.

I still need to generate native versions for all the platforms, so we can't merge this yet.
2018-11-29 10:43:59 +01:00
Pieter-Jan Briers
50d6097c51 I could've sworn I pushed this. 2018-11-29 09:02:03 +01:00
Pieter-Jan Briers
535905d993 Thread safety on the client too. 2018-11-28 22:49:55 +01:00
Pieter-Jan Briers
e3f702781f Logging improvements.
1. Logging is now thread safe.
2. Slight optimizations.
2018-11-28 22:31:09 +01:00
Pieter-Jan Briers
04396b4397 Replace all occurences of GetComponent<ITransformComponent>() 2018-11-28 21:24:18 +01:00
Pieter-Jan Briers
bfba5c4f94 Minor LINQ-removing optimizations. 2018-11-28 21:16:22 +01:00
Pieter-Jan Briers
2c41750dad Fix incorrect entity message queuing.
The entity manager is supposed to delay entity messages of which the entity doesn't exist (presumably because it *might* due to networking).

Problem is that somebody put a .Clear() at the end right after re-filling the queue.

Wasn't me.
2018-11-28 20:43:57 +01:00
Pieter-Jan Briers
f1fd386614 Remove a bunch of unused local variables. 2018-11-28 10:08:30 +01:00
Pieter-Jan Briers
88fa4072f3 Remove old dead code, minor cleanup. 2018-11-28 09:38:44 +01:00
Pieter-Jan Briers
8397c955a8 Map Pausing. (#710)
You can now "pause" a map. Ideally this would result in the map not doing significant processing until unpaused.

This can be used later to code proper map editor modes that won't have any side effects while being edited.
2018-11-27 00:32:45 +01:00
Pieter-Jan Briers
1e00b864b4 Automatically log in people connecting from localhost. (#711)
This can be disabled with a config value, which should be done for production servers, but for local testing this is very convenient.
2018-11-27 00:32:28 +01:00
Pieter-Jan Briers
e0f8c10978 Add documentation on status server. 2018-11-26 15:12:04 +01:00
Pieter-Jan Briers
21fd3e5d96 Server status framework. (#709)
Adds a HTTP server to the server that exposes `/status` to fetch the server status.
2018-11-26 09:58:58 +01:00
Pieter-Jan Briers
baff29362a Allow VVing IoC services. 2018-11-25 16:38:40 +01:00
Pieter-Jan Briers
861aabbe9b Fix client run level not resetting to Initialize on disconnect. 2018-11-25 14:09:25 +01:00
Pieter-Jan Briers
8baf7e46a4 Fix exception on client close. 2018-11-25 13:11:25 +01:00
Pieter-Jan Briers
ba072c2abd GameScreen is no longer in charge of the chat box. 2018-11-25 12:51:10 +01:00
Pieter-Jan Briers
a00e20b91c Fix client not correctly detaching from entities.
It would only detach if it had a new entity to attach to, not if the new entity is null.
2018-11-24 19:10:26 +01:00
Pieter-Jan Briers
812a9066e5 Chatbox UI improvements.
Now uses proper containers.
2018-11-24 19:08:49 +01:00
Pieter-Jan Briers
10b2073f21 IPlayerManager.GetAllPlayerData()
This is to be able to catch player data on players that're disconnected at the moment.
2018-11-24 19:07:46 +01:00
Pieter-Jan Briers
73715552e4 PlayerSession.AttachEntity(null) now does not throw. 2018-11-24 19:07:12 +01:00
Pieter-Jan Briers
18133af09f Hide go.sys log spam. 2018-11-23 10:55:25 +01:00
Pieter-Jan Briers
2c05701c8a Remove data like server motd from engine-level handshake. 2018-11-23 10:52:27 +01:00
Pieter-Jan Briers
e3449e454b Remove InLobby client side. (#708)
Same deal as #706, the concept of a lobby should be handled purely content side so it's no longer the engine's problem.
2018-11-22 23:06:50 +01:00
Pieter-Jan Briers
67b766b07e Remove debug code from NetPeer.Internal.cs 2018-11-22 09:12:12 +01:00
Pieter-Jan Briers
5c977b6f07 Make EyeManager resilient to invalid grid IDs 2018-11-22 00:51:47 +01:00
Pieter-Jan Briers
8320339ab0 Fix FinishEntity not doing initializations correctly 2018-11-22 00:18:46 +01:00
Pieter-Jan Briers
fcc405e6b6 Remove ServerRunLevel. (#706)
It's a content-ish feature that should be implemented in content only.
2018-11-21 21:20:51 +01:00
Pieter-Jan Briers
153b57ed56 IPv6 & multi-peer NetManager support. (#705)
1. IPv6 support. Woo!
2. NetManager can now explicitly bind to adresses and work with multiple peers. ~~I thought I needed this for IPv6 because I forgot about IPv4-mapped adresses, but the code's written so let's keep it.~~ OpenBSD doesn't support IPv4-mapped IPv6 addresses so effort not wasted.
2018-11-21 20:57:47 +01:00
Pieter-Jan Briers
1fc18c3538 Add a few extension methods to ease netmessage serialization. 2018-11-21 20:20:13 +01:00
Pieter-Jan Briers
8c093b827e Make NetMessage constructor accessible to content. 2018-11-21 20:19:49 +01:00
Pieter-Jan Briers
91b8312e99 Add Modulate to Control 2018-11-21 10:02:00 +01:00
Acruid
cfda72b771 Fixed bugs with remote closing UI windows on clients. (#702)
Clients are now unsubscribed from entities when they move out of range.
2018-11-20 19:28:08 +01:00
Pieter-Jan Briers
69c0d409c8 Add Nullspace static to GridLocalCoordinates 2018-11-19 21:05:43 +01:00
Pieter-Jan Briers
62aeb8b1e3 Add ScreenCoordinates.AsVector 2018-11-19 09:23:30 +01:00
Pieter-Jan Briers
448042afdd PopupHide hook for Popup 2018-11-14 23:08:44 +01:00
Pieter-Jan Briers
b3515d1b0b Raise entity system network messages to specific clients. 2018-11-12 23:26:46 +01:00
Acruid
872e9cf43f Fix Container Crash (#701)
* Transforms now unparent themselves before being removed.
Fixed crash with removing deleted entities from containers.

* Removed ClickedOnEntityMessage, use the Input System.
2018-10-30 22:07:32 +01:00
Acruid
5ae665c3d2 Collision Groups (#699)
* Removed unused types from Physics system.

* Made CollisionEnabled actually work.
Added Collision group system.
CollidableComponent now registers the collidable in Startup instead of OnAdd.
Fixed BoundingBoxComponent namespace.

* Fixes a bug with adding components remotely.
Adds setters to the new ICollidable properties.

* Fixed unit tests.
2018-10-28 21:51:23 +01:00
Acruid
307030ec8f Client IPlayerSession Interface. (#696)
* Added new IPlayerSession interface to client.
Removed session interfaces out of the lame `Interfaces` namespace.

* Fixed a doc comment.
2018-10-26 00:15:42 +02:00
Acruid
d8ca95db0c No More Physics Buckets (#694)
* Converted everything (I think) to ICollidable.

* Renamed CollisionManager to PhysicsManager.
Removed the bucket system out of the PhysicsManager.
RayCastResults.Distance was changed from PositiveInfinity to 0f when no entity is hit.

* Soft collidables (bullets) work again.
2018-10-26 00:15:24 +02:00
Acruid
a6d2a3497a GetComponentInstances() (#695)
Added a function to get the unique component instances, instead of unique types.

Resolves https://github.com/space-wizards/space-station-14/issues/636.
2018-10-26 00:15:10 +02:00
Acruid
c4c6c67599 Added a Close function to UI windows. (#693) 2018-10-22 20:18:19 +02:00
Acruid
bc99875979 Adds LayerGetState function. (#692) 2018-10-21 22:59:25 +02:00
Pieter-Jan Briers
61185f3bde Make IApproxEquatable have an in type param 2018-10-20 14:43:35 +02:00
PJB3005
96802bdbe0 Fix Travis unit tests hopefully 2018-10-16 09:28:33 +02:00
PJB3005
60e6a56b30 Fix TypeHelpers_Test using Godot instead of SS14.Shared.Maths. 2018-10-16 09:21:12 +02:00
PJB3005
8e5f8d1125 Fix incorrect client GUID in SS14.UnitTesting.csproj 2018-10-16 09:21:12 +02:00
Pieter-Jan Briers
f801511d5c Fix Travis looking for NUnit 3.8 2018-10-14 17:17:19 +02:00
Pieter-Jan Briers
7156e3ee74 Unit test the timer system some. 2018-10-14 17:13:48 +02:00
Pieter-Jan Briers
c28547490c Make IoCManager.Resolve Pure. 2018-10-14 16:52:44 +02:00
Pieter-Jan Briers
6efcfaeaa1 PointerInputCmdHandler gets screen location. 2018-09-30 13:16:31 +02:00
Pieter-Jan Briers
8d119549c7 Make client input system public 2018-09-30 13:15:29 +02:00
Pieter-Jan Briers
504ffd55ab Make Godot-referencing methods on Control internal. 2018-09-23 17:31:42 +02:00
Pieter-Jan Briers
27dd1055f5 Open(UIBox2) for Popup control. 2018-09-23 16:50:25 +02:00
Pieter-Jan Briers
28e4573afe Add a NotNull assertion. 2018-09-23 16:50:05 +02:00
Pieter-Jan Briers
ba3e944f44 Give some more structs readonly.
Also gave ScreenCoordinates ToString and Serializable.
2018-09-23 16:07:45 +02:00
Pieter-Jan Briers
e8ff251b12 Fix SS14Window resizing. 2018-09-21 21:32:28 +02:00
Pieter-Jan Briers
5eee3de527 Serialize container data to map files. 2018-09-21 20:06:55 +02:00
Pieter-Jan Briers
a7800348d7 Components added outside of the prototype are now loaded from map files correctly. 2018-09-21 20:06:39 +02:00
Pieter-Jan Briers
16dc444dbe Fix context passing of nested YamlObjectSerializers. 2018-09-21 20:05:50 +02:00
Pieter-Jan Briers
bf9b0e8aef Worn items are not serialized. 2018-09-21 08:36:34 +02:00
Pieter-Jan Briers
136b470b36 Adds a command to reload cached resources. 2018-09-20 22:19:28 +02:00
Pieter-Jan Briers
833c6ec37d A horrible thing. 2018-09-20 19:33:33 +02:00
PJB3005
a4ebf7d31a Fix eyes throwing an exception when mob is detached and deleted at the same time. 2018-09-20 18:09:51 +02:00
PJB3005
894c52db09 PhysicsComponent safety BB check moved to Initialize.
Where it belongs. OnAdd() runs *while* adding components, not after. Not all components exist yet.
2018-09-20 18:09:24 +02:00
PJB3005
e118888f96 Remove requirement for players to have a bounding box. 2018-09-20 18:08:48 +02:00
PJB3005
5ff85123d5 Move entity/map start/stop to BaseClient.
Previously the GameController was in control of starting the EntityManager, and GameScreen responsible for shutting it and MapManager down.

There was no way to restart the Entity Manager.

This commit makes the start/stopping be handled in the connection procedure of BaseClient.

@Acruid please review.
2018-09-20 14:56:35 +02:00
Pieter-Jan Briers
7ee48c4a7b Fix some missing CultureInfo.InvariantCulture 2018-09-19 18:43:06 +02:00
Pieter-Jan Briers
99ab6fce9c Sprite Layer Map improvements.
Can now be loaded from a prototype.
If loaded from a prototype, it's flyweighted.
2018-09-19 18:36:33 +02:00
Pieter-Jan Briers
bf9315358d Fix bug where per-layer RSIs did not work on prototype load. 2018-09-19 18:35:19 +02:00
Pieter-Jan Briers
4e236be85d Clean up Transform_Test.cs some more. 2018-09-19 13:40:51 +02:00
Pieter-Jan Briers
11394c5fea Fix ParentMapSwitchTest.
Also cleaned it up slightly, but that shouldn't affect the results.
2018-09-19 13:38:57 +02:00
Pieter-Jan Briers
9d1dc0b61e Fix sprite layer direction desyncing on join. 2018-09-18 22:06:55 +02:00
Pieter-Jan Briers
1e06c8181f Remove debug log message from sprite component. 2018-09-18 20:52:37 +02:00
Pieter-Jan Briers
512d99c900 Remove spammy audio system log. 2018-09-18 20:52:05 +02:00
Pieter-Jan Briers
d74a6e41d9 Fix syncing of parented components. 2018-09-18 20:48:04 +02:00
Pieter-Jan Briers
02c844a396 Adds an abstract field to entity prototypes to hide them in the entity spawn panel. 2018-09-18 19:06:18 +02:00
Pieter-Jan Briers
afdfd9ed5c Alphabetically sort entity spawn list. 2018-09-18 18:16:21 +02:00
Pieter-Jan Briers
87f3a1f6e3 Fix stacked layer rendering. 2018-09-18 17:50:48 +02:00
PJB3005
dbe18df32e Use a default shaded texture instead of no shader.
Shouldn't matter in practice, but it does. Godot's 2D renderer is turbo fucked. Yay.
2018-09-18 17:27:32 +02:00
PJB3005
ae408d7674 Fix setting SpriteComponent texture: "" server side. 2018-09-18 17:26:51 +02:00
PJB3005
aa61eb3483 Ensure all entities exist before applying entity states.
If not, an entity state could reference another, not yet instantiated, entity. (transform parenting did this sometimes)
2018-09-18 15:13:35 +02:00
PJB3005
df21d0db14 Fix RSI schema to make flags and selectors optional. 2018-09-18 15:09:10 +02:00
Pieter-Jan Briers
7f12355f34 Add AddBlankLayer() to SpriteComponent 2018-09-18 08:09:23 +02:00
Pieter-Jan Briers
0d9e748cd0 And push the csproj because I'm dumb. 2018-09-17 21:33:20 +02:00
Pieter-Jan Briers
5d1f34a3c9 Remove dead file SpriteComponentState.cs 2018-09-17 21:32:51 +02:00
Pieter-Jan Briers
6bb34e9456 Add a client command line arg to automatically connect.
Pass --connect and you don't even have to hit the connect button anymore.
2018-09-17 21:11:19 +02:00
Pieter-Jan Briers
7f74ae7b61 ldrsc command.
I coded this to test something. No reason to just delete the code forever so I'm committing it.
2018-09-17 20:01:57 +02:00
Pieter-Jan Briers
8ca36380ce Improve Matrix3 Transform API. 2018-09-17 19:42:24 +02:00
Pieter-Jan Briers
03075641ab Make ScreenToWorld correctly output relative grid coordinates. 2018-09-17 18:58:31 +02:00
Pieter-Jan Briers
b6ec18fa6b Fix docs blunder. 2018-09-17 18:57:57 +02:00
Pieter-Jan Briers
428596312e Attempt to fix broken zoomed screen -> world conversions. 2018-09-17 16:45:42 +02:00
Pieter-Jan Briers
2ef1839304 Fix Matrix3 <-> Godot.Transform2D conversions. 2018-09-17 16:45:21 +02:00
Pieter-Jan Briers
e1d1a8ea9d Fix some angle related issues.
Guns work again.
2018-09-17 12:34:05 +02:00
Pieter-Jan Briers
9e888ab28e Improve RayCastResult documentation 2018-09-17 12:33:49 +02:00
Pieter-Jan Briers
76df7dda88 Make angles use degrees in YAML.
They can be parsed as radians if suffixed with "rad"
2018-09-17 12:33:10 +02:00
Pieter-Jan Briers
ef77ae14f6 Actually commit .csproj changes. 2018-09-17 12:28:16 +02:00
Pieter-Jan Briers
a56f9b7dc5 Improve time panel layout. 2018-09-17 12:27:54 +02:00
Pieter-Jan Briers
f2bac93c18 Fix color of NetDebugPanel 2018-09-17 12:26:06 +02:00
Pieter-Jan Briers
04bf1782e9 Commands to show game time. 2018-09-17 12:25:52 +02:00
Pieter-Jan Briers
4c0e9bf1c7 Mark AudioParams.With<X> methods as Pure. 2018-09-17 12:24:20 +02:00
Pieter-Jan Briers
0079fea2d3 Cleans up some seemingly-issues. 2018-09-17 10:41:35 +02:00
Pieter-Jan Briers
796626b7d8 Y+ Up (#691) 2018-09-17 10:22:49 +02:00
Pieter-Jan Briers
ec02d6480a Project file maintenance, C# 7.2 (#690)
1. Updates all the NuGet packages (except CommandLineParser because they ruined their API)
2. Makes all projects use C# 7.2 explicitly. (not latest)
3. Use some C# 7.2 features like readonly structs and default literals.
2018-09-13 20:09:20 +02:00
Pieter-Jan Briers
16d56bc810 VV Refactor. (#689)
* VV Refactor.

Yes I just wrote it and it's already inadequate and filled with legacy code.

Instances and sessions were a terrible idea, they're getting replaced with "traits".

It's not even more modular.

Practical difference: it now supports private members, fields and displaying things implementing IEnumerable.

* Clean up code, fix some bugs. Document everything.

* Fix broken unit tests.
2018-09-12 17:56:28 +02:00
PJB3005
523e4d8c49 Fix compiler warning 2018-09-09 14:45:54 +02:00
PJB3005
dbb9fb8cf3 Fixes Travis unit tests. 2018-09-09 14:42:34 +02:00
Pieter-Jan Briers
43a270d486 View Variables (#683) 2018-09-09 14:32:55 +02:00
Remie Richards
cc89b3af0d Adds a var to forcibly show a godot transform. (#682) 2018-09-08 17:36:39 +02:00
Centronias
850e48d118 Client name change command (#681)
Adds member field to BaseClient to hold onto override name string. Figured that was the closest place to the usage, so why not stick it there.
On connecting to the server, the client will prefer to use that name, if it's set, over the name from the configuration.

Adds client console command to set that field.

Fixes #660
2018-09-04 16:12:02 +02:00
Centronias
f23f2f5a95 Math unit tests (#679)
Handful of unit tests for more of the math stuff along with minor changes to implementations fixing some bugs found by the tests.
2018-09-04 16:11:03 +02:00
Pieter-Jan Briers
6e95476156 Make all resources accessible to Godot. (#677) 2018-08-31 10:48:22 +02:00
PJB3005
a1f3c5fdbb Remove public setter on Angle.Zero. 2018-08-30 12:16:27 +02:00
PJB3005
230032421b Fix dead reference to SavedEntities.xml 2018-08-30 12:16:12 +02:00
PJB3005
f266afbd4d Fixes compiler warning 2018-08-30 12:07:18 +02:00
PJB3005
5dfeb7c8aa Fixes debugging of SS14.Shared.Maths on the client. 2018-08-30 12:04:59 +02:00
Pieter-Jan Briers
41e955e980 Entity-bound UI system. (#676)
Keeps track of which clients have a GUI open and such.
2018-08-30 11:59:58 +02:00
Pieter-Jan Briers
0fdbb48f9d GameScreen.GetEntityUnderPosition (#669)
Fixes #603
2018-08-30 11:43:20 +02:00
Pieter-Jan Briers
f5d9b64db5 Fix debugging of Content in Rider. (#670) 2018-08-30 11:42:16 +02:00
Pieter-Jan Briers
a750db22df Add ProgressBar Control wrap. (#675) 2018-08-30 11:41:51 +02:00
Pieter-Jan Briers
a7b6509d9f Add an event for when SS14Window is closed. (#674) 2018-08-30 11:41:36 +02:00
Pieter-Jan Briers
a6f4aacc37 Allow Control.GetChild to use /. (#673)
Just like Godot, you can now do `GetChild("A/B")`
instead of `GetChild("A").GetChild("B")`
2018-08-30 11:41:21 +02:00
Pieter-Jan Briers
4624051540 Adds ObjectSerializer.ReadStringEnumKey (#672)
Fixes #626
2018-08-30 11:40:44 +02:00
Pieter-Jan Briers
b3a3bbfc22 Fix bug with changing between animated RSI states causing exceptions. (#671) 2018-08-30 11:39:03 +02:00
clusterfack
7225e24e1c Two small fixes
Makes AABB of grids expand to the correct size
Removes redundant world position setting during spawn
2018-08-28 02:13:31 -05:00
Pieter-Jan Briers
b5bbbd9dde Allow lights to be nested one layer deep. (#668)
Fixes the first half of https://github.com/space-wizards/space-station-14-content/pull/92
2018-08-27 09:58:45 +02:00
Centronias
01daf9561a MathHelper minor changes and unit tests (#667)
Added unit tests for all MathHelper methods. Very open to test data values, I tried to specifically seek out edge cases, but I'm sure there're some things I've missed. Added tests for ensuring parameter preconditions throw exceptions.

Made some minor chanes to MathHelper.NextPowerOfTwo:
- Made the long, int and float overloads defer to the double overload since the original implementation was using the same thing as the double implementation anyway.
- Modified the precondition checking for negative numbers to check for non-positive numbers since the implementation for 0 shouldn't work since log(0) is undefined.
- Added precondition checks for float and double implementations to check for NaN and +/-Infinity
- Added special case handling for float and double implementations when the input is greater than zero but less than one where the previous implementation would return negative powers of 2 (ie, non-integer results), which I assumed are not intended. Depending on what people think, that same case could be extended to all inputs less than 1, or contrarily all inputs less than 1 could be considered out of range.

I've noticed that Acruid has PR #666 open to move MathHelper, among others, to a different place, so once that's in, I can merge it into this.


Lemme know if I've missed some procedure in the PR process.
2018-08-25 21:30:42 +02:00
Acruid
f49768e15a Math Assembly (#666)
Moved SS14.Shared.Math namespace into its own assembly. This allows projects to reference the math library without needing to include the entire Shared assembly.
2018-08-24 21:21:28 +02:00
Pieter-Jan Briers
74705b5a66 Engine Content Culling (#665)
* Engine culling.

Sandbox is gone.
Anything resembling "content" such as prototypes and textures is gone.
The engine can no longer load up directly
(short of the client's main menu, of course).

* Make tile prototype definitions workable.

Still not great though.
You can now manually specify their insertion order,
so technically tile ID.
2018-08-24 12:44:01 +02:00
Acruid
71121f8fef Added an SystemMessage for when an entity changes parents. (#662) 2018-08-22 09:55:15 +02:00
Pieter-Jan Briers
22fdca62bb Move more Player things into content. (#661)
* Move more Player things into content.

Spawning of players is now 100% up to content.
IPlayerData is now purely for content.

* Stupid sandbox.

* Sandbox pls go.

* Aaaaaah.
2018-08-20 16:13:58 +02:00
Pieter-Jan Briers
d8a5a617fe You now rejoin into the same body. (#659)
PlayerIndex is dead, it's been replaced by NetSessionId.
NetSessionId is basically just the client username.

Conflicts between usernames are auto resolved by the server,
due to lack of auth server & need for local testing.

dupeip config option is gone, it doesn't understand NAT.
2018-08-20 11:18:14 +02:00
Acruid
1c1c003b80 Input - Migrate Keybinds (#658)
* Moves PlayerInputMover logic into an EntitySystem.

* Removed old PlayerInput system.
Removed spammy input dbg message.
2018-08-18 14:40:17 -07:00
Pieter-Jan Briers
bddd355f17 Fix reconnection. (#657) 2018-08-17 00:02:19 +02:00
Acruid
0c66313255 Click Migration + Input Contexts (#656)
* Migrated click handling from old `ClickParser` to new `InputSystem`. Resolves #631.
* Input Context system added. Resolves #630.
* `PlacementManager` now uses its own input context.
* Added addon `Entrypoint.PostInit` function.
* Moved EntitySystemManager initialization from after the first state update, to right after the EntitySystem init.
* Made the EntitySystems only run Update/FrameUpdate/events after the map has been initialized.
2018-08-16 23:58:48 +02:00
PJB3005
900e2c94e8 Rename SpriteMirror -> SpriteProxy. 2018-08-16 22:16:17 +02:00
Pieter-Jan Briers
ba04fa0ae1 Sprite Mirror system. (#654)
Allows you to render a copy of a ISpriteComponent anywhere (in 2D).

This will be used in content to draw entities in GUI elements.
2018-08-16 22:01:37 +02:00
Pieter-Jan Briers
4a85a2a397 Smoothwalling for occluders. (#653)
Fixes #382
2018-08-13 14:38:18 +02:00
Pieter-Jan Briers
051e661cb6 Improve exception robustness. (#652)
All exceptions going to Godot are caught and logged.
Control no longer causes a Finalizer crash if .ctor threw.
2018-08-09 22:45:48 +02:00
Pieter-Jan Briers
1503a8b1f4 We Outta There. (#651)
Fix a bunch of console log spam.
2018-08-09 22:19:31 +02:00
Pieter-Jan Briers
b2e378359a Adds coloring to the client console. (#650)
* Adds coloring to the client console.

* Make input echos green.
2018-08-09 21:27:59 +02:00
Pieter-Jan Briers
be10df217e Engine changes to support content smoothwalling. (#649)
* MapIndices implements IEquatable.

* Add sane Modulo method to MathHelper.

* SnapGrid improvements.

Has an OnMoved-like event now.
GetInDir helper, basically like BYOND get_step.

* Make MapChunk use new standard mod method.

* entfo command improvements.

Can print diagnostic info from components now.
Doesn't list components multiple times.

* Transform implements IComponentDebug

* Move code to Godot 3.0.6.

It changed collections to use its own collection types.

* Helper to turn Directions.

* I forgot to commit csproj for IComponentDebug.

* Improve SpriteComponent.

Add direction offsets for layers.
Handling of directions is better now.
2018-08-09 17:28:02 +02:00
Acruid
21b00df2b1 Input Handling (#647)
* Added a shared interface for player sessions.

* Mouse Keys are now additionally handled like Keyboard keys.
Added Keybind for inspect.

* Added KeyFunctionId type.

* Keys now get passed through Gamescreen and into InputSystem.

* Remove useless KeyBindDown and KeyBindUp.

* Tried to get serverside input handling working (Spoiler: It does not).

* Stopped trying to make it over complicated, serverside input handling works!

* More cleanup, made InputSystem more symmetrical between client/server.

* Made it *actually* work with the examine system.
2018-08-08 10:55:47 -07:00
Pieter-Jan Briers
5b52d75a94 SnapGrid tracking system. (#646)
A new component, SnapGrid, now tracks the entity position on the actual tile grid.
This can be used to provide (relatively) quick indexing for say smoothwalling, atmos room calculations, etc...
2018-08-03 17:08:58 +02:00
Acruid
dcb22bf546 NetManager now blocks the main thread when waiting for the network thread to shut down. (#633) 2018-08-03 17:05:14 +02:00
Pieter-Jan Briers
830ff0f5b1 ITransformComponent & entity spawning QoL. (#645)
You can now access an entity's transform with the Transform property.
IEntityManager now has entity creation helpers.
2018-08-02 10:15:12 +02:00
Pieter-Jan Briers
786db099d1 Add zoom parameter to EyeComponent prototype. (#644) 2018-08-02 09:08:35 +02:00
Pieter-Jan Briers
c019e24a3a Fix CI by uploading GodotSharp.dll elsewhere. (#643) 2018-08-02 08:36:39 +02:00
Pieter-Jan Briers
4bc36834a9 Adds SpriteSpecifier. (#642)
It's a class for EITHER a texture path or an RSI state.
2018-08-02 00:15:17 +02:00
Pieter-Jan Briers
6b7a7d16e6 "Fix" DebugCoordsPanel exceptions on client start. (#641)
Pretty sure this is a race condition, so this should be fixed properly.
But hey, at least the client can reconnect now.
2018-08-01 22:24:06 +02:00
Pieter-Jan Briers
4e8d1c6b4f Fix bug where eye stays on map 0 until moved. (#640) 2018-08-01 22:16:47 +02:00
Pieter-Jan Briers
c79c01189f Terrible hijacking of placement. (#639) 2018-08-01 21:49:28 +02:00
Pieter-Jan Briers
c15288bfec Client-sided entities & other misc crap. (#638) 2018-08-01 17:27:08 +02:00
Pieter-Jan Briers
8e3f641155 Ah shit I did the thing I said I wouldn't do and I just forgot to commit the csproj. (#635) 2018-07-31 09:24:44 +02:00
Pieter-Jan Briers
d3af9fcd1b Wrap Godot.ItemList for GUI use. (#634) 2018-07-31 09:21:02 +02:00
Pieter-Jan Briers
8c4b3635ac Wrap Godot.Tree for GUI use. 2018-07-30 00:29:06 +02:00
Acruid
0ce3a8f233 DebugTools.Assert (#624)
Added a new DebugTools.Assert function to replace the System Assert. The System assert does not work well on mono, and was not gracefully handled by Visual Studio. This version now throws a unique exception when it fails, instead of the popup window. You can setup Visual Studio to break whenever the exception is thrown. The call sites to the new Assert are still removed in release builds, similar to the System version.

This resolves #569 without needing to add a trace listener.
2018-07-28 22:36:11 +02:00
Pieter-Jan Briers
0fb6cab703 ReadDataField version that does not use defaults but throws. 2018-07-28 16:08:00 +02:00
Pieter-Jan Briers
00b16c63ac Allow content to ignore prototype-types. 2018-07-28 15:33:48 +02:00
Pieter-Jan Briers
5d2d56bc64 Make SS14Loader a script on MainScene instead of AutoLoad. 2018-07-28 11:32:17 +02:00
Pieter-Jan Briers
8aa6d1ccc3 Adds dictionary shallow clone. 2018-07-27 15:45:10 +02:00
Pieter-Jan Briers
4679b853f7 Certified genius. 2018-07-27 10:25:39 +02:00
Pieter-Jan Briers
051f4a6399 Make YamlObjectSerializer constructor private. 2018-07-27 09:33:29 +02:00
Pieter-Jan Briers
b57b416d50 Add Lerp functions to FloatMath. 2018-07-27 09:33:14 +02:00
Pieter-Jan Briers
696bf486a6 Remove all compiler warnings. 2018-07-26 23:55:19 +02:00
Pieter-Jan Briers
f6c771f8ce Don't accidentally cache TestResult.xml on Travis. 2018-07-26 23:39:46 +02:00
Pieter-Jan Briers
bceda76bf8 Entity Data Refactor (#621)
* Remove `LoadParameters`
* Significantly refactor `EntitySerializer` to be better, no longer specific to entities.
* `IExposeData` so sub objects can be deserialized.
* Map format is now standardized & good.
* Entity and grid references inside map files now cross referenced and resolved correctly. Fixes #524 
* Prototype data caching to speed up prototype instantiation.
2018-07-26 23:35:13 +02:00
Acruid
5c2bd4049c ECS - ComponentManager Restructure (#620)
* Switch from storing the components on each entity to a central database inside of ComponentManager.
* Better deferred component remove.
* Turn the IEntity component functions into proxies of the ComponentManager functions.
* Remove Update() base function from Components. If components need to update, an EntitySystem needs to do it.

Resolves #618.
2018-07-26 23:10:24 +02:00
Acruid
2b69075bc2 Server Console - Cumulative Feature Update (#616)
### Purpose
* Merge ServerConsole and ClientConsoleHost shells into one system named ConsoleShell.
* Migrate all server side commands to the new ConsoleShell system.
* Add a PermissionGroup system, for 'ranks' like user/mod/admin/owner.
* Track per-client permission group, allow clients to elevate permission with global 'sudo' password.
* Changed `IWritableDirProvider.Open()` to return a `Stream` instead of a `FileStream` to help test-ability.

Resolves #612.

### Open Questions and Pre-Merge TODOs
- [x] This fix is tested on the same branch it is PR'ed to.
- [x] I correctly commented my code.
- [x] This PR does not include any unnecessary .meta, .prefab or .unity (scene) changes.
- [x] This PR does not bring up any new compile errors.
- [x] This PR has been tested in editor.
- [x] This PR has been tested in multiplayer.
2018-07-26 20:09:31 +02:00
Pieter-Jan Briers
22520fc1cf Fix exceptions upon game start. 2018-07-20 17:56:56 +02:00
Pieter-Jan Briers
44946d9be2 Catch exceptions in _Process. 2018-07-20 17:52:36 +02:00
Pieter-Jan Briers
05b4e64a29 Comments for appearance component. 2018-07-17 11:49:25 +02:00
Pieter-Jan Briers
92f12334b4 Appearance Controllers 2: Electric Boogaloo. (#615) 2018-07-17 11:11:01 +02:00
PJB3005
fec7d6481b Fix accidental Godot 3.1 config file 2018-07-15 15:45:23 +02:00
Pieter-Jan Briers
d1e4b259bb Appearance Controllers fundamentals. (#614) 2018-07-14 23:24:09 +02:00
Pieter-Jan Briers
0a397dc4d5 Fix resetting sprite layer animations if state gets set to the same value. 2018-07-14 16:56:47 +02:00
Pieter-Jan Briers
4c8be76aa9 Make Control.Disposed public. 2018-07-14 16:44:08 +02:00
Pieter-Jan Briers
63f56252f9 Fix broken format string in SpriteComponent. 2018-07-14 16:44:02 +02:00
Pieter-Jan Briers
a418bde812 Fix exception spam from deleting hovered entities. 2018-07-14 16:42:47 +02:00
Pieter-Jan Briers
86ddf5989b Display exceptions if map entities fail to be created. 2018-07-14 16:42:32 +02:00
indeano
f6d01c5d61 Public access modifiers for YAMLEntitySerializer (#610)
This is necessary to allow content packs to create their own class serializers
2018-07-10 10:19:31 +02:00
PJB3005
c7d56759b3 Allow disabling lighting. 2018-07-06 15:29:50 +02:00
Acruid
3d128747c4 VFS Features (#611)
* Added the new writable VFS API. Resolves #566.

* Moved resource interfaces into the new Interfaces.Resource namespace.

* Adds the property `ResourcePath.Directory`.
Removes the obsolete property `IResourceManager.ConfigDirectory`.

* Marked string version of content functions as obsolete.

* Removed unused `System.IO` using statements.

* Removed the System.IO namespace from a bunch of files.
Made the string version of IResourceCache obsolete, and converted everything to use the ResourcePath versions.
This should Resolve #567.

* Fixing some bugs.

* Un-Obsolete the string functions in IResourceCache and IResourceManager.
2018-07-02 20:33:14 +02:00
Pieter-Jan Briers
0abdcbd1f8 Never forget to hit save. 2018-06-23 21:57:26 +02:00
Pieter-Jan Briers
c20848902e Update export preset. 2018-06-23 21:55:35 +02:00
Pieter-Jan Briers
f1d3d2c5ce Async Delay and Spawn helpers for Timer. (#607) 2018-06-11 20:29:41 +02:00
Pieter-Jan Briers
c6d941f0cf Detaches grids from maps. (#595)
Grid IDs are now globally unique.
This'll make moving grids between maps possible.

Also, LocalCoordinates has been renamed to GridLocalCoordinates.
2018-06-11 20:24:23 +02:00
Pieter-Jan Briers
11230fe98f Fix reconnecting with the client. 2018-06-09 16:03:24 +02:00
Pieter-Jan Briers
170e1ad5af Nice typo. 2018-06-09 15:47:59 +02:00
Pieter-Jan Briers
100d21196b Improve readmes.
Moved the intimidating all caps readme info out into its own file.
Deleted the linux file as it was horribly outdated.
2018-06-09 15:19:21 +02:00
Acruid
46ca2d2cc5 TileDefinitions can be loaded from prototypes now. (#594)
The server now uses the config file to figure out which map to load.
2018-06-08 19:32:14 +02:00
Pieter-Jan Briers
0563a5beb3 Fix build issue on Godot 3.0.x 2018-06-08 14:52:48 +02:00
Pieter-Jan Briers
6d35e339cb Fix caching of GodotSharp.dll on AppVeyor. 2018-06-07 23:30:27 +02:00
Pieter-Jan Briers
8a8ed75084 Fix typo. 2018-06-07 23:28:16 +02:00
Pieter-Jan Briers
fbeb10e8c2 Make download_godotsharp 522 proof. 2018-06-07 23:25:02 +02:00
Pieter-Jan Briers
be174cc027 Sprite per-layer color modulate. 2018-06-07 23:14:55 +02:00
Pieter-Jan Briers
d1cf753f22 Debug Coords Panel gets entity display. 2018-06-03 16:40:59 +02:00
Pieter-Jan Briers
6ede21aa14 Fix Overlay.ZIndex setter. 2018-06-03 16:11:18 +02:00
Pieter-Jan Briers
59a1cc899b Even einstein agrees. 2018-06-03 16:09:23 +02:00
Pieter-Jan Briers
ee7c5d9da1 It it quantum-physically impossible to get CI scripts right the first time. 2018-06-03 16:03:38 +02:00
Pieter-Jan Briers
88520e8db5 Coverage badge. 2018-06-03 16:01:38 +02:00
Pieter-Jan Briers
e73bcd57c0 Fix coverage reports. 2018-06-03 16:01:32 +02:00
Pieter-Jan Briers
cd376711bf Does this fix coverage. 2018-06-03 15:49:36 +02:00
Pieter-Jan Briers
ca0037a402 I'm a genius. 2018-06-03 15:35:29 +02:00
Pieter-Jan Briers
7aee21b689 Guess no multiline then. 2018-06-03 15:31:02 +02:00
Pieter-Jan Briers
348ca5b107 Shall coverage work first try? 2018-06-03 15:27:53 +02:00
Pieter-Jan Briers
136d306d1d Use after_test maybe? 2018-06-03 15:06:43 +02:00
Pieter-Jan Briers
3c14e1d1db Make Sonar import unit test results. 2018-06-03 14:59:50 +02:00
Pieter-Jan Briers
c058c2e3d4 Outlines & Custom non-entity drawing. (#592)
* Shader work WiP

* Probably implement basic shader param support.

* Really rough and hacky version

* Fix dumb exception.

* Custom fullscreen drawing API prototype.

* Significantly optimize debug colliders drawing.

* Fix drawdepths on clothing & overlays.

* Re-add license to outline shader.

* Update .editorconfig for .gdsl files.

* Fix unit tests.
2018-06-03 14:38:56 +02:00
Pieter-Jan Briers
1812e8743d Makes EntityUid IComparable. 2018-05-30 16:10:11 +02:00
Pieter-Jan Briers
036daa2ac8 ToString() for entities.
Intended for debugging mostly.
2018-05-30 16:09:47 +02:00
Pieter-Jan Briers
480a0b4a0a Can now change SS14Window titles. 2018-05-30 14:22:57 +02:00
Pieter-Jan Briers
693769cbd4 Improve sprite drawdepth ordering. 2018-05-30 14:07:21 +02:00
Pieter-Jan Briers
00fe03b61b Placement fixes. 2018-05-27 23:27:23 +02:00
Pieter-Jan Briers
b761d9a1eb Fixes directional icons not being used in placement previews. 2018-05-27 21:44:35 +02:00
Pieter-Jan Briers
3728c7eeee Some entity improvements to work on power code. (#591)
* Client-specific component network messages.

* Make entity serializer aware of color names.

* Fix input log spam.
2018-05-27 16:57:42 +02:00
Pieter-Jan Briers
dc80060757 Input Refactor (#590)
* *some* input work.

* Remove explicit numbers from Key enum.

* Hey, keybinds sorta work!

* Input almost works?

* It works.

* Fix networking issues.
2018-05-27 10:08:36 +02:00
Pieter-Jan Briers
909bb5936f Fixing issues sonar pointed out. (#589)
* Fixing issues sonar pointed out.

* Fix build.
2018-05-26 18:21:40 +02:00
Pieter-Jan Briers
0da7507c64 shhhhh. 2018-05-13 15:54:32 +02:00
Pieter-Jan Briers
0a195fe3c7 Game State Refactor (#586)
* Rename SS14.Server/GameState directory.

* Server now runs at 60 FPS.

* RegisterNetMessage<T> more generic!

Also started refactoring game states.

* HOLY SHIT I CAN MOVE AROUND.

* Dirty(); calls and improvements.

* Implement deletions + mark components as dirty initially.

* Remove bsdiff submodule.

* Remove Bsdiff.

* Fix System.ValueTuple reference.

* Server no longer crashes when the gun is used.

* Optimize player sync.

* Prevent constant dirtiness from player input mover.
2018-05-13 11:40:16 +02:00
Pieter-Jan Briers
64e22fc031 Fix GodotSignalSubscriber leakage. (#588)
Every signal subscriber was getting leaked because I didn't know how Godot's memory model works. This is fixed now.
2018-05-12 00:13:21 +02:00
Pieter-Jan Briers
1375da7f70 Rename IEntity.GetComponents to GetAllComponents. (#584)
This is to avoid confusion.
A single s to distinguish it from GetComponent() is quite hard to miss.
2018-05-10 18:52:17 +02:00
Pieter-Jan Briers
6b37906c85 Logging API cleanup. (#585)
Added versions of the log calls not doing formatting.
Moved the LogLevel argument for .Log() to be first.
2018-05-10 18:51:55 +02:00
Pieter-Jan Briers
6c7dff77c5 Fixing some crashes and errors. (#583)
Fixes #559 and resolves a ton of error spam & shutdown crashes.
2018-05-10 18:51:42 +02:00
Pieter-Jan Briers
86a432bdeb Debug monitor system & UI improvements. (#581)
Debug monitors like coord debug, FPS and the (now re-added)
have been amde into a more centralized system.

Networking debug is back! No chart though.

Bunch of improvements and fixes to the UI code to facilitate this.
2018-05-10 18:50:56 +02:00
Pieter-Jan Briers
cb469c4f86 Fixes description loading in prototypes 2018-05-09 17:12:56 +02:00
clusterfack
dd0be25ab6 Placement Systems (#580)
* Deactivate special placement mode after placement
Comments
Fix collision checks for placement manager
Remove unnecessary usings
Fix the alignment issues
Wow this commit has literally almost all the work done in it alone
time to test some sketchy shit, commit first

* Fix align similar
2018-05-09 16:33:50 +02:00
Pieter-Jan Briers
4471e0ccca The SpriteComponent refactor (#577)
* Adds Godot shader support.

* New sprite component with a layer system.

Supports per-layer shaders. Only texture and shader properties are implemented.

More TODO.

* Basic RSI loading.

* Direct textures for layers.

* Implement a scale layer parameter.

* RSI directions work now.

* Animation support.

* Make sprites appear again.

* Fix error message about shaders on the server.

* Implements directional sprite handling & rotation of transforms.

* Remove debug logs from ShaderSourceResource.Load

* Work on a public API & better handling of errors.

* Layer addition API coded but untested.

* Fix init crash.

* Add a client side API for SpriteComponent.

* Remove dead NetIDs.

* Fix bug where sometimes entities start flat on their face.

* Refactor IconComponent.

* Adds rotation property to layers.

* Expose scale and rotation APIs, sprite-global rotation.

* Adds visibility property.

* Netcode work.

* Server side prototype loading done.

* Netcode works.

Also adds a visibility layer option.
2018-05-02 21:24:59 +02:00
clusterfack
adece0e39b Description information on entity and loading from prototypes (#579) 2018-05-02 21:24:02 +02:00
clusterfack
9aed85b4c7 Click modifiers (#578)
Apparently @pjb3005 did almost all the work for this when he changed the system to godot but didn't say anything, adds a property to parse the clicktype on mousebuttoneventargs and passes it in the network message instead
2018-05-01 02:43:40 -05:00
clusterfack
3a78a26652 PJB will love this (#573)
* PJB will love this

Containers 2: The uncontained

* Yes
2018-04-23 01:57:18 +02:00
clusterfack
498349bbcf Companion PR (#574)
https://github.com/space-wizards/space-station-14-content/pull/61

Adds a keybind for opening the character menu and makes texture rect not die when setting texture to null
2018-04-22 19:59:04 +02:00
clusterfack
8b83362c61 Gridcontainer (#571)
* Gridcontainer Wrapper

* This is probably important too

* Oopsie daisy

* Creates the client and shared portions of the new inventory code
2018-04-21 01:36:03 -05:00
Pieter-Jan Briers
32caf088ef Adds a system to load tscn files from content. (#570) 2018-04-19 21:22:16 +02:00
Pieter-Jan Briers
a34006f8ff Make project files default to x64. (#568)
Also fixes Lidgren's output directory. Not like it mattered.
2018-04-19 21:16:26 +02:00
Pieter-Jan Briers
20b9fd3228 Sawmills! (#565)
* Sawmills

* They seem to work on the server now, sorta.

* They work.

* More shit that works.

* Shit works yo.

* File logging for the server.

* Adds some debug commands and finishing touches.

* Oh yeah change this default.

* Fix unit tests.
2018-04-19 20:19:40 +02:00
clusterfack
320aa3f9c0 Gridcontainer Wrapper (#564)
* Gridcontainer Wrapper

* This is probably important too
2018-04-18 21:44:30 +02:00
clusterfack
f445addcd5 These should have no distinction on the client (#563) 2018-04-17 02:25:09 -05:00
clusterfack
44b00a1fa7 Make handle message use optional arguments (#561)
* Make handle message use optional arguments

Instead of arbitrarily using object as the first argument and killing type safety

* Ohboy
2018-04-15 13:34:22 -05:00
Pieter-Jan Briers
909ba41890 Remove usage of PitchScale. (#562)
It was apparently a very new 3.1 feature,
so it doesn't work on Godot 3.0.x.
2018-04-15 13:34:08 -05:00
PJB3005
b5ca9095b0 Remove Bitstream 2018-04-13 01:08:08 +02:00
PJB3005
c22a199a5b Remove binaries 2018-04-13 00:40:09 +02:00
Pieter-Jan Briers
2395b456e2 Update all NuGet packages. (#556)
* Update all NuGet packages.

* What a way to waste one and a half hours of my life.

* fucking

* fuck everything.
2018-04-12 23:41:56 +02:00
Pieter-Jan Briers
d7414930ff RSI support (#552)
* RSI WiP

* More work but we're doing bsdiff now

* RSI loading seems to mostly work.

* Vector2u deserialization test.

* Add in packages again.

* This is the part where I realize I need a path manipulation library.

* The start of a path class but it's late so I'm going to bed.

* HIGHLY theoretical ResourcePath code.

Partially tested but not really.

* Allow x86 for unit tests I guess jesus christ.

Thanks Microsoft for still not shipping x64 VS in 2018.

* Resource paths work & are tested.

* I missed a doc spot.

* ResourcePaths implemented on the server.

* Client works with resource paths.

TIME FOR A REFACTOR.

* Some work but this might be a stupid idea so I migh throw it in the trash.

* Resources refactored completely.

They now only get the requested resourcepath.
They're in charge of opening files to load.

* RSI Loader WORKS.

* Update AudioResource for new loading support.

* Fix package references.

* Fix more references.

* Gonna work now?
2018-04-12 21:53:19 +02:00
Pieter-Jan Briers
796555fad5 Audio system! (#550)
Supports positional, entity-tracking and global audio.

Special thanks to Zumo on Discord,
for figuring out how to load audio files Godot.
2018-04-12 17:54:18 +02:00
Pieter-Jan Briers
1e749952db Unit test improvements. (#548)
* Unit test improvements.

Adds an ApproxEqualityConstraint and IApproxEquatable<T> for certain tests.
Gives [Parallelizable] to a bunch of tests.

* ParallelScope.All | ParallelScope.Fixtures
2018-04-12 17:53:10 +02:00
clusterfack
e191be3a75 Fix stored object clicking bug (#553)
Fixes a humorous bug where you click on things that are contained in another thing because the mousedown doesn't check if something is on the map or not
2018-04-12 11:23:04 +02:00
Pieter-Jan Briers
ba3bad68c8 New logo courtesy of @outbools. (#549) 2018-04-12 02:55:45 -05:00
Pieter-Jan Briers
2bc7e09f65 Stop building the resource pack on Travis and AppVeyor. (#551) 2018-04-12 02:55:25 -05:00
Pieter-Jan Briers
896ac87f04 Remove broken particle editor. (#547) 2018-04-11 10:47:38 -06:00
Pieter-Jan Briers
b5c0202647 Godot (#545)
* bsdiff submodule

* All the other stuff

* Upgrade to 0.2 of SS14.Shared.BSdiff

* Use streams. Even faster!

* All rendering refactors should start with the killing of the SFML submodule. Trust me I've done this before!

* And after that comes the removal of the references in the project files!

Of course, neither of these compile. Meh.

* IoC loads, now to port the entire client over.

* More work

* Trying to debug the null exception.

* More messy WiP code

* More WiP

* Transform components now make Node2Ds inside the scene tree.

* Work on the UI system.

* Redo project configurations to work better.

* More work on the Godot GUI binding.

Added BaseButton and Button bindings, including events for them.

More APIs on Controls like GetChild() and alike.

Ability to instance a Godot PackedScene and have it automatically be wrapped by the SS14 GUI wrapper, thus allowing the usage of Godot's GUI editor while maintaining the good C# API.

* Fix incorrect sRGB profile on bootsplash.png

* LineEdit API.

* Maybe commit the csproj too.

* Exit button works now!

* Change MainMenu root to a normal Control.

* Some stuff messing with window popups.

* Fix popup not scaling down again after housing large text.

* Make popup dialog helper.

* Auto wrap controls that spawn others when not instancing.

* Nice typo me.

* Work getting server connections working.

* Server didn't start anymore due to still trying to load removed zip packs.
* Made MainMenu dump UI elements in shutdown.

* We now successfully connect to the server.

* WE Ingame NOW!

* Basic map rendering works now!

* Camera & Input work.

Though I'm not sure whether the input issues are this piss poor laptop or actual bugs.

* Fix input issues.

KeyHeld() was firing KeyUp() into States, which broke everything.

* WiP Debug console.

UI Works, command processing doesn't.

* Remove some debug logs.

* Fixing focusing issues with the Debug Console.

* In which I copy paste in the DebugConsole code.

* More WiP DebugConsole work.

* Use RichTextLabel for DebugConsole.

* Disable DebugConsole test text.

Also disable context menu on the IP Box because of font size issues.

* ITextureSource for texture wrapping.

* Make resource loading not copy every build.

It now loads from repo root. Release builds are TODO.

* Bsdiff 0.3 for fixed targets.

* Fix iCCP sRGB errors.

* Give full texture paths to prototypes.

* Sprite component old API restored. *shudder*

* Finish sprite rendering.

By hitting delete on basically everything.

* Fixing camera delay with this one weird trick!

The input lag was because the camera lagged, not because the input lagged. I didn't have visualization.

* Use greyshirt as temporary human replacement.

* FPS Counter.

* Fix Windows, re-add space tile def.

Windows broke because Mono on Windows can't use System.IO.Compression.
The GZIP streams use by MsgFullState have been moved to
ICSharpCode.SharpZipLib.GZip. Works fine.

Also re-added the space tile def because everything blows up otherwise I
guess.

* Debug colliders works.

* Highly WiP varied Window code.

* Work on the quit button. Doesn't work yet. Needs state overhaul.

* Do a better job of freeing Godot objects correctly.

* Simplify game states.

States are no longer cached. They're GC'd after shut down. Their creation has been simplified too due to IoCManager.InjectDependencies().

This makes returning to main menu work GUI wise.

* Be less aggressive on resource freeing. Only dispose Mono handles now.

* More work getting quit to work.

* Grids get cleared upon disconnect correctly.

* Disable rendering of the filler space tile.

I'll leave a nice parallax background up to content.

* Oops forgot to stage these.

* Fix issues in the csproj file.

* Make controls have own namespace.

* Chatbox GUI, other stuff.

Compiles but doesn't quite work yet.

* Git fuck you

* Chat works.

* Clicking on a not-control removes focus now.

* Fix an exception.

* Update mono. Use enums instead of constants now!

* Fix window dragging

* Fix chat stealing focus from other LineEdits on MacOS I guess.

* Correctly handle client shutdown & server disconnect.

* Fix error spam on client shutdown probably.

* Tiny amount of lighting code to have access to it from other computers

* Lighting works mostly.

* Godot.Texture.Flags -> FlagsEnum

* More WiP lighting code

* Turns out you can't control custom layers with cameras eh.

* WiP lighting almost works

* Lighting WORKS!

* Lobby thing.

* Some options menu work. I'm gonna try something

* Options menu works.

* More improvements.

* In game options menu works.

* Remove a debug log.

* Fix Window Movement and Drag.

* Huh Godot edited these scenes.

* Forgot to commit projects

* It compiles.

* I never claimed that.

* Update sandbox csprojs a bit.

* Makes sandbox load.

Client goes ingame but dies due to broken map manager networking code.

* Fix grids.

* Fix relogging duplicating entities inside Godot.

* Eyes!

* How about removing the TODO entry.

* Auto fetch bsdiffwrap.

* Update TODO.

* Remove TODO list.

* Tilemaps get cleaned on disconnect now.

* Fix bsdiff submodule HOPEFULLY

* Highly WiP and not compiling or working placement.

Yes this is the best way for me to share code between my computers.

* Fix bsdiff with spaces in path names bloody MSBuild + cmd.

* PLACEMENT KINDA WORKS.

NO RENDERING OR TILES YET.

ALSO I NEED TO REBASE THIS.

* Kill EngineContentPack.zip

* Fix map code and remove sprite components from the server.

* Ok entity placement mostly works.

* Grid lines sorta work but SnapgridCenter is still broke.

* Fix Center Grid Rendering.

* Work getting tile spawns to work. Not quite there yet.

* Fix placement and remove tiledef networking.

It werks!

* Remove SolutionSpecific.targets

Didn't end up being needed.

* Kill off wearableanimatedsprite component states.

* Do not put binaries relative to the solution.

* Remove shaders, reorganize prototypes for content.

* Reimplement SpriteComponent color.

* Correctly set __engine_human DrawDepth.

* Round coordinates passed to Godot to pixels to prevent issues.

* Remove some GUI log spam.

* Resource cache now uses the VFS more-proper but still awfully.

* Fix color reading code on SpriteComponent.

See, e94bf4854b106da51c89eeeab9a609be369f9622 did work.
The problem was all the code it NEEDED to work was broken.

* Step one into trying to fix Travis and AppVeyor.

* Auto download GodotSharp on Travis.

* Let's not make dumb mistakes with the cache directories.

* 2018 and requests still isn't in the stdlib.

* This maybe?

* This maybe?

* AppVeyor time.

* How 'bout we don't download sonarqube at all outside master.

* Try to cache on AppVeyor.

* Fix mac builds maybe.

* Finishing up Godot: cleanup.

* Eh this works too for SS14Loader.

* Remove some dead files

* Make Omnisharp not choke on buildchecker.

* Controls for box containers.

* Remove debug port from project.godot.

* Control and drawing improvements.

Controls are now properly capable of overriding Godot virtuals.
Importantly minsize calculations and stuff like HasPoint.

There is now a system for doing direct drawing on controls.
This is done with a DrawingHandle system.

TextureSource has been renamed to Texture.

Also there's a wrapping for Godot's style boxes now.

* Yeah don't insult omnisharp.

* Stylebox fixes and margin API on controls.

* Hey it compiles!

* Fix things.

* Fix null godot texture conversion.

* Fix client transform parenting.

* Fix movement sticking to north.

* Some updates.

* Work on exports.

* Unstubs client/Godot timing code.

It's mostly implemented now.

* Client unit tests work.

Jesus Christ.

* Let's figure out why AppVeyor hates me.

* Does the remie.

* Update GodotSharp download URL.

* Export templates for the builds server.

* Remove mac export icon.

* TO THE BUILDS SERVER.

* Probably implement the effects system in Godot.

* Fix mouse handling everywhere.

* Fix some CollidableComponent exceptions.

* Effects system works + unshaded option for LAZORS.

* Let's not fuck with Angle yet.

* Make file/line numbers show up on Windows Godot.
2018-04-07 15:24:46 +02:00
clusterfack
5f5c5f13c9 Changes physics and collidables (#543)
This is for projectile weapons, adds some enhancements and modifiers for collision behavior which will help out
2018-04-06 00:34:24 +02:00
clusterfack
b13af4cd8d Adds getentititiesinarc (#544)
A bit of a shitty function that somewhat works, get entities in a range that intersects ours but also has a center point within an angular range that we specify
2018-04-05 19:27:17 +02:00
clusterfack
f64309ba6f Arbitrary Effects System (#537)
* Moves client entity system to be closer to IoC registration and before gamescreen initialization

* Gives the raycasting system an argument to ignore a particular entity when finding what entity it will intersect

* Adds an arbitrary effects system

By creating a message defining things such as position, spritename, rotation, size, and delta values, you can create a temporary effect on the client. Just create a new message, define all the values upon it, pass it to the serverside effects system to send to the clients.

* Effects csprojs stuff and adding a datatype for priorityqueue from a nuget package

* Modifies nuget to use $solutiondir

* Effectsystemstuff
2018-04-05 19:26:35 +02:00
Acruid
67ecfe7ddb BaseServer - Kick Players On Shutdown (#541) 2018-03-27 13:56:52 -06:00
Acruid
77f7efdf6e MapLoader now catches any errors when creating an entity and prints them to the console instead of crashing the program. (#540) 2018-03-25 14:17:52 +02:00
Acruid
7d681567d1 Serializer Improvements (#539)
* Added Data Get/Set functions for use with Properties.

* Able to serialize generic List and Dictionary.

* Can now actually serialize generic lists and Dictionaries.

* Manually set the newline string for StreamWriter so the tests pass in linux/mac.
2018-03-25 14:17:41 +02:00
Acruid
553a0aca53 GameLoop Refactor (#538)
* Added Unit Tests for GameTiming.

* Added GameLoop class.

* Removed TimeScale.

* Switched server to the new GameLoop.

* Client now uses GameLoop.

* Allowed friend assemblies in release builds, so TravisCI can run tests.
2018-03-25 14:15:47 +02:00
DamianX
556fcbf7bd GetAllPlayers() doesn't return nulls (#542) 2018-03-22 17:03:03 +01:00
Acruid
3a5ea35c0b Raycasting + Turret AI (#532)
* Ray -> Box intersection works.

* Turret AI finished.

* Turret Works :D

* Light masks can now be rotated.

* Shoddy angle MoveTowards works.

* Shoddy Vector2 MoveTowards works.

* And pretty broken Quaternion version..

* Slept on it, rotation works good enough now.

* Fixed nuget dependencies.

* Moved AimShootLifeProcessor.cs to content.
2018-03-09 21:48:34 +01:00
Pieter-Jan Briers
2fb6f27cd1 Fix Travis and code analysis compiler warnings on Unix. (#535)
* Fix Travis and code analysis compiler warnings on Unix.

* Actually let's just disable macOS builds.
2018-03-09 18:03:20 +01:00
clusterfack
f57196a481 Directional Placement Manager Fix (#533)
* Placement Manager rotation fix

* Makes sure the default nondirectional sprites work as well
2018-03-09 18:02:54 +01:00
clusterfack
c03569a4e8 Full interaction system (#534)
Raises an event on click, regardless of whether we clicked on something or not. Sends it to the server to be parsed in the content interaction system.
2018-03-09 17:30:30 +01:00
Acruid
c8aaab48ad InputSystem Messages (#531)
* Misc cleanup.

* Removed BoundKeyChangeEventArgs.

* Removed event IClickableComponent.OnClick.

* Nothing uses EntityEventArgs now.

* Input messages are now sent through the network as SystemMessages instead of ComponentMessages.
Fixed EntitySystemMessage namespace name colliding with the base class.
Removed some unused code from server.

* Ignored KeyBindingInputComponent in the client prototype system.
Removed useless update code from client InputManager.
2018-03-03 13:19:18 +01:00
Acruid
a850c722cc Color Merge (#530)
* Removed useless CLSComplientAttribute from math structs.
Removed Obsolete functions from math structs.
Minor code cleanup.

* Merged Color into Color4, then renamed Color4 back to Color.
2018-02-27 19:37:33 +01:00
Acruid
b9cadc4599 Minor Refactorings (#529)
* Moved GameStateManager functions out of BaseServer.

* Moved PlayerManager NetMsgs out of BaseServer.

* Moved MapManager NetMsg out of BaseServer.

* Moved TryLoadAssembly from BaseServer to AssemblyLoader.

* Removed some service locator calls.
2018-02-27 19:35:18 +01:00
Acruid
eb74c4227f Component Messaging Rework (#528)
* Sealed Entity class.
Removed Entity.Update().
Code cleanup.

* Component.Update() is now obsolete.

* Added skeleton of new Component Message system.

* Converted everything to use new `SendMessage(owner, message)`.

* Removed more of the old system.

* Changes `IEntity.AddComponent(IComponent)` to `IEntity.AddComponent<T>`.
Removes some initialization functions from IEntity.

* Pulled ComponentManager registration out of Component into Entity.
Removed unused OnShutdown events from Entity and Component.

* Converted Component.ReceiveMessage() to Component.HandleMessage().

* Killed component message params.

* Remove EntityNetworkMessage params.
2018-02-24 09:16:28 -08:00
Acruid
ba981a13e0 Can now save and load full IMaps. (#523)
Server concmds for save/load map.
2018-02-18 00:10:17 +01:00
Acruid
eee7b3c598 Transform Parenting Enhancement (#522)
* Nightly Progress.

* Getting closer...

* !!! IT FUCKING WORKS !!!

* Cleanup

* Relative Rotation works.

* SpriteComponents now rotate properly.
2018-02-18 00:07:45 +01:00
clusterfack
441bdf628a Fix placement dragging affecting entities (#521)
* Fix placement dragging affecting entities

It now only affects tile placement

* Tuturu

* Fix annoying defaultanimatedsprite bug as well
2018-02-06 21:34:53 -06:00
Acruid
309ef2cea2 Map Blueprint Save/Loading (#520)
* YAML deserializer is coming along.
Nightly work.

* Should be pretty much working now.

* Converted most of the server components over.

* Entity loading/saving works.

* Grid saving/loading works.

* Cleans up old code.

* Saving and Loading of blueprints works.

* Improved map commands a bit.

* MapLoader fixes grid and map IDs in blueprint.
Can now load blueprints from the VFS.

* Removed Entity.LoadData(YamlMappingNode).

* Updated the nuget 'YamlDotNet' package to 4.3.0.

* Fixed Sandbox entry point.
Unit tests pass again.
2018-02-06 18:56:58 -06:00
clusterfack
8b31da2e0a Adds the same event subscriber entity has to entitysystems (#518)
* Adds the same event subscriber entity has to entitysystems

* Add the other helpers because pjb asked
2018-02-05 12:52:24 -07:00
clusterfack
59f158b13a Fixes spawn entity bug (#508)
* Fixes spawn entity bug

Now transform is called before initialize is, yay.

Call it shitcode but unless there is a better way that I cant find, this is the fix, and if there is please tell me

* Fixes incorrect AABB
2018-02-02 15:19:56 -07:00
clusterfack
2301c8d6ee Prevents sprite exceptions (#507)
* Prevents sprite exceptions

Even though setsprite has a default value that it gets set to, unless you give basesprite a non-null value and call setsprite it will cause the animatedsprite components to have an exception without fail. This happens if you don't include it in the prototype for whatever reason.

* Unnecessary
2018-02-02 15:19:40 -07:00
clusterfack
0427fa1537 Makes mouseclicktype an enum (#506)
* Changes clicktype to an enum because why isn't it

* Oops

* Whatever sure lets call it "ClickType" instead of "Clicktype"
2018-02-02 15:19:27 -07:00
Pieter-Jan Briers
f5e5cca2aa Supposedly fix collisions. 2018-01-31 22:37:02 +01:00
Acruid
5c0537f008 CloseTK (#503)
* Added math types from OpenTK project.

* Removed OpenTK from SS14.Server.

* Removed most references to OpenTK from SS14.Shared.

* Removed OpenTK from SS14.UnitTesting.

* Fixed errors in SS14.Client.Graphics.

* Removed more references.

* Remove OpenK from SS14.Client.

* Fised the last compile errors.

* Deleted opentk config file.
2018-01-26 07:31:37 -07:00
Acruid
a2f37d2613 Placement Click-Drag (#502)
* Fixes placement again.

* Can now click-drag tile placement to place multiple tiles.
2018-01-24 20:45:53 +01:00
Jordan Brown
f532d90b78 Fixes appveyor clone (#501) 2018-01-21 00:24:28 +01:00
Pieter-Jan Briers
785d164d29 Make AppVeyor use non-shallow clones for Sonar blame. (#500) 2018-01-21 00:09:37 +01:00
Pieter-Jan Briers
15823b1cb4 Fix AppVeyor maybe 2018-01-20 23:59:04 +01:00
Acruid
d0c317c8b4 Content Build Targets (#499)
* Changed projects so that Sandbox content is built in its own folder, and then copied to ./Resources/Assemblies.

* Moved SS14.Sandbox.targets to the ./MSBuild/ folder.
2018-01-20 23:47:42 +01:00
Acruid
21ebda05c2 Appease Sonar (#495) 2018-01-20 13:24:14 -07:00
clusterfack
8d208dca16 Entity Getters 2 (#496)
* Location Getters 2

Oh my god I didn't even make them part of the interface last time
Fixed a bug with local coordinates not be converted to world coordinates before comparing to other entities world transform
Added some more getter overloads

* Changes entities getters more

Adds a get entities in range for entity and range overload
Changed getentitiesinrange to take into account the bounding boxes of objects instead of their absolute coordinates

* SQUARE
2018-01-20 15:09:18 +01:00
Acruid
03a06cead9 EntityUid Type (#498)
* Wraps Entity Uids in their own type.

* EntityId can't be serialized by entity params.
2018-01-20 15:07:38 +01:00
Acruid
a2278f8ef2 Move Component Initialize to the Entity class. (#497)
Allowed EntityManager to work with the Entity class instead of IEntity.
2018-01-19 20:20:15 -06:00
Acruid
494c5c3eb3 kick Command (#494)
* Added a NetManager.DisconnectChannel so that server/shared can disconnect clients.
Added listplayers command to list all connected session on the server.
Added kick command to forcefully disconnect a connected session.

* Part 2, everything works now.
2018-01-18 18:51:23 -07:00
Silver
594f53d275 update appveyor.yml 2018-01-18 14:00:39 -07:00
clusterfack
9fbb0e6705 Fix Compile (#493)
Some conflicts in Acruid's PRs caused compile to be broken
2018-01-18 11:17:33 -07:00
clusterfack
d1e4a526c0 Adds some Location Getters (#492)
There's probably a million more I could add to be honest
2018-01-18 11:17:20 -07:00
clusterfack
ac38588a56 Updates some obsolete UI vars (#491)
Components is meant to be obsolete now, and anywhere its used are the primary cause of most current UI bugs. I removed one usage of it here.
2018-01-18 10:03:36 -07:00
clusterfack
8690c7a3f5 Updates content compatibility (#490)
Changes way content loads instead of using config, attempts content then loads sandbox instead
Fixes some compiler warnings
Adds a field needed for content player mob
2018-01-18 09:59:34 -07:00
Acruid
cfddef484c Embrace NetMessages (#488)
* Lidgren removed from Client.
ScreenBlocker control removed.

* Lidgren removed from server.
Lidgren removed from UnitTesting.
Lidgren only referenced in SS14.Shared.Network.

* Removed useless traffic debug printing.
Fix a bug with Keybinds being sent to server.

* NetMessages enum is finally gone :D

* Add warning for receiving NetMsgs without a registered callback.

* Moved some of the RegisterNetMessage calls out of BaseServer.
Added 'netaudit' concmd to list NetMsg callbacks on the server.

* Fixed exceptions, it works now.
LocalCoordinates.IsValidLocation() added.

* Moved all objects out of the SS14.Shared root namespace.
2018-01-18 09:58:46 -07:00
Acruid
e804fd3d2a Sprite Offset Property (#489)
Like
2018-01-18 09:55:23 -07:00
Acruid
976f8d7f76 Light Rendering and Masks (#487)
* Remove IoC self-referencing in MapManager.

* Added Circle to the math library.
Made LocalCoordinates equatable.
MapManager refactoring.
Light refactoring.

* Removed LightArea.

* GetEntities* functions now check mapIds.
PlacementManager does not place things in null space.
Prop Edit window "works" again.

* Lightmasks work.
2018-01-17 14:36:03 +01:00
Silver
2eb3f234ea Add Acruid to Code Reviewers 2018-01-15 11:17:09 -07:00
Acruid
785025f23c Sandbox Gamemode (#486)
* Adds skeleton Sandbox Content projects to the solution.

* Change BuildChecker output type to Class Library so that Resharper stops complaining about the project not having a Main() function.

* Added basic player event hooks to BaseServer.
Moved Server run level from PlayerManager to BaseServer.
Added concmds to switch between run levels on server.

* Forgot to commit project file.

* Entry points got changed a bit.

* You can now join a game without a map loaded on the server.

* Moved map loading to Content.

* Adds 'tp' command.

* Added 'addmap' command. Client crashes when used.

* Teleporting between maps works.

* Added GridId and MapId types.
Removed Test concmd, it was useless.
Misc formatting/cleanup.

* Tile placement kinda works.

* Added OnPlayerStatusChanged event.

* Server now auto starts the round.

* HandlePlayerStatusChanged works better now.

* Removed PlayerJoined* events from BaseServer, PlayerStatusChanged event does the same thing.

* Changed default platform of Sandbox from AnyCPU to x86.
Added "content.dllprefix" ConVar so that the config file can specify which content dll to load.
Changed LoadContentAssembly name argument to contain the entire name of the dll being searched for.

* SS14.Shared now copies Lidgren to the output directory.
More project configuration changes to remove the AnyCPU nonsense.
2018-01-15 11:03:50 -07:00
wixoaGit
29d2320ca3 Add timers. (#485)
* Add Timer and TimerManager.

* Register ITimerManager in the unit tests.

* Replace the event with an action.
2018-01-11 22:10:44 +01:00
Acruid
c992ee4d75 Added a Configuration Directory location to the Resource manager. (#484)
Renamed FindFiles to ContentFindFiles.
2018-01-04 09:08:47 +01:00
Acruid
6247ff4eff Console Rework (#483)
* Extracted the logic from DebugConsole into a new ClientConsole class.

* ClientConsole moved to IoC system.
Verb system replaced with concmds.

* Shared Cleanup

* ClientChatConsole skeleton.

* DebugConsole and LobbyChat are now both subscribed to ClientChatConsole.

* Removed server chat commands.

* cleaned up server command sysyem.

* More chat handling, and aliasing.

* Nightly work on Say command.

* Fixes a bug in Maths.Angle.

* Chat channel colors moved to ClientChatConsole.

* Now Server commands are sent without opening DebugConsole.

* Emotes work.
Clientside chat formatting works.

* Fixed angle unit test.
2018-01-04 00:53:41 +01:00
Acruid
1570ed1242 ClientSession/BaseClient Rework (#482)
* Added BaseClient.
Moved connecting system into BaseClient.

* Added ConnectFailed event to ClientNetManager.
BaseClient properly handles failed connection attempts.

* Session Rework

* Client now knows about other clients that are connected to the server.

* Reconnecting with the client works now.

* Allow Dupe IP.

* Shared PlayerManager shell.

* More session work.

* TWO PEOPLE CAN ACTUALLY CONNECT.

* Added some event functions to BaseClient.

* Basic multiplayer works again.

* Fixed MsgPlayerList buffer overrun.

* Lobby Updates.
Simplified MsgPlayerList, and cleaned up some networking.

* Cleaned up misc dead code.
Added DocComments to IBaseClient and BaseClient.

* Fixes spelling issues and adds more Doc Comments.
2017-12-21 15:30:44 +01:00
Decappi
cc970df3ad removed a bunch of vulnerabilities (#481)
* removed a bunch of vulnerabilities

* removed a bunch of vulnerabilities

* uncommented the code

* reverted .gitignore to its previous state

* fixed the compilation bug

* and again

* Switched to autoproperties everywhere where I could. There are still 3 unsolved vulnerabilities though.
Fixed some defaults not being set.

* Re-added the default value for BlendMode.
2017-12-16 19:08:24 +01:00
Pieter-Jan Briers
b1e3885bbb Fix lighting on MacOS. (#480)
* Fix lighting on MacOS.

* Make ReRender work outside GameScreen.
2017-11-27 08:27:23 -07:00
Pieter-Jan Briers
0f2ab942e1 Fix window resizing. (#479)
Fixes #475
2017-11-17 19:28:42 +01:00
Pieter-Jan Briers
e32e23de5a Fixes bugs with the entity spawn panel. (#477)
ImageButton respects ForegroundColor again, fixing the erase button
color.
ListBox fixed to not crash reliably.

Fixes #476
2017-11-14 10:02:56 -07:00
Pieter-Jan Briers
f1eaf8a268 Re-add GetComponent methods on IUserInterfaceManager. (#473)
* Re-add GetComponent methods on IUserInterfaceManager.

* Add TryGet methods too
2017-11-13 19:28:02 +01:00
Acruid
13d9eacbb7 Removes UiDev testing code from main menu. (#472) 2017-11-05 11:32:20 -08:00
Acruid
da3a865a0a UI Rework (#463)
* Screen now controls children.

* Input works.

* Transitions work.

* Removed IState.cs.

* More MainMenu.cs cleanup.

* Cleaned up options menu code.

* Simple Image now aligns properly.

* Alignment on the main menu works.

* YOU'RE NOT PERFECT

* Oh Boy ListBoxes.

* Screens actually get laid out properly.

* Big Options.

* Done fixing for tonight.

* More Cleaning!

* More cleanup, documentation and moving things to the base Control class.

* Migrating everything to use parent class properties.

* Lobby menu is looking good!

* More State cleanup.

* Give namespaces proper names.

* More namespace work.

* The chatbox position struggle is finally finished!

* Windows kinda work now.

* Scrollable Container work.

* OH GOD the listbox finally works.

* Ingame MainWindow works.

* Move spawn panels into CustomControls.

* TileSpawnPanel pretty much lays out.

* EntitySpawnWindow layout works.

* DebugConsole shows up, but contents do not display.

* Minor cleanup.

* Scrollbars work.

* Focus system should be working now.
Removed old code.

* Focus system should work as you expect now.
GameScreen now controls KeyBindingManager, so you can block movement keys with the UI.

* Text alignment fixed.
OptionsMenu background fixed.

* Mouseover UI scrolling works again.
Listbox dropdown now shrinks to fit contents.
Minor text alignment issues in Textbox fixed.

* Chatbox input alignment fixed.

* ListPanel is a thing now.

* ChatBox work.

* RichTextPanel now wraps lines.

* RTP cleanup.

* Fixes DebugConsole, Tabs, and Chatbox.
2017-11-05 13:04:49 +01:00
Acruid
5e17f2b08f Fixes opening client console crashing server. (#470) 2017-11-02 19:39:50 +01:00
Acruid
c05a0d4d29 Wraps missing member of SFML's Font and Glyph types. (#471)
Wraps SFML.Graphics.Glyph struct, and adds the rest of the SFML.Graphics.Font functions to the existing wrapper.
2017-11-02 11:21:28 -07:00
Pieter-Jan Briers
54aa6f94dd Adds an update event for the content repo. (#469)
* Adds an update event for the content repo.

* Remove debug output
2017-10-29 19:59:54 +01:00
Pieter-Jan Briers
8ce4376a60 Make engine content more clearly separated. (#468)
All prototypes inside the engine are now clearly marked and prefixed with `__engine_`. Also renames all prototypes to be snake_case, and added [engine] to their name.

Also, the content repo can now select which prototype to spawn for humans.
2017-10-29 19:59:46 +01:00
Pieter-Jan Briers
b342d128d2 Move rendering to a proper view matrix system. (#467)
* Some work making the camera less painful.

* More work.

* Ok Views work!
2017-10-29 19:57:46 +01:00
Pieter-Jan Briers
7d94019722 Optimize PlacementManager startup.
This used to take 4% of the startup time.
2017-10-29 19:55:13 +01:00
Pieter-Jan Briers
a9e65b46b8 Improve lighting performance. (#462) 2017-10-24 19:02:03 -06:00
Pieter-Jan Briers
96e3a66e5c Adds an occluder component. Fixes #440 (#461) 2017-10-24 15:15:39 -06:00
nullarmo
bf75212034 Closes #449 (#460) 2017-10-24 17:22:53 +02:00
Matt Smith
f49a106f04 Catch port in use exception (#457)
* Catch port in use exception

Fixes #454

* Improve messaging of port inuse error
2017-10-23 15:41:35 -06:00
Pieter-Jan Briers
37bb98b1f8 Fix setting IsHardCollidable: take 2 (#455)
* Fix UpdateIsHardCollidable.

Probably should've tested that beforehand.

Also optimized collidable removal extremely to not be O(n), by reworking the way they were stored inside the collision manager.

Seriously why would you use a dictionary as a dumb list of key/value pairs. WHY

* band-aid buggy client code

* better idea

* Apparently I forgot to remove this.
2017-10-22 23:47:03 +02:00
Pieter-Jan Briers
3461766659 Allow IsHardCollidable to be set during bump events. (#453) 2017-10-22 20:48:41 +02:00
Pieter-Jan Briers
2e28361a06 Enables bumping (#452) 2017-10-22 19:28:50 +02:00
Pieter-Jan Briers
824d757771 Adds bump event and IsHardCollidable setter (#450)
* Adds bump event and IsHardCollidable setter

* Make ishardcollidable default to true again.

* Fix compile, rename event.
2017-10-22 18:00:15 +02:00
Pieter-Jan Briers
8dc25ed24d Fix crash when disconnecting from server. (#447)
* Fix crash when disconnecting from server.

For some reason the game screen sets all sprites to have a null texture. This caused Sprite's Texture setter to nullref.

* Implement spritebatch.dispose, remove gaussianblur.dispose
2017-10-22 14:05:42 +02:00
Pieter-Jan Briers
d4dfb1abe5 Improves spritecomponent rendering performance. (#444) 2017-10-22 00:13:28 +02:00
Pieter-Jan Briers
bae3141481 Hopefully fix light manager. (#445)
* Hopefully fix light manager.

* Remove debug logging
2017-10-21 22:59:52 +02:00
Pieter-Jan Briers
8a7ea5b6f0 Improves debug mode perf & look (#443)
* Improves debug mode perf & look

Debug mode no langer tanks FPS by caching the used rectangle and text shapes. The LINQ removal probably helped too.

Sprite AABB debug has been removed since sprite AABBs aren't used anymore.

Implemented text shadowing, which is now used by the debug text to make it more readable.

Implemented collidable debug color from prototypes.

* Remove stray comma.
2017-10-21 19:35:21 +02:00
Pieter-Jan Briers
65d74f53e5 Adds an FPS counter. (#438)
It can be toggled by typing "fps" into the console.
2017-10-20 11:40:53 -06:00
Pieter-Jan Briers
3c1bc4ce88 Ok let's not do that fix just yet 2017-10-20 17:11:57 +02:00
Pieter-Jan Briers
a9d06e7612 Sonar code cleanup. 2017-10-20 17:00:19 +02:00
Pieter-Jan Briers
78d5965ba5 Woo late night compiler fighting! 2017-10-20 16:54:00 +02:00
Pieter-Jan Briers
d113938736 Encapsulate SFML to reside completely inside SS14.Client.Graphics. (#437)
* WiP of making SFML encapsulate by Client.Graphics.

* Up to like 40 files changed already!

* My hands are writing words.

* More work.

* Render states

* Client Graphics compiles

* More work

* C# compiler might be bugged

* C# compiler might be bugged

* Rust has ruined me

* It works!
2017-10-20 16:49:00 +02:00
Serkket
92e9d6636d Just a Mesely Sonar Cleanup (#436)
* TODO: Do all the TODOs

Just a sonar "clean up"

* Update1
2017-10-16 22:25:23 +02:00
Acruid
7fb7838738 Lighting Performace Changes (#435)
* Flips the lighting texture in the Shader instead of on the CPU.

* Clearing a RenderImage twice is pointless.
2017-10-13 22:23:23 +02:00
Pieter-Jan Briers
a3a2210de3 Map loading basics. (#434)
* Map loading basics.

Moves the entity saving system into a map loader kinda deal. Doesn't
save grids, but it's a start.

* Fix unit tests
2017-10-09 18:48:25 +02:00
Pieter-Jan Briers
e200cab1fb Box2i additions (#433)
Size property and casts to/from OpenTK.Box2.
2017-10-09 18:41:43 +02:00
Pieter-Jan Briers
92d8ed539a IServerTransformComponent improvements. (#431)
* IServerTransformComponent improvements.

IServerTransformComponent now more closely represents the API in TransformComponent, which was lacking because ITransformComponent is client-side, and the client cannot move entities itself, for example.

* Fix compile error
2017-10-01 22:27:36 -06:00
Pieter-Jan Briers
cb9ca3cc3c Fix network replication on WearableAnimatedSprite (#430) 2017-09-30 16:56:44 +02:00
Ash Walker
1065df5efd Fix string null check (#429) 2017-09-30 16:29:20 +02:00
Pieter-Jan Briers
20012304bd Make VS not modify the sln for buildchecker. (#428)
It was fixing the config because buildchecker had no hints to what the targets were.
2017-09-30 11:59:24 +02:00
Pieter-Jan Briers
349b366143 Fix transform parenting network replication. (#427) 2017-09-30 11:59:18 +02:00
Pieter-Jan Briers
64ea01a960 Crude system for allowing content to override the default mob. (#426)
The HumanMob_Content mob is spawned instead if it's defined.
2017-09-29 18:27:53 +02:00
Pieter-Jan Briers
1ebf093713 Allows creating other components inside Initialize(). (#425) 2017-09-26 23:08:53 +02:00
Pieter-Jan Briers
34fd263625 Fix content netserializer on server (#424)
It was not being included on the server, and type mismatches here are BAD.
2017-09-26 21:56:09 +02:00
Pieter-Jan Briers
a7a8d25a17 Disable type check temporarily. (#423)
It slows down development and has issues that need solving, like solutions to System.Type.
2017-09-26 20:28:44 +02:00
Pieter-Jan Briers
7bf3f70e92 Add more whitelisted types. (#422) 2017-09-25 20:53:15 +02:00
Pieter-Jan Briers
d37cdaf78c Fix sprites fetching transform in OnAdd instead of Initialize. (#421)
This caused a crash race condition.
2017-09-23 22:09:16 +02:00
Pieter-Jan Briers
a88a1ef72d Refactor and clean up containers. (#420)
* Refactor and clean up containers.

Containers are no longer arbitrarily bound to a single component, they use string IDs instead.

The API to interact with containers has been documented with doc comments.

Container creation now uses a static method.

Containers are sealed instead of abstract. Custom logic doesn't go on containers.

Theoretically fixed various bugs:
* Makes container manager creation work, previously it'd nullref.
* Containers being deleted now correctly detaches contained entities.

Still needs unit tests before being merged, because this code is still 100% untested.

* Lots of fixes, unit tests.
2017-09-17 21:43:14 -06:00
Pieter-Jan Briers
7484fe8fba Fix git_helper.py on Python 3.5 (#419)
* Fix git_helper.py on Python 3.5

* Fix it harder

* If at first you don't succeed.
2017-09-16 12:43:46 +02:00
Pieter-Jan Briers
d5fdd9be1f x64 unit test platform target. (#418) 2017-09-15 13:44:43 -06:00
clusterfack
1bb0227ff0 Makes Coordinates more Structy (#417)
More readonly-ish and less write-ish
2017-09-14 17:38:46 -05:00
Pieter-Jan Briers
4c2632710c Fix solution file. (#416)
I n S t A m E r G e
2017-09-14 15:13:59 -06:00
Pieter-Jan Briers
518a366c7e Attempt to fix Python on Travis being too old. (#415)
* Attempt to fix Python on Travis being too old.

* Fix RUN_THIS.py too.

* Fix CI builds blocking.

* Fix BuildChecker.csproj Python versioning in Travis.
2017-09-14 14:47:00 -06:00
clusterfack
07878ad7a7 Multiple Map System (#414)
* The million error march

This commit replaces many of the vector2's with their appropriate version of either LocalCoordinates, WorldCoordinates, or ScreenCoordinates

* Change transforms to send back worldcoordinates for position instead

* Adds coordinate class file

* What the fuck is going onnnnnn

* What the fuck is goign onnnnnnnnnnnn

* Changes some shit to use multiple maps instead
Fixes the compile errors in shared first

* Compile errors mostly fixed, about to rebase

* Merge branch 'master-wizfederation' into multiplemaps

# Conflicts:
#	SS14.Client.Graphics/CluwneLib.cs
#	SS14.Client/GameObjects/ClientEntityManager.cs
#	SS14.Client/GameObjects/Components/Renderable/AnimatedSpriteComponent.cs
#	SS14.Client/GameObjects/Components/Renderable/ItemSpriteComponent.cs
#	SS14.Client/GameObjects/Components/Renderable/ParticleSystemComponent.cs
#	SS14.Client/GameObjects/Components/Renderable/SpriteComponent.cs
#	SS14.Client/GameObjects/Components/Transform/TransformComponent.cs
#	SS14.Client/Interfaces/GameObjects/IClickTargetComponent.cs
#	SS14.Client/Placement/Modes/AlignSimilar.cs
#	SS14.Client/Placement/Modes/AlignSnapgridBorder.cs
#	SS14.Client/Placement/Modes/AlignSnapgridCenter.cs
#	SS14.Client/Placement/Modes/AlignTileAny.cs
#	SS14.Client/Placement/Modes/AlignTileEmpty.cs
#	SS14.Client/Placement/Modes/AlignTileNonSolid.cs
#	SS14.Client/Placement/Modes/AlignTileSolid.cs
#	SS14.Client/Placement/Modes/AlignWall.cs
#	SS14.Client/Placement/PlacementManager.cs
#	SS14.Server/GameObjects/ServerEntityManager.cs
#	SS14.Server/Interfaces/Player/IPlayerManager.cs
#	SS14.Server/Player/PlayerManager.cs

* Whops

* Compiles, loads somewhat, lights nonfunctional, many TODOs left

* serializes states, fixes incorrect spawn

* Fix map sending to the client

* Makes things only render on the correct zlevel

* Makes entity manager wait to intiialize shit after the maps arrive

* Fixes placement net messages

* Improves some of the placement managers, others need a bit of testing and tidying up again

* Transform fix

* Polishing, make coordinates into structs

* Remove resolved comments

* Last commit before master merge

* Fix the rest of the conflicts

* Fixes super spooky bug

* Fixes cross zlevel collisions

* Fix the rendering system to render the tile system regardless of grid location
2017-09-14 07:37:31 -06:00
Acruid
a483c8c88a Sprite Clicking Rework (#413)
* Fixed AnimatedSpriteComponent clicking, SpriteComponent is still bugged.

* Added Box2.Scale helper function.
Cleaned up the WasClicked function in AnimatedSpriteComponent.

* Renamed AABB to LocalAABB in ISpriteComponent and IRenderableComponent, so it is clearer what the property contains.
Fixed more bugs in AnimatedSpriteComponent.WasClicked(), and added exceptions.

* Fixed SpriteComponent.WasClicked().
Fixed unrelated bug in EntityManager, so entities can be properly deleted again.

* Fixed issue with sprite sorting using TextRect instead of LocalAABB.
2017-09-13 07:18:35 -06:00
Dumplin
cd74d12812 Fixed Movement; Edited OSX error message; Fixed some Sonar complaints (#410)
* * CluwneLib.cs: Make _window a local variable

* BaseCollection.cs: Formatting issue

* BaseServer.cs: Removed unused parameter

* ChatManager.cs: Made public encapsulated fields

* BoundKeyEventArgs.cs: Public encapsulated parameters

* CVarFlags.cs: Explicit variable setting

* ComponentFactory.cs: unused variable

* * CluwneLib.cs: Make _window a local variable

* BaseCollection.cs: Formatting issue

* BaseServer.cs: Removed unused parameter

* ChatManager.cs: Made public encapsulated fields

* BoundKeyEventArgs.cs: Public encapsulated parameters

* CVarFlags.cs: Explicit variable setting

* ComponentFactory.cs: unused variable

* CVar fixes

* Edited the OSX error message to be a little more helpful. (You have to edit the .dylibs because they come broken).

* Fixing the sprite movement problem

* Reverted error message

* Revert Again
2017-09-11 09:43:21 -06:00
Pieter-Jan Briers
eda5ad606b Make Sonar only run on master. (#409) 2017-09-06 22:59:30 -06:00
Pieter-Jan Briers
ddefef65ae Add our own Vector2 type. (#407)
* Add our own Vector2 type.

* Fix Clamp() typo.

* I shouldn't code when tired.

* Some unit tests.
2017-09-05 17:12:14 -06:00
Pieter-Jan Briers
062db741bd Update Mac Natives error message. (#406)
Now looks for 2.4 instead of 2.2 and suggests simply copying files instead of doing complicated InstallNameGuiTool stuff.
2017-09-05 17:11:21 -06:00
Pieter-Jan Briers
d46c2da175 Adds x64 platform targets. (#405)
Note that these won't work on Windows as that's still x86 SFML natives.
2017-09-02 21:51:08 -06:00
Acruid
1c6200666f Texture Loading Performance (#404)
* ~20% speed increase for loading textures.

* clickmap was useless, it is completely removed.
2017-09-01 14:39:40 -06:00
Acruid
c9666413b2 CluwneLib Static Variables Removal (#403)
* Changed Cluwnelib.TileSize name to CluwneLib.PixelsPerMeter. I think its more descriptive of what the name is.
Removed the splash screen debug #ifdef's, and replaced with proper ConditionalAttributes.

* Window encapsulated.

* Add the RELEASE compilation symbol to Release builds of all SS14 projects.

* More CluwneLib cleanup.
2017-09-01 14:39:27 -06:00
Pieter-Jan Briers
2575786a6e Allow deletion of entities and components during iteration. (#401)
* Allow deletion of entities and components during iteration.

* Remove some cases of _entities.Values
2017-09-01 14:07:00 -06:00
Acruid
149a6280b0 Move Lighting to SS14.Client.Graphics (#400)
* Interface to Interfaces.

* Lighting moved to SS14.Client.Graphics.

* Remove more dead code.
2017-08-31 08:21:14 -06:00
clusterfack
340d75c350 Fixes Bounding/Clicking Bugs (#396)
* Fixes Bounding/Clicking Bugs

This fixes a number of bugs with the clicking system.

- Wearable animated components were fixed so that they properly report their AABB
- Wearable animated components were fixed so that they properly use their nonwornsprite or wornsprite for checkclicking
- Fixes the clicking system only choosing the player character
- Fixes the eraser only working within a 1.5 tile range

* Uses FloatMath.CloseTo()
2017-08-29 12:03:09 -06:00
clusterfack
8d9a0e5142 Creates a Snap Checking System (#389)
* Creates a Snap Checking System

Creates a system that attempts to sanitize placement of objects when attempting to spawn them on snapping grids. This checks whether an object is trying to spawn specifically on a snap grid, and if it is checks against a snapflag of the type to see if other exclusive snappable objects are on that snap grid point.

Separates the spawnentityat into tryspawnentityat which checks for snappables, and forcespawnentityat which completely ignores that.

* Fixes the yaml placement
Fixes exemption from tryspawnentityat which didn't use the bool
Snap placement managers show when canspawnat is preventing them from spawning

* Improve snap placement managers again
Fix using prototype.name instead of prototype.ID

* Nope nope

* I need to unify these two types after the next refactor

* Move to strings for snap flags.

* Check

* 「s h i t c o d e」

* Gracias appveyor now I have seen the light

* Uses FloatMath.CloseTo() to check float equality
2017-08-29 12:01:44 -06:00
clusterfack
22f0cbd8f7 Changes CloseTo again slightly (#399) 2017-08-29 07:33:17 -06:00
clusterfack
5d443b6452 Adds closeto function for checking floating point equality (#398) 2017-08-28 18:28:33 -06:00
Acruid
83f8f37dc1 Prototypes now use ResourceManager. (#394)
* "./Resources/" folder is now mounted instead of "./" in the ResourceManager.
Prototypes now use the ResourceManager.
Added FindFiles(string path) to recursively find files in the ResourceManager.
General FileHelper bug fixing and cleanup.

* Ran SS14.Shared/ContentPack* through the code cleanup again.

* Put PJB's comma back in.
2017-08-28 17:10:15 -06:00
UristMcDorf
cc886ab614 Add required registrations in whitelist for temperature, damageable, destructible. (#393) 2017-08-28 14:21:30 +02:00
clusterfack
4273266950 Adds rendering color parameter to sprite components (#388)
* Adds rendering color parameter to sprite components

* Forgot to remove this

* Sets default value to white

* Like this you mean?
2017-08-27 10:02:11 -06:00
Acruid
658a0aee7f Entity Component Shutdown Fix. (#387)
Moved various component cleanup code from OnRemove to Shutdown.
2017-08-27 09:58:04 -06:00
Acruid
9898c2cf49 Turns INetSerializableType into NetSerializableAttribute (#386)
Turns INetSerializableType into NetSerializableAttribute.
2017-08-26 22:16:27 -06:00
Acruid
ddb5d9f3a8 NetGrapher Cleanup (#385)
Fixed bug in NetManager.
2017-08-26 22:15:36 -06:00
clusterfack
f227b3abc0 Adds grid to snap grid placement manager (#384)
* Adds grid to snap grid placement manager
Fixes drawline

* Done
2017-08-26 19:21:02 +02:00
Acruid
3920da2d9f Fixes moonwalk bug and inverted up/down controls. (#380) 2017-08-26 19:20:56 +02:00
clusterfack
bfbb31aa58 Snapgrid placement (#377)
* Snapgrid placement

* REEEEEEEEEEEE world space
2017-08-26 09:33:41 +02:00
clusterfack
799be40018 Fixes scrollable containers (#381) 2017-08-26 09:33:33 +02:00
wixoaGit
152eb8dd19 Ignore outdated state update messages (#383) 2017-08-26 09:33:23 +02:00
wixoaGit
c168c0fde1 Move client GameState management (#375)
* Move client GameState management

* Remove unnecessary sequence sending

* Move resolves to dependencies, set CurrentState instead of finding it
2017-08-25 21:21:14 +02:00
clusterfack
af3c90e2a8 Removes bad shutdown (#376)
* Undoes this

* Move it to the entity manager shutdown
2017-08-25 21:20:32 +02:00
clusterfack
12e6ef88c3 Makes Walls Entities, removes tile walls (#373)
* Makes walls into entities

* Fix the align tile empty placement mode, holy shit collision bounds is fucked

* Make shadowcasting from walls work again

* Fix lights on tiles
2017-08-24 09:38:28 -06:00
clusterfack
28d74cec56 Shifts down the mobs bounding box by 0.6 tiles. (#374) 2017-08-24 14:40:28 +02:00
Pieter-Jan Briers
02efd0b41a Made the git hooks history tolerant. (#372)
If its python file doesn't exist the hooks don't run.
2017-08-23 17:13:43 -05:00
Pieter-Jan Briers
5bf337479f Fix UnknowPrototypeException typo. (#371) 2017-08-23 16:02:36 -05:00
clusterfack
3816cdb3e4 Tiles Helper Functions (#370)
* Creates a helper function for making tile indices into tile refs, and a function to get a tileref one step in any particular direction of another tileref.

* Gottem

* k
2017-08-23 11:08:42 +02:00
Pieter-Jan Briers
e54339bb5c Make null data nodes on prototypes not call LoadData() on spawned entities. (#368) 2017-08-23 07:53:31 +02:00
Pieter-Jan Briers
98d867393c Update NUnit package version. (#367)
* Update NUnit package version.

* Let's not have Travis blow up.

* And I still messed the HintPath up.
2017-08-23 07:53:16 +02:00
Pieter-Jan Briers
8dd9a3c097 Content prefixes for the reflection manager. (#369)
Allows doing class: Prototypes.DiscoBall instead of Content.Client.Prototypes.DiscoBall
2017-08-23 07:53:04 +02:00
Pieter-Jan Briers
61d30be6b3 Lighting API cleanup. (#366) 2017-08-22 07:59:13 -06:00
Pieter-Jan Briers
7aa85c0b0c ColorUtils extensions, fixes and tests. (#365)
* Color4 extensions for byte color parts, fix WithAlpha with byte.

* Unit tests and bug fix for FromHex.
2017-08-22 07:38:29 -06:00
Pieter-Jan Briers
3574395843 Fix the entity spawn panel throwing NotImplementedException, Color -> Color4 (#364)
* Fix the entity spawn panel throwing NotImplementedException.

* More rabbit hole Color conversions.
2017-08-22 07:37:04 -06:00
Pieter-Jan Briers
13b333dcf6 Fix entity initialization. (#363) 2017-08-21 15:37:04 -06:00
Pieter-Jan Briers
bead08fc7c Fix prototype class inheritance. (#362) 2017-08-21 15:36:34 -06:00
Pieter-Jan Briers
073fb20b66 Adds a per-frame virtual entity update method. (#361) 2017-08-20 19:39:42 -06:00
Pieter-Jan Briers
7adca8280c Remove some IComponent type bounds, component shutdown event. (#360)
* Remove some IComponent type bounds, component shutdown event.

Methods like GetComponent<T> don't require T to implement IComponent anymore.

Added an event to IComponent that is invoked whenever the component is shut down.

* Always at least compile your stuff kids.
2017-08-20 19:38:20 -06:00
Gilles Coremans
61183eaba3 Fixes a sonar bug. (#359) 2017-08-20 19:37:08 -06:00
wixoaGit
477b0460e8 Implement MsgEntity (#358)
* Implement MsgEntity

* Move MsgEntity registration to GameController

* Fix serializer usage
2017-08-20 19:36:33 -06:00
Pieter-Jan Briers
dd18105c92 Remove SFML from shared and server. (#355)
* Remove SFML from shared and server.

* Fix unit tests.
2017-08-20 11:07:35 -06:00
Silver
585f2467c2 Update Linux Readme (#357) 2017-08-19 23:13:12 -06:00
Pieter-Jan Briers
0c3e4ea495 Allows inputting the server port on the client. (#354) 2017-08-19 20:19:00 -06:00
Pieter-Jan Briers
afe0c95cea Fix a race condition in collidablecomponent.OnAdd (#353) 2017-08-19 20:17:11 -06:00
PJB3005
e84f072278 Update submodule to hopefully disable SFML Sonar. 2017-08-19 13:55:31 +02:00
PJB3005
ca0bbab8c0 Attempt two. 2017-08-19 13:43:46 +02:00
PJB3005
6530b8806c Attempt to ignore SFML on Sonar 2017-08-19 13:35:57 +02:00
Pieter-Jan Briers
294057e3a1 Fix resource copying on the client. (#352) 2017-08-19 11:10:55 +02:00
Pieter-Jan Briers
a57abb2ca7 Move to our own SFML.NET fork with a submodule. (#351)
* Remove SFML binaries in repo.

* Add SFML.NET submodule from our fork.

* Get build checker for submodule handling.

* Fix project references. Remove SFML from non-client.

* Make it work!

* Automatically fetch Windows CSFML natives.

* Fix project file now I'm done debugging.

* Fix project references.

* Fix CI

* Now if only I didn't typo...

* Fix Travis too

* Fix lighting.

* Move shaders over to new API.

* Fix some obsoletions.

* Improve SetUniformArray casts
2017-08-19 10:28:39 +02:00
Pieter-Jan Briers
f0d6680977 Fix accidental integer division. (#349)
AnimatedSpriteComponent.AABB used integer division, fixed now.
2017-08-19 10:23:19 +02:00
Pieter-Jan Briers
49f7b987f5 Refactor entity initialization and fix doc comments. (#346)
Entities now initialize in a few stages. First all their components are added, then entity.PreInitialize() is called, then all components are initialized, then entity.Initialize() is called.

This multi-level initialization system should hopefully be more powerful and make things like prefetching components easier.

Also what the crap WAS the old init system even?
2017-08-19 10:19:22 +02:00
clusterfack
444d0847b6 Fixing the current placement system (#347)
* WIP: Fixing the current placement system

* Placement system sprites come back pls

* HE TURNED THE FREAKING SPRITES GAY

* TECHNICALLY THIS MAKES THE SPRITES NOT GAY

* Mostly Shows sprites correctly

* Finished this bulllllshit

* Rename some things
2017-08-19 08:59:57 +02:00
clusterfack
005bd9e95c Containers (#339)
* #Part 1

Created basic container dictionary and framework for transform parenting

##Work Left until completion

1. Registering containers through a container manager
2. Registering onmove events onto the parents event handler on insertion
3. Removing onmove events from the parent event handler on removal
4. An event called upon insertion and removal from storage objects
5. Redirecting transform getters to use the uppermost parents transform

* Part 2

Creates some basic code for removing entities generally from other entities
Creates code for creating containers
Adds some basic logic for parents overriding transform getters
Adds logic to prevent circular references
Makes Container an abstract class for things to create their own versions from

* Moves container classes to shared so they can be registered on server and client
Registers container classes on server and client
Makes ContainerManager get created properly by the component factory

* Adds missing } and finalizes csproj changes

* Add exception for double containers on one component

* Makes sure parents are attached and detached at the correct time

* Address some issues, cause others perhaps

* Rename Files
Changes Container Class Inheritance
Vague stuff

* Move Icontainer and Icontainermanagercomponent to ss14 server
Make servertransform interface for parents to be serverside only
Deregister containermanager from the client IOC

* Remove Icontainer And Icontainermanager from shared csproj

* Fix

* To get git to recognize this I have to delete them

* And then readd the files, fuck you git

* Be specific you daft cunt
2017-08-18 11:18:42 -06:00
Pieter-Jan Briers
dfcf0349ca Fix F2 on Unix, collision bug and join crash. (#348)
* Make F2 not crash on Unix, fix join crash.

* Fix collision when moving to the bottom or right.

The bug was caused by 1d5ca223de. Collision adds to the AABB's Left and Top properties to do offsets, but when moving to OpenTK, this stopped working, as Right and Bottom now had to be offset too. I missed this, and as such, your hitbox is smaller when moving to the bottom or right. This allows you to clip into walls, but when you're in you can't move the other direction, as your hitbox is also *larger* when moving to the top or left.
2017-08-18 13:07:51 +02:00
Matt Smith
45a7a809db Reduce code complexity (#345) 2017-08-18 10:54:35 +02:00
Acruid
48852c5ee8 Grid Placement Fix (#344)
* Physics works again.

* forgot some SFML stuff.

* Cluwnelib does not depend on 1.0m = 1 tile anymore.

* Fixed bug with tile placement in wrong spot.
Fixed blue box issue.
2017-08-17 15:42:44 -06:00
Acruid
60ac4a9e26 Collision Fix (#340)
* Physics works again.

* forgot some SFML stuff.
2017-08-17 23:20:12 +02:00
h3half
5351f581f1 Removes commented-out code (#343)
Removes most of the commented-out code from sonarqube. There's
definitely more hiding throughout the codebase, but this should be most
of it.
2017-08-17 11:58:37 +02:00
Pieter-Jan Briers
e719dd1440 Make the lighting toggle properly disable all lighting rendering. (#342) 2017-08-16 12:38:55 -06:00
Pieter-Jan Briers
1d5ca223de Replace SFML math types with OpenTK and custom ones. (#341)
* Attempt to messily convert the codebase to use OpenTK math.

* Vector2f is gone. It compiles!

* Fix unit tests.

* Goodbye FloatRect

* Goodbye IntRect, say hello to Box2i.
2017-08-16 11:22:48 -06:00
Silver
3170552b3d Rename LICENSE.TXT to LICENSE-CODE.TXT 2017-08-15 14:44:40 -06:00
dylanstrategie
18692e21a4 Fix issues with Menu Window (#336)
* Fix issues with Menu Window

* Requested changes
2017-08-15 14:17:57 -06:00
Acruid
ae0ccc72b4 Map Manager Refactor (#338)
* Merged Client and Server Map interfaces into a Shared version.
Merged Client and Server MapManager system into a shared version.

* Added some encapsulation to the map system.
Added doc comments to client and server classes.
It compiles, but it DOES NOT WORK.

* Now with 89% more encapsulation.
Added a MapGrid object to the MapManager.

STILL A BUGGY MESS!

* Rendering bugs were fixed.

* Fixed alignment bug with GetTilesIntersecting.

* Cleanup the interfaces a bit.

* Code update.

* Merged client/server MapNetworkManager into shared version.

* Nightly work. Compiles, does not run.

* Shared networking looks like it works.

* Cleanup and remove SFML.
2017-08-14 17:30:57 -06:00
Pieter-Jan Briers
f5eb8cd55b MSBuild MacOS handling. (#337)
* Makes MSBuild distinguish Linux and MacOS.

* Fix TargetOS

* Copy mac natives during build.

* Fix travis

* Fix typo.
2017-08-14 18:54:46 +02:00
Pieter-Jan Briers
db1c71994b Give content access to OpenTK Math and Color types. (#335) 2017-08-14 18:23:46 +02:00
Silver
96df096303 Revert "Gives content access to OpenTK math and color types. (#332)" (#334)
This reverts commit 9669221d37.
2017-08-13 21:34:56 +02:00
Pieter-Jan Briers
9669221d37 Gives content access to OpenTK math and color types. (#332) 2017-08-13 13:33:32 -06:00
Pieter-Jan Briers
480ed6d74c Fixing some compile warnings. (#331)
All the obsoletions from netmessages will be for another PR.
2017-08-13 11:30:23 -06:00
Dan
1d2614d75f Refactor align modes (#330)
* Refactor align modes

* Remove some unnessecary lines
2017-08-13 14:30:55 +02:00
Pieter-Jan Briers
1c5f540751 Remove component instantiation messages. (#324) 2017-08-13 00:46:00 +02:00
Pieter-Jan Briers
f4fe79346e Inverse entity queries. (#322)
* Inverse entity queries.

They now effectively behave like Func<IEntity, bool>.
The actual matching logic is now done on entity queries.

They've also been abstracted, as such there are now multiple entity
query types to pick from.

Also generic clean up.

* Fix doc comment on the exclude list.

* Use Predicate<> instead of Func<>

* Fix compile, Predictae<> doesn't work
2017-08-13 00:31:58 +02:00
Acruid
cb5bfbb3da Component Rework (#325)
* Cleans up base Component.

* Clean up PhysicsComponent.
Merge VelocityComponent with PhysicsComponent.

* Renamed HitBoxComponent to BoundingBoxComponent.
Cleaned up BoundingBoxComponent.
Added Box2 to the serializer and SfmlCompatibility.

* Serverside movement works.

* Removed DirectionComponent.
Everything is broke, time to sleep.

* Removed BasicMoverComponent and SlaveMoverComponent.
Added Parenting skeleton to TransformComponent.

* Move ClickAbleComponent to Input.
Fixed lights.

* More general cleanup.

* Move Physics system into Shared.

* Removed ColliderComponent.

* Fixed AnimatedSprite Rotation.

* Added Vector2i as a type.

* Fixes StackOverflow bug by just not using SFML.Vector2f.

* Should fix Build issues.

* Removed pointless server console resizing.
Fixed Unit tests working in VS.
Updated PrototypeManager_Test.cs tests.

* Adds SS14.Shared/Maths/VecMath.cs helper functions.

* Switched to Angle type.
2017-08-13 00:10:06 +02:00
Pieter-Jan Briers
f41050583e Bit of unit test stuff. (#326)
* Unit test for #294

* Remove empty warning tests.
2017-08-13 00:09:42 +02:00
clusterfack
85fa167e17 Fixes Exceptions on Rejoining (#327)
* Fix server crash on rejoin

* Makes it possible to rejoin without exception

* Proper fix by culling ALL the component lists when the entity manager shuts down
2017-08-12 10:25:33 +02:00
Pieter-Jan Briers
b9723b6504 Content repo can now define console commands. (#321) 2017-08-11 15:44:47 -06:00
Pieter-Jan Briers
2e64de57c6 Makes the main menu pretty. (#320)
>duct tape logo

INSTAMERGE
2017-08-11 14:37:31 -06:00
Pieter-Jan Briers
feaf4160e8 Load unatlassed images from disk as sprites (#319)
This'll allow content to add sprites.
2017-08-11 08:23:23 +02:00
Pieter-Jan Briers
93fd0014b4 Fix content entry invocations, whitelist types. (#317) 2017-08-09 21:50:45 -06:00
Pieter-Jan Briers
22f07e3649 Adds OS targeting to the build setup (#316)
* Adds OS targeting to the build setup

Will make cross platform builds (Linux -> Windows) easier.

* Rename Windows_NT to Windows and explicitly do Linux.
2017-08-10 00:04:31 +02:00
clusterfack
398a3917dc Returns runclient and runserver 2017-08-09 08:26:08 -05:00
Pieter-Jan Briers
04fa16902f Fix SFML memory leak. (#315) 2017-08-09 07:39:19 +02:00
Jordan Brown
b0e42ef650 Removes support for resource pack passwords (#314) 2017-08-08 21:36:53 +02:00
Pieter-Jan Briers
b0d7ee16c1 Deprecate resource pack temporarily. (#312)
* Deprecate resource pack temporarily.

Temporarily being until we actually need content downloading from server.
Resources now get copied to the output directories directly.

* Move prototypes around.
2017-08-08 14:48:15 +02:00
Pieter-Jan Briers
b9ece2888b Repo cleanup (#310)
* Reduce build size by removing redundant files.

22 MB of the build output was OpenTK.xml, the doc file for it.
This commit removes a lot of files like PDB files from the build output
on Release, cutting build size down to 13 MB.

Also deleted a ton of dead third party files in Third-Party, and the two
spare copies of CSFML...

* Remove more dead files.

* Even more!

* Generic repo cleanup. Removing dead files all over.

What the hell was filesystemeditor.exe supposed to be?
2017-08-08 12:47:31 +02:00
Pieter-Jan Briers
d1b29a6f94 Update NetSerializer, move to NuGet with it. (#311)
NetSerializer has been updated and moved to the latest version. This
means that the static nonsense it previously had is fixed and we can
properly use ISS14Serializer.
2017-08-08 12:47:18 +02:00
clusterfack
a43da12f9b Fixes a rare out of bounds exception (#313)
* Fixes a rare crash

Fixes a crash that occurs from the following
>return AngleDirections[(int)Math.Floor(angle/45f)];

System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'

That occurs most likely due to a float rounding error

* Apparently this works fine
2017-08-08 11:51:38 +02:00
Pieter-Jan Briers
4607a106d0 Of course it works a lot different on the client. 2017-08-06 14:47:20 +02:00
Pieter-Jan Briers
de9fd0cbaf Fix resource pack on client, regression in #306 2017-08-06 12:56:12 +02:00
Acruid
2e3315cd39 CompState Cleanup (#308)
* Changed GameObjects.Component namespace back to GameObjects.Components namespace to prevent colliding with GameObjects.Component class.

* Changed IComponent.HandleComponentState to use polymorphism instead of dynamic keyword.
Cleaned up nesting in each implementation of IComponent.HandleComponentState.

* Moved all shared ComponentStates to the SS14.Shared.GameObjects namespace to be more in line with client & server components.
Made all ComponentStates immutable, as they should be.
2017-08-06 12:16:47 +02:00
Acruid
f7b1b9c4b6 Client Timing (#309)
* Appease lord Sonar.

* Client timing *should* work.
2017-08-05 17:15:33 -06:00
Pieter-Jan Briers
2572bc94c7 Increase default logging verbosity to DEBUG. (#307) 2017-08-05 23:32:57 +02:00
Pieter-Jan Briers
47f1aa6565 Unhardcode content pack locations. (#306)
* Unhardcode content pack locations.

The previous hardcoded path was causing problems for the content repo.
Now the content packs are loaded from the executable directory.
The build system copies the pack from the Resources/ folder now.

* Fix CI
2017-08-05 23:32:44 +02:00
Pieter-Jan Briers
fdde14b93e Makes client and server load shared assembly too. (#304)
Also fixes #303
2017-08-05 23:32:28 +02:00
Pieter-Jan Briers
975eea832d Clean up build targets and output dirs. (#302)
* Clean up build targets and output dirs.

All old Any CPU targets and mixed ones have been removed. They wouldn't have worked anyways due to SFML.

Cleaned up all the build output directories to be neat and clean.

* Fix Travis
2017-08-04 07:11:28 -06:00
2562 changed files with 213405 additions and 84195 deletions

View File

@@ -1,28 +0,0 @@
environment:
sonarqubekey:
secure: h3llq6OeVa94hJ71UOEQSQDq75vFt+doso7iFry0gvt/fFcyeonY9wY+ETOIVITK
global:
PYTHONUNBUFFERED: True
HEADLESS: 1 # For the unit tests.
version: 0.1.0.{build}
pull_requests:
do_not_increment_build_number: true
image: Visual Studio 2017
clone_depth: 10
install:
- ps: if (-Not $env:APPVEYOR_PULL_REQUEST_NUMBER) { cinst msbuild-sonarqube-runner }
before_build:
- cmd: nuget restore SpaceStation14.sln
- ps: if (-Not $env:APPVEYOR_PULL_REQUEST_NUMBER) { MSBuild.SonarQube.Runner.exe begin /k:"ss14" /d:"sonar.host.url=https://sonarqube.com" /d:"sonar.login=$env:sonarqubekey" /d:"sonar.organization=space-wizards" }
build:
project: SpaceStation14.sln
parallel: true
verbosity: minimal
after_build:
- ps: if (-Not $env:APPVEYOR_PULL_REQUEST_NUMBER) { MSBuild.SonarQube.Runner.exe end /d:"sonar.login=$env:sonarqubekey" }
- cmd: py -3.5 Resources\buildResourcePack.py --resources-dir .\Resources --out .\Resources\ResourcePack.zip --atlas-tool .\Tools\AtlasTool.exe --no-animations --to-stderr

View File

@@ -1,4 +0,0 @@
{
"phabricator.uri": "http://phab.nexisonline.net",
"project.name": "Space Station 14"
}

View File

@@ -1,11 +1,14 @@
root = true
root = true
[*]
insert_final_newline = true
indent_style = space
indent_size = 4
trim_trailing_whitespace = true
charset = utf-8-bom
charset = utf-8
[*.{csproj,xml,yml,dll.config}]
[*.{csproj,xml,yml,dll.config,targets,props}]
indent_size = 2
[*.gdsl]
indent_style = tab

28
.github/CODEOWNERS vendored
View File

@@ -1,14 +1,20 @@
# Lines starting with '#' are comments.
# Each line is a file pattern followed by one or more owners.
# Last match in file takes precedence.
# These owners will be the default owners for everything in the repo.
# * @defunkt
* @PJB3005 @Silvertorch5
# Ping for all PRs
* @Acruid @PJB3005 @Silvertorch5
# Order is important. The last matching pattern has the most precedence.
# So if a pull request only touches javascript files, only these owners
# will be requested to review.
# *.js @octocat @github/js
/Robust.*/Audio/Midi/ @Zumorica
# You can also use email addresses if you prefer.
# docs/* docs@example.com
/Robust.Client.NameGenerator @PaulRitter
/Robust.Client.Injectors @PaulRitter
/Robust.Generators @PaulRitter
/Robust.Analyzers @PaulRitter
/Robust.*/GameStates @PaulRitter
/Robust.Shared/Analyzers @PaulRitter
/Robust.*/Serialization @PaulRitter
/Robust.*/Prototypes @PaulRitter
/Robust.Shared/GameObjects/ComponentDependencies @PaulRitter
/Robust.*/Containers @PaulRitter
# Be they Fluent translations or Freemarker templates, I know them both!
*.ftl @RemieRichards

31
.github/workflows/build-test.yml vendored Normal file
View File

@@ -0,0 +1,31 @@
name: Build & Test
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
with:
submodules: true
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 6.0.100
- name: Install dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore /p:WarningsAsErrors=nullable
- name: Test Engine
run: dotnet test --no-build Robust.UnitTesting/Robust.UnitTesting.csproj -v n

77
.github/workflows/codeql-analysis.yml vendored Normal file
View File

@@ -0,0 +1,77 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
#on:
# push:
# branches: [ master ]
# pull_request:
# # The branches below must be a subset of the branches above
# branches: [ master ]
# schedule:
# - cron: '30 18 * * 6'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
language: [ 'csharp' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
# Learn more:
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
steps:
- name: Checkout repository
uses: actions/checkout@v2
with:
submodules: true
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 6.0.100
- name: Build
run: dotnet build
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

53
.github/workflows/publish-client.yml vendored Normal file
View File

@@ -0,0 +1,53 @@
name: Publish Client Build
on:
push:
tags:
- 'v*'
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Parse version
id: parse_version
shell: pwsh
run: |
$ver = [regex]::Match($env:GITHUB_REF, "refs/tags/v?(.+)").Groups[1].Value
echo ("::set-output name=version::{0}" -f $ver)
- uses: actions/checkout@v2
with:
submodules: true
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 6.0.100
- name: Package client
run: Tools/package_client_build.py -p windows mac linux
- name: Shuffle files around
run: |
mkdir "release/${{ steps.parse_version.outputs.version }}"
mv release/*.zip "release/${{ steps.parse_version.outputs.version }}"
- name: Upload files to centcomm
uses: appleboy/scp-action@master
with:
host: centcomm.spacestation14.io
username: robust-build-push
key: ${{ secrets.CENTCOMM_ROBUST_BUILDS_PUSH_KEY }}
source: "release/${{ steps.parse_version.outputs.version }}"
target: "/var/lib/robust-builds/builds/"
strip_components: 1
- name: Update manifest JSON
uses: appleboy/ssh-action@master
with:
host: centcomm.spacestation14.io
username: robust-build-push
key: ${{ secrets.CENTCOMM_ROBUST_BUILDS_PUSH_KEY }}
script: /home/robust-build-push/push.ps1 ${{ steps.parse_version.outputs.version }}

41
.github/workflows/test-content.yml vendored Normal file
View File

@@ -0,0 +1,41 @@
name: Test content master against engine
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Check out content
uses: actions/checkout@v2
with:
repository: space-wizards/space-station-14
submodules: recursive
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 6.0.100
- name: Disable submodule autoupdate
run: touch BuildChecker/DISABLE_SUBMODULE_AUTOUPDATE
- name: Check out engine version
run: |
cd RobustToolbox
git fetch origin ${{ github.sha }}
git checkout FETCH_HEAD
git submodule update --init --recursive
- name: Install dependencies
run: dotnet restore
- name: Build
run: dotnet build --configuration Release --no-restore
- name: Content.Tests
run: dotnet test --no-build Content.Tests/Content.Tests.csproj -v n
- name: Content.IntegrationTests
run: COMPlus_gcServer=1 dotnet test --no-build Content.IntegrationTests/Content.IntegrationTests.csproj -v n

26
.gitignore vendored
View File

@@ -41,18 +41,6 @@ _ReSharper*/
# Resources
*.resources
/Resources/textures/Animations/*.*
/Resources/ResourcePack.zip
/Resources/textures/*_Animations.png
/Resources/textures/*_Decals.png
/Resources/textures/*_Effects.png
/Resources/textures/*_Items.png
/Resources/textures/*_Objects.png
/Resources/textures/*_Tiles.png
/Resources/textures/*_UserInterface.png
/Resources/textures/*.TAI
/Resources/SpriteRenderer/Ogre.log
/Resources/Spriterenderer/output
/Media
/setenv.bat
@@ -71,8 +59,20 @@ project.lock.json
# MacOS finder makes these.
.DS_Store
# KDE Dolphin makes these, maybe it's even XDG standard, kinda hard to Google.
# I do know it doesn't make them by merely opening the directory like some other file manager *cough* *cough*
.directory
# Created by NUnit.
TestResult.xml
NetSerializerDebug.dll
# Python stuff
__pycache__
.mypy_cache
MSBuild/Robust.Custom.targets
.idea/
release/

18
.gitmodules vendored Normal file
View File

@@ -0,0 +1,18 @@
[submodule "NetSerializer"]
path = NetSerializer
url = https://github.com/space-wizards/netserializer
[submodule "Lidgren.Network"]
path = Lidgren.Network/Lidgren.Network
url = https://github.com/space-wizards/lidgren-network-gen3.git
[submodule "XamlX"]
path = XamlX
url = https://github.com/space-wizards/XamlX
[submodule "Robust.LoaderApi"]
path = Robust.LoaderApi
url = https://github.com/space-wizards/Robust.LoaderApi.git
[submodule "ManagedHttpListener"]
path = ManagedHttpListener
url = https://github.com/space-wizards/ManagedHttpListener.git
[submodule "cefglue"]
path = cefglue
url = https://github.com/space-wizards/cefglue.git

View File

@@ -1,21 +0,0 @@
language: csharp
dist: trusty
sudo: false
os:
- linux
- osx
before_install:
- if [ $TRAVIS_OS_NAME = osx ]; then brew update && brew install python3; fi
before_script:
- "python3 ./Resources/buildResourcePack.py --resources-dir ./Resources --out ./Resources/ResourcePack.zip --no-atlas --no-animations --to-stderr"
- "nuget restore SpaceStation14.sln"
script:
- "msbuild /p:Configuration=Release /p:HEADLESS=1 SpaceStation14.sln"
- "cd packages/NUnit.ConsoleRunner.3.6.1/tools"
- "mono --debug nunit3-console.exe ../../../SS14.UnitTesting/bin/Release/SS14.UnitTesting.dll"

View File

@@ -0,0 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
</Project>

2
Avalonia.Base/README.md Normal file
View File

@@ -0,0 +1,2 @@
See `Robust.Client/UserInterface/XAML/RiderNotes.md` for why this project exists.
We are not actually using Avalonia (yet).

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleName</key>
<string>SS14</string>
<key>CFBundleDisplayName</key>
<string>Space Station 14</string>
<key>CFBundleExecutable</key>
<string>SS14</string>
<!--
Just a note about this icon.
MacOS seems REALLY iffy about this and even when the file is correct,
it can take forever before it decides to actually update it and display it.
TL;DR Apple is stupid.
-->
<key>CFBundleIconFile</key>
<string>ss14</string>
</dict>
</plist>

View File

@@ -0,0 +1,8 @@
#!/bin/sh
# cd to file containing script or something?
BASEDIR=$(dirname "$0")
echo "$BASEDIR"
cd "$BASEDIR"
exec ../Resources/Robust.Client "$@"

View File

@@ -1,4 +0,0 @@
call "c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
@echo on
call prebuild-2010.cmd
call msbuild SpaceStation14.sln /t:Build /p:Configuration=Release;Platform=x86

View File

@@ -1,10 +0,0 @@
#!/bin/bash
prebuild-nant.sh
nant
#nunit-console Bin/SS14.Test.dll -nodots -xml=NUnit.Results.xml
echo NUnit disabled.
#7za a SS14.7z Bin/*
echo Packaging disabled.

View File

@@ -1,2 +0,0 @@
cd bin\client
start SpaceStation14.exe

View File

@@ -1,2 +0,0 @@
cd bin\server
start SpaceStation14_Server.exe

19
LICENSE-MIT.TXT Normal file
View File

@@ -0,0 +1,19 @@
Copyright (c) 2019 Space Station 14 Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1,4 +0,0 @@
root = false
[*.cs]
indent_style = tab

View File

@@ -1,10 +0,0 @@
* The NetBuffer object is gone; instead there are NetOutgoingMessage and NetIncomingMessage objects
* No need to allocate a read buffer before calling ReadMessage

View File

@@ -1,113 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<style type="text/css">
body
{
font-family: Verdana, Geneva, Arial, sans-serif;
font-size: small;
margin-left: 20px;
background-color: #dddddd;
}
td
{
font-family: Verdana, Geneva, Arial, sans-serif;
font-size: small;
}
.page
{
width: 700px;
}
.cf
{
font-family: Courier New;
font-size: 10pt;
color: black;
background: white;
padding: 16px;
border: 1px solid black;
}
.cl
{
margin: 0px;
}
.cb1
{
color: green;
}
.cb2
{
color: #2b91af;
}
.cb3
{
color: blue;
}
.cb4
{
color: #a31515;
}
</style>
<title>Peer/server discovery</title>
</head>
<body>
<table>
<tr>
<td class="page">
<h1>Peer/server discovery</h1>
<p>
Peer discovery is the process of clients detecting what servers are available. Discovery requests can be made in two ways;
locally as a broadcast, which will send a signal to all peers on your subnet. Secondly you can contact an ip address directly
and query it if a server is running.
</p>
<p>Responding to discovery requests are done in the same way regardless of how the request is made.</p>
<p>Here's how to do on the client side; ie. the side which makes a request:</p>
<div class="cf">
<pre class="cl"><span class="cb1">// Enable DiscoveryResponse messages</span></pre>
<pre class="cl">config.EnableMessageType(<span class="cb2">NetIncomingMessageType</span>.DiscoveryResponse);</pre>
<pre class="cl">&nbsp;</pre>
<pre class="cl"><span class="cb1">// Emit a discovery signal</span></pre>
<pre class="cl">Client.DiscoverLocalPeers(14242);</pre>
</div>
<p>This will send a discovery signal to your subnet; Here's how to receive the signal on the server side, and send a response back to the client:</p>
<div class="cf">
<pre class="cl"><span class="cb1">// Enable DiscoveryRequest messages</span></pre>
<pre class="cl">config.EnableMessageType(<span class="cb2">NetIncomingMessageType</span>.DiscoveryRequest);</pre>
<pre class="cl">&nbsp;</pre>
<pre class="cl"><span class="cb1">// Standard message reading loop</span></pre>
<pre class="cl"><span class="cb3">while</span> ((inc = Server.ReadMessage()) != <span class="cb1">null</span>)</pre>
<pre class="cl">{</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; <span class="cb3">switch</span> (inc.MessageType)</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; {</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb3">case</span> <span class="cb2">NetIncomingMessageType</span>.DiscoveryRequest:</pre>
<pre class="cl">&nbsp;</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb1">// Create a response and write some example data to it</span></pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb2">NetOutgoingMessage</span> response = Server.CreateMessage();</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; response.Write(<span class="cb4">&quot;My server name&quot;</span>);</pre>
<pre class="cl">&nbsp;</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb1">// Send the response to the sender of the request</span></pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Server.SendDiscoveryResponse(response, inc.SenderEndpoint);</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb3">break</span>;</pre>
</div>
<p>When the response then reaches the client, you can read the data you wrote on the server:</p>
<div class="cf">
<pre class="cl"><span class="cb1">// Standard message reading loop</span></pre>
<pre class="cl"><span class="cb3">while</span> ((inc = Client.ReadMessage()) != <span class="cb1">null</span>)</pre>
<pre class="cl">{</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; <span class="cb3">switch</span> (inc.MessageType)</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; {</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb3">case</span> <span class="cb2">NetIncomingMessageType</span>.DiscoveryResponse:</pre>
<pre class="cl">&nbsp;</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb2">Console</span>.WriteLine(<span class="cb4">&quot;Found server at &quot;</span> + inc.SenderEndpoint + <span class="cb4">&quot; name: &quot;</span> + inc.ReadString());</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb3">break</span>;</pre>
</div>
</td>
</tr>
</table>
</body>
</html>

View File

@@ -1,22 +0,0 @@
Improvements over last version of library:
* New delivery type: Reliable sequenced (Lost packets are resent but late arrivals are dropped)
* Disconnects and shutdown requests are now queued properly, so calling shutdown will still send any queued messages before shutting down
* All messages are pooled/recycled for zero garbage
* Reduced CPU usage and lower latencies (in the <1 ms range, but still) due to better socket polling
* All public members of NetPeer/NetConnection are completely thread safe
* Larger number of delivery channels
* More exact roundtrip measurement
* Method serialize entire objects via reflection
* Unique identifier now exists for all peers/connections
* More flexible peer discovery; filters possible and arbitrary data can be sent with response
* Much better protection against malformed messages crashing the app
API enhancements:
* NetPeerConfiguration immutable properties now locked once NetPeer is initialized
* Messages cannot be send twice by accident
* Impossible to confuse sending and receiving buffers since they're different classes
* No more confusion if user should create a buffer or preallocate and reuse

View File

@@ -1,17 +0,0 @@
PER MESSAGE:
7 bits - NetMessageType
1 bit - Is a message fragment?
[8 bits NetMessageLibraryType, if NetMessageType == Library]
[16 bits sequence number, if NetMessageType >= UserSequenced]
8/16 bits - Payload length in bits (variable size ushort)
[16 bits fragments group id, if fragmented]
[16 bits fragments total count, if fragmented]
[16 bits fragment number, if fragmented]
[x - Payload] if length > 0

View File

@@ -1,115 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<style type="text/css">
body
{
font-family: Verdana, Geneva, Arial, sans-serif;
font-size: small;
margin-left: 20px;
background-color: #dddddd;
}
td
{
font-family: Verdana, Geneva, Arial, sans-serif;
font-size: small;
}
.cf
{
font-family: Courier New;
font-size: 10pt;
color: black;
background: white;
padding: 16px;
border: 1px solid black;
}
.cl
{
margin: 0px;
}
.cb1
{
color: green;
}
.cb2
{
color: #2b91af;
}
.cb3
{
color: blue;
}
.cb4
{
color: #a31515;
}
</style>
<title>Lidgren tutorial</title>
</head>
<body>
<table>
<tr>
<td width="700">
<h1>Simulating bad network conditions</h1>
<p>
On the internet, your packets are likely to run in to all kinds of trouble. They will be delayed and lost and they might even arrive multiple times at the destination. Lidgren has a few option to simulate how your application or game will react when this happens.<br />
They are all configured using the NetPeerConfiguration class - these properties exists:</p>
<p>
<div class="cf">
<table>
<tr>
<td valign="top">
<b>SimulatedLoss</b>
</td>
<td>
&nbsp;
</td>
<td valign="top">
This is a float which simulates lost packets. A value of 0 will disable this feature, a value of 0.5f will make half of your sent packets disappear, chosen randomly. Note that packets may contain several messages - this is the amount of packets lost.
</td>
</tr>
<tr>
<td colspan="3">
&nbsp;
</td>
</tr>
<tr>
<td valign="top">
<b>SimulatedDuplicatesChance</b>
</td>
<td>
&nbsp;
</td>
<td valign="top">
This is a float which determines the chance that a packet will be duplicated at the destination. 0 means no packets will be duplicated, 0.5f means that on average, every other packet will be duplicated.
</td>
</tr>
<tr>
<td colspan="3">
&nbsp;
</td>
</tr>
<tr>
<td valign="top">
<b>SimulatedMinimumLatency</b><br />
<b>SimulatedRandomLatency</b>
</td>
<td>
&nbsp;
</td>
<td valign="top">
These two properties control simulating delay of packets in seconds (not milliseconds, use 0.05 for 50 ms of lag). They work on top of the actual network delay and the total delay will be:<br />
Actual one way latency + SimulatedMinimumLatency + [Randomly per packet 0 to SimulatedRandomLatency seconds]
</td>
</tr>
</table>
</div>
<p>It's recommended to assume symmetric condtions and configure server and client with the same simulation settings.</p>
<p>Simulating bad network conditions only works in DEBUG builds.</p>
</td>
</tr>
</table>
</body>
</html>

View File

@@ -1,17 +0,0 @@
Completed features:
* Message coalescing
* Peer, connection statistics
* Lag, loss and duplication simulation for testing
* Connection approval
* Throttling
* Clock synchronization to detect jitter per packet (NetTime.RemoteNow)
* Peer discovery
* Message fragmentation
Missing features:
* Receipts 25% done, need design
* More realistic lag/loss (lumpy)
* Detect estimated packet loss
* More advanced ack packet

View File

@@ -1,206 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<style type="text/css">
body
{
font-family: Verdana, Geneva, Arial, sans-serif;
font-size: small;
margin-left: 20px;
background-color: #dddddd;
}
td
{
font-family: Verdana, Geneva, Arial, sans-serif;
font-size: small;
}
.cf
{
font-family: Courier New;
font-size: 10pt;
color: black;
background: white;
padding: 16px;
border: 1px solid black;
}
.cl
{
margin: 0px;
}
.cb1
{
color: green;
}
.cb2
{
color: #2b91af;
}
.cb3
{
color: blue;
}
.cb4
{
color: #a31515;
}
</style>
<title>Lidgren basics tutorial</title>
</head>
<body>
<table>
<tr>
<td width="700">
<h1>
Lidgren basics</h1>
<p>
Lidgren network library is all about messages. There are two types of messages:</p>
<li>Library messages telling you things like a peer has connected or diagnostics messages (warnings, errors) when unexpected things happen.</li>
<li>Data messages which is data sent from a remote (connected or unconnected) peer.</li>
<p>
The base class for establishing connections, receiving and sending message are the NetPeer class. Using it you can make a peer-to-peer network, but if you are creating a server/client topology there are special classes called NetServer and NetClient. They inherit NetPeer but sets some defaults and includes some helper methods/properties.</p>
<p>
Here's how to set up a NetServer:</p>
<div class="cf">
<pre class="cl"><span class="cb2">NetPeerConfiguration</span> config = <span class="cb3">new</span> <span class="cb2">NetPeerConfiguration</span>(<span class="cb4">&quot;MyExampleName&quot;</span>);</pre>
<pre class="cl">config.Port = 14242;</pre>
<pre class="cl">&nbsp;</pre>
<pre class="cl"><span class="cb2">NetServer</span> server = <span class="cb3">new</span> <span class="cb2">NetServer</span>(config);</pre>
<pre class="cl">server.Start();</pre>
</div>
<p>
The code above first creates a configuration. It has lots of properties you can change, but the default values should be pretty good for most applications. The string you provide in the constructor (MyExampleName) is an identifier to distinquish it from other applications using the lidgren library. Just make sure you use the same string in both server and client - or you will be unable to communicate between them.</p>
<p>
Secondly we've set the local port the server should listen to. This is the port number we tell the client(s) what port number to connect to. The local port can be set for a client too, but it's not needed and not recommended.</p>
<p>
Thirdly we create our server object and fourth we Start() it. Starting the server will create a new network thread and bind to a socket and start listening for connections.</p>
<p>
Early on we spoke about messages; now is the time to start receiving and sending some. Here's a code snippet for receiving messages:</p>
<div class="cf">
<pre class="cl"><span class="cb2">NetIncomingMessage</span> msg;</pre>
<pre class="cl"><span class="cb3">while</span> ((msg = server.ReadMessage()) != <span class="cb3">null</span>)</pre>
<pre class="cl">{</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; <span class="cb3">switch</span> (msg.MessageType)</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; {</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb3">case</span> <span class="cb2">NetIncomingMessageType</span>.VerboseDebugMessage:</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb3">case</span> <span class="cb2">NetIncomingMessageType</span>.DebugMessage:</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb3">case</span> <span class="cb2">NetIncomingMessageType</span>.WarningMessage:</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb3">case</span> <span class="cb2">NetIncomingMessageType</span>.ErrorMessage:</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb2">Console</span>.WriteLine(msg.ReadString());</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb3">break</span>;</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb3">default</span>:</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb2">Console</span>.WriteLine(<span class="cb4">&quot;Unhandled type: &quot;</span> + msg.MessageType);</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb3">break</span>;</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; }</pre>
<pre class="cl">&nbsp;&nbsp;&nbsp; server.Recycle(msg);</pre>
<pre class="cl">}</pre>
</div>
<p>
So, lets dissect the above code. First we declare a NetIncomingMessage, which is the type of incoming messages. Then we read a message and handles it, looping back as long as there are messages to fetch. For each message we find, we switch on sometime called MessageType - it's a description what the message contains. In this code example we only catch messages of type VerboseDebugMessage, DebugMessage, WarningMessage and ErrorMessage. All those four types are emitted by the library to inform about various events. They all contains a single string, so we use the method ReadString() to extract a copy of that string and print it in the console.</p>
<p>
Reading data will increment the internal message pointer so you can read subsequent data using the Read*() methods.</p>
<p>
For all other message type we just print that it's currently unhandled.</p>
<p>
Finally, we recycle the message after we're done with it - this will enable the library to reuse the object and create less garbage.</p>
<p>
Sending messages are even easier:</p>
<div class="cf">
<pre class="cl"><span class="cb2">NetOutgoingMessage</span> sendMsg = server.CreateMessage();</pre>
<pre class="cl">sendMsg.Write(<span class="cb4">&quot;Hello&quot;</span>);</pre>
<pre class="cl">sendMsg.Write(42);</pre>
<pre class="cl">&nbsp;</pre>
<pre class="cl">server.SendMessage(sendMsg, recipient, <span class="cb2">NetDeliveryMethod</span>.ReliableOrdered);</pre>
</div>
<p>
The above code first creates a new message, or uses a recycled message, which is why it's not possible to just create a message using new(). It then writes a string ("Hello") and an integer (System.Int32, 4 bytes in size) to the message.</p>
<p>
Then the message is sent using the SendMessage() method. The first argument is the message to send, the second argument is the recipient connection - which we'll not go into detail about just yet - and the third argument are HOW to deliver the message, or rather how to behave if network conditions are bad and a packet gets lost, duplicated or reordered.</p>
<p>
There are five delivery methods available:</p>
<div class="cf">
<table>
<tr>
<td valign="top">
<b>Unreliable</b>
</td>
<td>
&nbsp;
</td>
<td valign="top">
This is just UDP. Messages can be lost, received more than once and messages sent after other messages may be received before them.
</td>
</tr>
<tr>
<td colspan="3">
&nbsp;
</td>
</tr>
<tr>
<td valign="top">
<b>UnreliableSequenced</b>
</td>
<td>
&nbsp;
</td>
<td valign="top">
Using this delivery method messages can still be lost; but you're protected against duplicated messages and if a message arrives late; that is, if a message sent after this one has already been received - it will be dropped. This means you will never receive "older" data than what you already have received.
</td>
</tr>
<tr>
<td colspan="3">
&nbsp;
</td>
</tr>
<tr>
<td valign="top">
<b>ReliableUnordered</b>
</td>
<td>
&nbsp;
</td>
<td valign="top">
This delivery method ensures that every message sent will be received eventually. It does not however guarantee what order they will be received; late messages may be delivered before older ones.
</td>
</tr>
<tr>
<td colspan="3">
&nbsp;
</td>
</tr>
<tr>
<td valign="top">
<b>ReliableSequenced</b>
</td>
<td>
&nbsp;
</td>
<td valign="top">
This delivery method is similar to UnreliableSequenced; except that is guarantees that SOME messages will be received - if you only send one message - it will be received. If you sent two messages quickly, and they get reordered in transit, only the newest message will be received - but at least ONE of them will be received guaranteed.
</td>
</tr>
<tr>
<td colspan="3">
&nbsp;
</td>
</tr>
<tr>
<td valign="top"><b>ReliableOrdered</b></td>
<td>&nbsp;</td>
<td valign="top">
This delivery method guarantees that messages will always be received in the exact order they were sent.
</td>
</tr>
</table>
</div>
<p>
Here's how to read and decode the message above:</p>
<div class="cf">
<pre class="cl"><span class="cb2">NetIncomingMessage</span> incMsg = server.ReadMessage();</pre>
<pre class="cl"><span class="cb3">string</span> str = incMsg.ReadString();</pre>
<pre class="cl"><span class="cb3">int</span> a = incMsg.ReadInt32();</pre>
</div>
</td>
</tr>
</table>
</body>
</html>

View File

@@ -1,21 +0,0 @@
using System;
using System.Collections.Generic;
namespace Lidgren.Network
{
/// <summary>
/// Interface for an encryption algorithm
/// </summary>
public interface INetEncryption
{
/// <summary>
/// Encrypt an outgoing message in place
/// </summary>
bool Encrypt(NetOutgoingMessage msg);
/// <summary>
/// Decrypt an incoming message in place
/// </summary>
bool Decrypt(NetIncomingMessage msg);
}
}

View File

@@ -1,163 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace Lidgren.Network
{
/// <summary>
/// AES encryption
/// </summary>
public class NetAESEncryption : INetEncryption
{
private readonly byte[] m_key;
private readonly byte[] m_iv;
private readonly int m_bitSize;
private static readonly List<int> m_keysizes;
private static readonly List<int> m_blocksizes;
static NetAESEncryption()
{
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
List<int> temp = new List<int>();
foreach (KeySizes keysize in aes.LegalKeySizes)
{
for (int i = keysize.MinSize; i <= keysize.MaxSize; i += keysize.SkipSize)
{
if (!temp.Contains(i))
temp.Add(i);
if (i == keysize.MaxSize)
break;
}
}
m_keysizes = temp;
temp = new List<int>();
foreach (KeySizes keysize in aes.LegalBlockSizes)
{
for (int i = keysize.MinSize; i <= keysize.MaxSize; i += keysize.SkipSize)
{
if (!temp.Contains(i))
temp.Add(i);
if (i == keysize.MaxSize)
break;
}
}
m_blocksizes = temp;
}
/// <summary>
/// NetAESEncryption constructor
/// </summary>
public NetAESEncryption(byte[] key, byte[] iv)
{
if (!m_keysizes.Contains(key.Length * 8))
throw new NetException(string.Format("Not a valid key size. (Valid values are: {0})", NetUtility.MakeCommaDelimitedList(m_keysizes)));
if (!m_blocksizes.Contains(iv.Length * 8))
throw new NetException(string.Format("Not a valid iv size. (Valid values are: {0})", NetUtility.MakeCommaDelimitedList(m_blocksizes)));
m_key = key;
m_iv = iv;
m_bitSize = m_key.Length * 8;
}
/// <summary>
/// NetAESEncryption constructor
/// </summary>
public NetAESEncryption(string key, int bitsize)
{
if (!m_keysizes.Contains(bitsize))
throw new NetException(string.Format("Not a valid key size. (Valid values are: {0})", NetUtility.MakeCommaDelimitedList(m_keysizes)));
byte[] entropy = Encoding.UTF32.GetBytes(key);
// I know hardcoding salts is bad, but in this case I think it is acceptable.
HMACSHA512 hmacsha512 = new HMACSHA512(Convert.FromBase64String("i88NEiez3c50bHqr3YGasDc4p8jRrxJAaiRiqixpvp4XNAStP5YNoC2fXnWkURtkha6M8yY901Gj07IRVIRyGL=="));
hmacsha512.Initialize();
for (int i = 0; i < 1000; i++)
{
entropy = hmacsha512.ComputeHash(entropy);
}
int keylen = bitsize / 8;
m_key = new byte[keylen];
Buffer.BlockCopy(entropy, 0, m_key, 0, keylen);
m_iv = new byte[m_blocksizes[0] / 8];
Buffer.BlockCopy(entropy, entropy.Length - m_iv.Length - 1, m_iv, 0, m_iv.Length);
m_bitSize = bitsize;
}
/// <summary>
/// NetAESEncryption constructor
/// </summary>
public NetAESEncryption(string key)
: this(key, m_keysizes[0])
{
}
/// <summary>
/// Encrypt outgoing message
/// </summary>
public bool Encrypt(NetOutgoingMessage msg)
{
try
{
// nested usings are fun!
using (AesCryptoServiceProvider aesCryptoServiceProvider = new AesCryptoServiceProvider { KeySize = m_bitSize, Mode = CipherMode.CBC })
{
using (ICryptoTransform cryptoTransform = aesCryptoServiceProvider.CreateEncryptor(m_key, m_iv))
{
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform,
CryptoStreamMode.Write))
{
cryptoStream.Write(msg.m_data, 0, msg.m_data.Length);
}
msg.m_data = memoryStream.ToArray();
}
}
}
}
catch
{
return false;
}
return true;
}
/// <summary>
/// Decrypt incoming message
/// </summary>
public bool Decrypt(NetIncomingMessage msg)
{
try
{
// nested usings are fun!
using (AesCryptoServiceProvider aesCryptoServiceProvider = new AesCryptoServiceProvider { KeySize = m_bitSize, Mode = CipherMode.CBC })
{
using (ICryptoTransform cryptoTransform = aesCryptoServiceProvider.CreateDecryptor(m_key, m_iv))
{
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform,
CryptoStreamMode.Write))
{
cryptoStream.Write(msg.m_data, 0, msg.m_data.Length);
}
msg.m_data = memoryStream.ToArray();
}
}
}
}
catch
{
return false;
}
return true;
}
}
}

View File

@@ -1,88 +0,0 @@
using System;
using System.Collections.Generic;
namespace Lidgren.Network
{
/// <summary>
/// Base for a non-threadsafe encryption class
/// </summary>
public abstract class NetBlockEncryptionBase : INetEncryption
{
// temporary space for one block to avoid reallocating every time
private byte[] m_tmp;
/// <summary>
/// Block size in bytes for this cipher
/// </summary>
public abstract int BlockSize { get; }
/// <summary>
/// NetBlockEncryptionBase constructor
/// </summary>
public NetBlockEncryptionBase()
{
m_tmp = new byte[BlockSize];
}
/// <summary>
/// Encrypt am outgoing message with this algorithm; no writing can be done to the message after encryption, or message will be corrupted
/// </summary>
public bool Encrypt(NetOutgoingMessage msg)
{
int payloadBitLength = msg.LengthBits;
int numBytes = msg.LengthBytes;
int blockSize = BlockSize;
int numBlocks = (int)Math.Ceiling((double)numBytes / (double)blockSize);
int dstSize = numBlocks * blockSize;
msg.EnsureBufferSize(dstSize * 8 + (4 * 8)); // add 4 bytes for payload length at end
msg.LengthBits = dstSize * 8; // length will automatically adjust +4 bytes when payload length is written
for(int i=0;i<numBlocks;i++)
{
EncryptBlock(msg.m_data, (i * blockSize), m_tmp);
Buffer.BlockCopy(m_tmp, 0, msg.m_data, (i * blockSize), m_tmp.Length);
}
// add true payload length last
msg.Write((UInt32)payloadBitLength);
return true;
}
/// <summary>
/// Decrypt an incoming message encrypted with corresponding Encrypt
/// </summary>
/// <param name="msg">message to decrypt</param>
/// <returns>true if successful; false if failed</returns>
public bool Decrypt(NetIncomingMessage msg)
{
int numEncryptedBytes = msg.LengthBytes - 4; // last 4 bytes is true bit length
int blockSize = BlockSize;
int numBlocks = numEncryptedBytes / blockSize;
if (numBlocks * blockSize != numEncryptedBytes)
return false;
for (int i = 0; i < numBlocks; i++)
{
DecryptBlock(msg.m_data, (i * blockSize), m_tmp);
Buffer.BlockCopy(m_tmp, 0, msg.m_data, (i * blockSize), m_tmp.Length);
}
// read 32 bits of true payload length
uint realSize = NetBitWriter.ReadUInt32(msg.m_data, 32, (numEncryptedBytes * 8));
msg.m_bitLength = (int)realSize;
return true;
}
/// <summary>
/// Encrypt a block of bytes
/// </summary>
protected abstract void EncryptBlock(byte[] source, int sourceOffset, byte[] destination);
/// <summary>
/// Decrypt a block of bytes
/// </summary>
protected abstract void DecryptBlock(byte[] source, int sourceOffset, byte[] destination);
}
}

View File

@@ -1,77 +0,0 @@
using System;
using System.IO;
using System.Security.Cryptography;
namespace Lidgren.Network
{
public abstract class NetCryptoProviderBase : NetEncryption
{
protected SymmetricAlgorithm m_algorithm;
public NetCryptoProviderBase(NetPeer peer, SymmetricAlgorithm algo)
: base(peer)
{
m_algorithm = algo;
m_algorithm.GenerateKey();
m_algorithm.GenerateIV();
}
public override void SetKey(byte[] data, int offset, int count)
{
int len = m_algorithm.Key.Length;
var key = new byte[len];
for (int i = 0; i < len; i++)
key[i] = data[offset + (i % count)];
m_algorithm.Key = key;
len = m_algorithm.IV.Length;
key = new byte[len];
for (int i = 0; i < len; i++)
key[len - 1 - i] = data[offset + (i % count)];
m_algorithm.IV = key;
}
public override bool Encrypt(NetOutgoingMessage msg)
{
int unEncLenBits = msg.LengthBits;
var ms = new MemoryStream();
var cs = new CryptoStream(ms, m_algorithm.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(msg.m_data, 0, msg.LengthBytes);
cs.Close();
// get results
var arr = ms.ToArray();
ms.Close();
msg.EnsureBufferSize((arr.Length + 4) * 8);
msg.LengthBits = 0; // reset write pointer
msg.Write((uint)unEncLenBits);
msg.Write(arr);
msg.LengthBits = (arr.Length + 4) * 8;
return true;
}
public override bool Decrypt(NetIncomingMessage msg)
{
int unEncLenBits = (int)msg.ReadUInt32();
var ms = new MemoryStream(msg.m_data, 4, msg.LengthBytes - 4);
var cs = new CryptoStream(ms, m_algorithm.CreateDecryptor(), CryptoStreamMode.Read);
var byteLen = NetUtility.BytesToHoldBits(unEncLenBits);
var result = m_peer.GetStorage(byteLen);
cs.Read(result, 0, byteLen);
cs.Close();
// TODO: recycle existing msg
msg.m_data = result;
msg.m_bitLength = unEncLenBits;
msg.m_readPosition = 0;
return true;
}
}
}

View File

@@ -1,59 +0,0 @@
using System;
using System.IO;
using System.Security.Cryptography;
namespace Lidgren.Network
{
public abstract class NetCryptoProviderEncryption : NetEncryption
{
public NetCryptoProviderEncryption(NetPeer peer)
: base(peer)
{
}
protected abstract CryptoStream GetEncryptStream(MemoryStream ms);
protected abstract CryptoStream GetDecryptStream(MemoryStream ms);
public override bool Encrypt(NetOutgoingMessage msg)
{
int unEncLenBits = msg.LengthBits;
var ms = new MemoryStream();
var cs = GetEncryptStream(ms);
cs.Write(msg.m_data, 0, msg.LengthBytes);
cs.Close();
// get results
var arr = ms.ToArray();
ms.Close();
msg.EnsureBufferSize((arr.Length + 4) * 8);
msg.LengthBits = 0; // reset write pointer
msg.Write((uint)unEncLenBits);
msg.Write(arr);
msg.LengthBits = (arr.Length + 4) * 8;
return true;
}
public override bool Decrypt(NetIncomingMessage msg)
{
int unEncLenBits = (int)msg.ReadUInt32();
var ms = new MemoryStream(msg.m_data, 4, msg.LengthBytes - 4);
var cs = GetDecryptStream(ms);
var result = m_peer.GetStorage(unEncLenBits);
cs.Read(result, 0, NetUtility.BytesToHoldBits(unEncLenBits));
cs.Close();
// TODO: recycle existing msg
msg.m_data = result;
msg.m_bitLength = unEncLenBits;
return true;
}
}
}

View File

@@ -1,45 +0,0 @@
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
namespace Lidgren.Network
{
/// <summary>
/// Interface for an encryption algorithm
/// </summary>
public abstract class NetEncryption
{
/// <summary>
/// NetPeer
/// </summary>
protected NetPeer m_peer;
/// <summary>
/// Constructor
/// </summary>
public NetEncryption(NetPeer peer)
{
if (peer == null)
throw new NetException("Peer must not be null");
m_peer = peer;
}
public void SetKey(string str)
{
var bytes = System.Text.Encoding.ASCII.GetBytes(str);
SetKey(bytes, 0, bytes.Length);
}
public abstract void SetKey(byte[] data, int offset, int count);
/// <summary>
/// Encrypt an outgoing message in place
/// </summary>
public abstract bool Encrypt(NetOutgoingMessage msg);
/// <summary>
/// Decrypt an incoming message in place
/// </summary>
public abstract bool Decrypt(NetIncomingMessage msg);
}
}

View File

@@ -1,146 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Security.Cryptography;
using System.Text;
using System.Security;
namespace Lidgren.Network
{
/// <summary>
/// Methods to encrypt and decrypt data using the XTEA algorithm
/// </summary>
public sealed class NetXtea : NetBlockEncryptionBase
{
private const int c_blockSize = 8;
private const int c_keySize = 16;
private const int c_delta = unchecked((int)0x9E3779B9);
private readonly int m_numRounds;
private readonly uint[] m_sum0;
private readonly uint[] m_sum1;
/// <summary>
/// Gets the block size for this cipher
/// </summary>
public override int BlockSize { get { return c_blockSize; } }
/// <summary>
/// 16 byte key
/// </summary>
public NetXtea(byte[] key, int rounds)
{
if (key.Length < c_keySize)
throw new NetException("Key too short!");
m_numRounds = rounds;
m_sum0 = new uint[m_numRounds];
m_sum1 = new uint[m_numRounds];
uint[] tmp = new uint[8];
int num2;
int index = num2 = 0;
while (index < 4)
{
tmp[index] = BitConverter.ToUInt32(key, num2);
index++;
num2 += 4;
}
for (index = num2 = 0; index < 32; index++)
{
m_sum0[index] = ((uint)num2) + tmp[num2 & 3];
num2 += -1640531527;
m_sum1[index] = ((uint)num2) + tmp[(num2 >> 11) & 3];
}
}
/// <summary>
/// 16 byte key
/// </summary>
public NetXtea(byte[] key)
: this(key, 32)
{
}
/// <summary>
/// String to hash for key
/// </summary>
public NetXtea(string key)
: this(SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(key)), 32)
{
}
/// <summary>
/// Encrypts a block of bytes
/// </summary>
protected override void EncryptBlock(byte[] source, int sourceOffset, byte[] destination)
{
uint v0 = BytesToUInt(source, sourceOffset);
uint v1 = BytesToUInt(source, sourceOffset + 4);
for (int i = 0; i != m_numRounds; i++)
{
v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ m_sum0[i];
v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ m_sum1[i];
}
UIntToBytes(v0, destination, 0);
UIntToBytes(v1, destination, 0 + 4);
return;
}
/// <summary>
/// Decrypts a block of bytes
/// </summary>
protected override void DecryptBlock(byte[] source, int sourceOffset, byte[] destination)
{
// Pack bytes into integers
uint v0 = BytesToUInt(source, sourceOffset);
uint v1 = BytesToUInt(source, sourceOffset + 4);
for (int i = m_numRounds - 1; i >= 0; i--)
{
v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ m_sum1[i];
v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ m_sum0[i];
}
UIntToBytes(v0, destination, 0);
UIntToBytes(v1, destination, 0 + 4);
return;
}
private static uint BytesToUInt(byte[] bytes, int offset)
{
uint retval = (uint)(bytes[offset] << 24);
retval |= (uint)(bytes[++offset] << 16);
retval |= (uint)(bytes[++offset] << 8);
return (retval | bytes[++offset]);
}
private static void UIntToBytes(uint value, byte[] destination, int destinationOffset)
{
destination[destinationOffset++] = (byte)(value >> 24);
destination[destinationOffset++] = (byte)(value >> 16);
destination[destinationOffset++] = (byte)(value >> 8);
destination[destinationOffset++] = (byte)value;
}
}
}

View File

@@ -1,295 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ProjectType>Local</ProjectType>
<ProductVersion>12.0.31101.0</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{59250BAF-0000-0000-0000-000000000000}</ProjectGuid>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<ApplicationIcon>
</ApplicationIcon>
<AssemblyKeyContainerName>
</AssemblyKeyContainerName>
<AssemblyName>Lidgren.Network</AssemblyName>
<DefaultClientScript>JScript</DefaultClientScript>
<DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
<DefaultTargetSchema>IE50</DefaultTargetSchema>
<TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>
<OutputType>Library</OutputType>
<AppDesignerFolder>
</AppDesignerFolder>
<RootNamespace>Lidgren.Network</RootNamespace>
<StartupObject>
</StartupObject>
<StartArguments>
</StartArguments>
<FileUpgradeFlags>
</FileUpgradeFlags>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<BaseAddress>285212672</BaseAddress>
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
<ConfigurationOverrideFile>
</ConfigurationOverrideFile>
<DefineConstants>TRACE;DEBUG</DefineConstants>
<DocumentationFile>
</DocumentationFile>
<DebugSymbols>True</DebugSymbols>
<FileAlignment>4096</FileAlignment>
<Optimize>False</Optimize>
<OutputPath>..\bin\</OutputPath>
<RegisterForComInterop>False</RegisterForComInterop>
<RemoveIntegerChecks>False</RemoveIntegerChecks>
<TreatWarningsAsErrors>False</TreatWarningsAsErrors>
<WarningLevel>4</WarningLevel>
<NoStdLib>False</NoStdLib>
<NoWarn>
</NoWarn>
<PlatformTarget>x86</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<BaseAddress>285212672</BaseAddress>
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
<ConfigurationOverrideFile>
</ConfigurationOverrideFile>
<DefineConstants>TRACE</DefineConstants>
<DocumentationFile>
</DocumentationFile>
<DebugSymbols>False</DebugSymbols>
<FileAlignment>4096</FileAlignment>
<Optimize>True</Optimize>
<OutputPath>..\bin\</OutputPath>
<RegisterForComInterop>False</RegisterForComInterop>
<RemoveIntegerChecks>False</RemoveIntegerChecks>
<TreatWarningsAsErrors>False</TreatWarningsAsErrors>
<WarningLevel>4</WarningLevel>
<NoStdLib>False</NoStdLib>
<NoWarn>
</NoWarn>
<PlatformTarget>x86</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>
<TargetFramework>netcoreapp3.1</TargetFramework>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
<DefaultItemExcludes>Lidgren.Network/**/*</DefaultItemExcludes>
<DefineConstants>$(DefineConstants);USE_RELEASE_STATISTICS</DefineConstants>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.CSharp">
<Name>Microsoft.CSharp</Name>
<Private>False</Private>
</Reference>
<Reference Include="System">
<Name>System</Name>
<Private>False</Private>
</Reference>
<Reference Include="System.Core">
<Name>System.Core</Name>
<Private>False</Private>
</Reference>
<Reference Include="System.Data">
<Name>System.Data</Name>
<Private>False</Private>
</Reference>
<Reference Include="System.Xml">
<Name>System.Xml</Name>
<Private>False</Private>
</Reference>
</ItemGroup>
<ItemGroup>
</ItemGroup>
<ItemGroup>
<Compile Include="Encryption\INetEncryption.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Encryption\NetAESEncryption.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Encryption\NetBlockEncryptionBase.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Encryption\NetXteaEncryption.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NamespaceDoc.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetBigInteger.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetBitVector.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetBitWriter.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetBuffer.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetBuffer.Peek.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetBuffer.Read.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetBuffer.Read.Reflection.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetBuffer.Write.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetBuffer.Write.Reflection.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetClient.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetConnection.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetConnection.Handshake.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetConnection.Latency.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetConnection.MTU.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetConnectionStatistics.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetConnectionStatus.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetConstants.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetDeliveryMethod.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetException.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetFragmentationHelper.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetIncomingMessage.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetIncomingMessageType.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetMessageType.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetNatIntroduction.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetOutgoingMessage.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetPeer.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetPeer.Discovery.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetPeer.Fragmentation.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetPeer.Internal.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetPeer.LatencySimulation.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetPeer.Logging.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetPeer.MessagePools.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetPeer.Send.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetPeerConfiguration.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetPeerStatistics.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetPeerStatus.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetQueue.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetRandom.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetReceiverChannelBase.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetReliableOrderedReceiver.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetReliableSenderChannel.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetReliableSequencedReceiver.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetReliableUnorderedReceiver.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetSenderChannelBase.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetSendResult.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetServer.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetSRP.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetStoredReliableMessage.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetTime.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetTuple.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetUnreliableSenderChannel.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetUnreliableSequencedReceiver.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetUnreliableUnorderedReceiver.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetUPnP.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NetUtility.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="SenderChannelBase.cs">
<SubType>Code</SubType>
<Compile Include="Lidgren.Network\Lidgren.Network\**\*.cs">
<Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
</Compile>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PreBuildEvent>
</PreBuildEvent>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
</Project>

View File

@@ -1,14 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Lidgren.Network
{
/// <summary>
/// Lidgren Network Library
/// </summary>
internal class NamespaceDoc
{
// <include file='_Namespace.xml' path='Documentation/*' />
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,172 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Text;
namespace Lidgren.Network
{
/// <summary>
/// Fixed size vector of booleans
/// </summary>
public sealed class NetBitVector
{
private readonly int m_capacity;
private readonly int[] m_data;
private int m_numBitsSet;
/// <summary>
/// Gets the number of bits/booleans stored in this vector
/// </summary>
public int Capacity { get { return m_capacity; } }
/// <summary>
/// NetBitVector constructor
/// </summary>
public NetBitVector(int bitsCapacity)
{
m_capacity = bitsCapacity;
m_data = new int[(bitsCapacity + 31) / 32];
}
/// <summary>
/// Returns true if all bits/booleans are set to zero/false
/// </summary>
public bool IsEmpty()
{
return (m_numBitsSet == 0);
}
/// <summary>
/// Returns the number of bits/booleans set to one/true
/// </summary>
/// <returns></returns>
public int Count()
{
return m_numBitsSet;
}
/// <summary>
/// Shift all bits one step down, cycling the first bit to the top
/// </summary>
public void RotateDown()
{
int lenMinusOne = m_data.Length - 1;
int firstBit = m_data[0] & 1;
for (int i = 0; i < lenMinusOne; i++)
m_data[i] = ((m_data[i] >> 1) & ~(1 << 31)) | m_data[i + 1] << 31;
int lastIndex = m_capacity - 1 - (32 * lenMinusOne);
// special handling of last int
int cur = m_data[lenMinusOne];
cur = cur >> 1;
cur |= firstBit << lastIndex;
m_data[lenMinusOne] = cur;
}
/// <summary>
/// Gets the first (lowest) index set to true
/// </summary>
public int GetFirstSetIndex()
{
int idx = 0;
int data = m_data[0];
while (data == 0)
{
idx++;
data = m_data[idx];
}
int a = 0;
while (((data >> a) & 1) == 0)
a++;
return (idx * 32) + a;
}
/// <summary>
/// Gets the bit/bool at the specified index
/// </summary>
public bool Get(int bitIndex)
{
NetException.Assert(bitIndex >= 0 && bitIndex < m_capacity);
return (m_data[bitIndex / 32] & (1 << (bitIndex % 32))) != 0;
}
/// <summary>
/// Sets or clears the bit/bool at the specified index
/// </summary>
public void Set(int bitIndex, bool value)
{
NetException.Assert(bitIndex >= 0 && bitIndex < m_capacity);
int idx = bitIndex / 32;
if (value)
{
if ((m_data[idx] & (1 << (bitIndex % 32))) == 0)
m_numBitsSet++;
m_data[idx] |= (1 << (bitIndex % 32));
}
else
{
if ((m_data[idx] & (1 << (bitIndex % 32))) != 0)
m_numBitsSet--;
m_data[idx] &= (~(1 << (bitIndex % 32)));
}
}
/// <summary>
/// Gets the bit/bool at the specified index
/// </summary>
[System.Runtime.CompilerServices.IndexerName("Bit")]
public bool this[int index]
{
get { return Get(index); }
set { Set(index, value); }
}
/// <summary>
/// Sets all bits/booleans to zero/false
/// </summary>
public void Clear()
{
Array.Clear(m_data, 0, m_data.Length);
m_numBitsSet = 0;
NetException.Assert(this.IsEmpty());
}
/// <summary>
/// Returns a string that represents this object
/// </summary>
public override string ToString()
{
StringBuilder bdr = new StringBuilder(m_capacity + 2);
bdr.Append('[');
for (int i = 0; i < m_capacity; i++)
bdr.Append(Get(m_capacity - i - 1) ? '1' : '0');
bdr.Append(']');
return bdr.ToString();
}
}
}

View File

@@ -1,504 +0,0 @@
//#define UNSAFE
//#define BIGENDIAN
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace Lidgren.Network
{
/// <summary>
/// Helper class for NetBuffer to write/read bits
/// </summary>
public static class NetBitWriter
{
/// <summary>
/// Read 1-8 bits from a buffer into a byte
/// </summary>
public static byte ReadByte(byte[] fromBuffer, int numberOfBits, int readBitOffset)
{
NetException.Assert(((numberOfBits > 0) && (numberOfBits < 9)), "Read() can only read between 1 and 8 bits");
int bytePtr = readBitOffset >> 3;
int startReadAtIndex = readBitOffset - (bytePtr * 8); // (readBitOffset % 8);
if (startReadAtIndex == 0 && numberOfBits == 8)
return fromBuffer[bytePtr];
// mask away unused bits lower than (right of) relevant bits in first byte
byte returnValue = (byte)(fromBuffer[bytePtr] >> startReadAtIndex);
int numberOfBitsInSecondByte = numberOfBits - (8 - startReadAtIndex);
if (numberOfBitsInSecondByte < 1)
{
// we don't need to read from the second byte, but we DO need
// to mask away unused bits higher than (left of) relevant bits
return (byte)(returnValue & (255 >> (8 - numberOfBits)));
}
byte second = fromBuffer[bytePtr + 1];
// mask away unused bits higher than (left of) relevant bits in second byte
second &= (byte)(255 >> (8 - numberOfBitsInSecondByte));
return (byte)(returnValue | (byte)(second << (numberOfBits - numberOfBitsInSecondByte)));
}
/// <summary>
/// Read several bytes from a buffer
/// </summary>
public static void ReadBytes(byte[] fromBuffer, int numberOfBytes, int readBitOffset, byte[] destination, int destinationByteOffset)
{
int readPtr = readBitOffset >> 3;
int startReadAtIndex = readBitOffset - (readPtr * 8); // (readBitOffset % 8);
if (startReadAtIndex == 0)
{
Buffer.BlockCopy(fromBuffer, readPtr, destination, destinationByteOffset, numberOfBytes);
return;
}
int secondPartLen = 8 - startReadAtIndex;
int secondMask = 255 >> secondPartLen;
for (int i = 0; i < numberOfBytes; i++)
{
// mask away unused bits lower than (right of) relevant bits in byte
int b = fromBuffer[readPtr] >> startReadAtIndex;
readPtr++;
// mask away unused bits higher than (left of) relevant bits in second byte
int second = fromBuffer[readPtr] & secondMask;
destination[destinationByteOffset++] = (byte)(b | (second << secondPartLen));
}
return;
}
/// <summary>
/// Write a byte consisting of 1-8 bits to a buffer; assumes buffer is previously allocated
/// </summary>
public static void WriteByte(byte source, int numberOfBits, byte[] destination, int destBitOffset)
{
NetException.Assert(((numberOfBits >= 1) && (numberOfBits <= 8)), "Must write between 1 and 8 bits!");
// mask out unwanted bits in the source
byte isrc = (byte)(source & (0x000000FF >> (8 - numberOfBits)));
int bytePtr = destBitOffset >> 3;
int localBitLen = (destBitOffset % 8);
if (localBitLen == 0)
{
destination[bytePtr] = (byte)isrc;
return;
}
//destination[bytePtr] &= (byte)(255 >> (8 - localBitLen)); // clear before writing
//destination[bytePtr] |= (byte)(isrc << localBitLen); // write first half
destination[bytePtr] = (byte)(
(uint)(destination[bytePtr] & (255 >> (8 - localBitLen))) |
(uint)(isrc << localBitLen)
);
// need write into next byte?
if (localBitLen + numberOfBits > 8)
{
//destination[bytePtr + 1] &= (byte)(255 << localBitLen); // clear before writing
//destination[bytePtr + 1] |= (byte)(isrc >> (8 - localBitLen)); // write second half
destination[bytePtr + 1] = (byte)(
(uint)(destination[bytePtr + 1] & (255 << localBitLen)) |
(uint)(isrc >> (8 - localBitLen))
);
}
return;
}
/// <summary>
/// Write several whole bytes
/// </summary>
public static void WriteBytes(byte[] source, int sourceByteOffset, int numberOfBytes, byte[] destination, int destBitOffset)
{
int dstBytePtr = destBitOffset >> 3;
int firstPartLen = (destBitOffset % 8);
if (firstPartLen == 0)
{
Buffer.BlockCopy(source, sourceByteOffset, destination, dstBytePtr, numberOfBytes);
return;
}
int lastPartLen = 8 - firstPartLen;
for (int i = 0; i < numberOfBytes; i++)
{
byte src = source[sourceByteOffset + i];
// write last part of this byte
destination[dstBytePtr] &= (byte)(255 >> lastPartLen); // clear before writing
destination[dstBytePtr] |= (byte)(src << firstPartLen); // write first half
dstBytePtr++;
// write first part of next byte
destination[dstBytePtr] &= (byte)(255 << firstPartLen); // clear before writing
destination[dstBytePtr] |= (byte)(src >> lastPartLen); // write second half
}
return;
}
/// <summary>
/// Reads an unsigned 16 bit integer
/// </summary>
[CLSCompliant(false)]
#if UNSAFE
public static unsafe ushort ReadUInt16(byte[] fromBuffer, int numberOfBits, int readBitOffset)
{
Debug.Assert(((numberOfBits > 0) && (numberOfBits <= 16)), "ReadUInt16() can only read between 1 and 16 bits");
if (numberOfBits == 16 && ((readBitOffset % 8) == 0))
{
fixed (byte* ptr = &(fromBuffer[readBitOffset / 8]))
{
return *(((ushort*)ptr));
}
}
#else
public static ushort ReadUInt16(byte[] fromBuffer, int numberOfBits, int readBitOffset)
{
Debug.Assert(((numberOfBits > 0) && (numberOfBits <= 16)), "ReadUInt16() can only read between 1 and 16 bits");
#endif
ushort returnValue;
if (numberOfBits <= 8)
{
returnValue = ReadByte(fromBuffer, numberOfBits, readBitOffset);
return returnValue;
}
returnValue = ReadByte(fromBuffer, 8, readBitOffset);
numberOfBits -= 8;
readBitOffset += 8;
if (numberOfBits <= 8)
{
returnValue |= (ushort)(ReadByte(fromBuffer, numberOfBits, readBitOffset) << 8);
}
#if BIGENDIAN
// reorder bytes
uint retVal = returnValue;
retVal = ((retVal & 0x0000ff00) >> 8) | ((retVal & 0x000000ff) << 8);
return (ushort)retVal;
#else
return returnValue;
#endif
}
/// <summary>
/// Reads the specified number of bits into an UInt32
/// </summary>
[CLSCompliant(false)]
#if UNSAFE
public static unsafe uint ReadUInt32(byte[] fromBuffer, int numberOfBits, int readBitOffset)
{
NetException.Assert(((numberOfBits > 0) && (numberOfBits <= 32)), "ReadUInt32() can only read between 1 and 32 bits");
if (numberOfBits == 32 && ((readBitOffset % 8) == 0))
{
fixed (byte* ptr = &(fromBuffer[readBitOffset / 8]))
{
return *(((uint*)ptr));
}
}
#else
public static uint ReadUInt32(byte[] fromBuffer, int numberOfBits, int readBitOffset)
{
NetException.Assert(((numberOfBits > 0) && (numberOfBits <= 32)), "ReadUInt32() can only read between 1 and 32 bits");
#endif
uint returnValue;
if (numberOfBits <= 8)
{
returnValue = ReadByte(fromBuffer, numberOfBits, readBitOffset);
return returnValue;
}
returnValue = ReadByte(fromBuffer, 8, readBitOffset);
numberOfBits -= 8;
readBitOffset += 8;
if (numberOfBits <= 8)
{
returnValue |= (uint)(ReadByte(fromBuffer, numberOfBits, readBitOffset) << 8);
return returnValue;
}
returnValue |= (uint)(ReadByte(fromBuffer, 8, readBitOffset) << 8);
numberOfBits -= 8;
readBitOffset += 8;
if (numberOfBits <= 8)
{
uint r = ReadByte(fromBuffer, numberOfBits, readBitOffset);
r <<= 16;
returnValue |= r;
return returnValue;
}
returnValue |= (uint)(ReadByte(fromBuffer, 8, readBitOffset) << 16);
numberOfBits -= 8;
readBitOffset += 8;
returnValue |= (uint)(ReadByte(fromBuffer, numberOfBits, readBitOffset) << 24);
#if BIGENDIAN
// reorder bytes
return
((returnValue & 0xff000000) >> 24) |
((returnValue & 0x00ff0000) >> 8) |
((returnValue & 0x0000ff00) << 8) |
((returnValue & 0x000000ff) << 24);
#else
return returnValue;
#endif
}
//[CLSCompliant(false)]
//public static ulong ReadUInt64(byte[] fromBuffer, int numberOfBits, int readBitOffset)
/// <summary>
/// Writes un unsigned 16 bit integer
/// </summary>
[CLSCompliant(false)]
public static int WriteUInt16(ushort source, int numberOfBits, byte[] destination, int destinationBitOffset)
{
#if BIGENDIAN
// reorder bytes
uint intSource = source;
intSource = ((intSource & 0x0000ff00) >> 8) | ((intSource & 0x000000ff) << 8);
source = (ushort)intSource;
#endif
int returnValue = destinationBitOffset + numberOfBits;
if (numberOfBits <= 8)
{
NetBitWriter.WriteByte((byte)source, numberOfBits, destination, destinationBitOffset);
return returnValue;
}
NetBitWriter.WriteByte((byte)source, 8, destination, destinationBitOffset);
destinationBitOffset += 8;
numberOfBits -= 8;
if (numberOfBits <= 8)
{
NetBitWriter.WriteByte((byte)(source >> 8), numberOfBits, destination, destinationBitOffset);
return returnValue;
}
return returnValue;
}
/// <summary>
/// Writes the specified number of bits into a byte array
/// </summary>
[CLSCompliant(false)]
public static int WriteUInt32(uint source, int numberOfBits, byte[] destination, int destinationBitOffset)
{
#if BIGENDIAN
// reorder bytes
source = ((source & 0xff000000) >> 24) |
((source & 0x00ff0000) >> 8) |
((source & 0x0000ff00) << 8) |
((source & 0x000000ff) << 24);
#endif
int returnValue = destinationBitOffset + numberOfBits;
if (numberOfBits <= 8)
{
NetBitWriter.WriteByte((byte)source, numberOfBits, destination, destinationBitOffset);
return returnValue;
}
NetBitWriter.WriteByte((byte)source, 8, destination, destinationBitOffset);
destinationBitOffset += 8;
numberOfBits -= 8;
if (numberOfBits <= 8)
{
NetBitWriter.WriteByte((byte)(source >> 8), numberOfBits, destination, destinationBitOffset);
return returnValue;
}
NetBitWriter.WriteByte((byte)(source >> 8), 8, destination, destinationBitOffset);
destinationBitOffset += 8;
numberOfBits -= 8;
if (numberOfBits <= 8)
{
NetBitWriter.WriteByte((byte)(source >> 16), numberOfBits, destination, destinationBitOffset);
return returnValue;
}
NetBitWriter.WriteByte((byte)(source >> 16), 8, destination, destinationBitOffset);
destinationBitOffset += 8;
numberOfBits -= 8;
NetBitWriter.WriteByte((byte)(source >> 24), numberOfBits, destination, destinationBitOffset);
return returnValue;
}
/// <summary>
/// Writes the specified number of bits into a byte array
/// </summary>
[CLSCompliant(false)]
public static int WriteUInt64(ulong source, int numberOfBits, byte[] destination, int destinationBitOffset)
{
#if BIGENDIAN
source = ((source & 0xff00000000000000L) >> 56) |
((source & 0x00ff000000000000L) >> 40) |
((source & 0x0000ff0000000000L) >> 24) |
((source & 0x000000ff00000000L) >> 8) |
((source & 0x00000000ff000000L) << 8) |
((source & 0x0000000000ff0000L) << 24) |
((source & 0x000000000000ff00L) << 40) |
((source & 0x00000000000000ffL) << 56);
#endif
int returnValue = destinationBitOffset + numberOfBits;
if (numberOfBits <= 8)
{
NetBitWriter.WriteByte((byte)source, numberOfBits, destination, destinationBitOffset);
return returnValue;
}
NetBitWriter.WriteByte((byte)source, 8, destination, destinationBitOffset);
destinationBitOffset += 8;
numberOfBits -= 8;
if (numberOfBits <= 8)
{
NetBitWriter.WriteByte((byte)(source >> 8), numberOfBits, destination, destinationBitOffset);
return returnValue;
}
NetBitWriter.WriteByte((byte)(source >> 8), 8, destination, destinationBitOffset);
destinationBitOffset += 8;
numberOfBits -= 8;
if (numberOfBits <= 8)
{
NetBitWriter.WriteByte((byte)(source >> 16), numberOfBits, destination, destinationBitOffset);
return returnValue;
}
NetBitWriter.WriteByte((byte)(source >> 16), 8, destination, destinationBitOffset);
destinationBitOffset += 8;
numberOfBits -= 8;
if (numberOfBits <= 8)
{
NetBitWriter.WriteByte((byte)(source >> 24), numberOfBits, destination, destinationBitOffset);
return returnValue;
}
NetBitWriter.WriteByte((byte)(source >> 24), 8, destination, destinationBitOffset);
destinationBitOffset += 8;
numberOfBits -= 8;
if (numberOfBits <= 8)
{
NetBitWriter.WriteByte((byte)(source >> 32), numberOfBits, destination, destinationBitOffset);
return returnValue;
}
NetBitWriter.WriteByte((byte)(source >> 32), 8, destination, destinationBitOffset);
destinationBitOffset += 8;
numberOfBits -= 8;
if (numberOfBits <= 8)
{
NetBitWriter.WriteByte((byte)(source >> 40), numberOfBits, destination, destinationBitOffset);
return returnValue;
}
NetBitWriter.WriteByte((byte)(source >> 40), 8, destination, destinationBitOffset);
destinationBitOffset += 8;
numberOfBits -= 8;
if (numberOfBits <= 8)
{
NetBitWriter.WriteByte((byte)(source >> 48), numberOfBits, destination, destinationBitOffset);
return returnValue;
}
NetBitWriter.WriteByte((byte)(source >> 48), 8, destination, destinationBitOffset);
destinationBitOffset += 8;
numberOfBits -= 8;
if (numberOfBits <= 8)
{
NetBitWriter.WriteByte((byte)(source >> 56), numberOfBits, destination, destinationBitOffset);
return returnValue;
}
NetBitWriter.WriteByte((byte)(source >> 56), 8, destination, destinationBitOffset);
destinationBitOffset += 8;
numberOfBits -= 8;
return returnValue;
}
//
// Variable size
//
/// <summary>
/// Write Base128 encoded variable sized unsigned integer
/// </summary>
/// <returns>number of bytes written</returns>
[CLSCompliant(false)]
public static int WriteVariableUInt32(byte[] intoBuffer, int offset, uint value)
{
int retval = 0;
uint num1 = (uint)value;
while (num1 >= 0x80)
{
intoBuffer[offset + retval] = (byte)(num1 | 0x80);
num1 = num1 >> 7;
retval++;
}
intoBuffer[offset + retval] = (byte)num1;
return retval + 1;
}
/// <summary>
/// Reads a UInt32 written using WriteUnsignedVarInt(); will increment offset!
/// </summary>
[CLSCompliant(false)]
public static uint ReadVariableUInt32(byte[] buffer, ref int offset)
{
int num1 = 0;
int num2 = 0;
while (true)
{
if (num2 == 0x23)
throw new FormatException("Bad 7-bit encoded integer");
byte num3 = buffer[offset++];
num1 |= (num3 & 0x7f) << (num2 & 0x1f);
num2 += 7;
if ((num3 & 0x80) == 0)
return (uint)num1;
}
}
}
}

View File

@@ -1,312 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Diagnostics;
using System.Net;
namespace Lidgren.Network
{
public partial class NetBuffer
{
/// <summary>
/// Gets the internal data buffer
/// </summary>
public byte[] PeekDataBuffer() { return m_data; }
//
// 1 bit
//
/// <summary>
/// Reads a 1-bit Boolean without advancing the read pointer
/// </summary>
public bool PeekBoolean()
{
NetException.Assert(m_bitLength - m_readPosition >= 1, c_readOverflowError);
byte retval = NetBitWriter.ReadByte(m_data, 1, m_readPosition);
return (retval > 0 ? true : false);
}
//
// 8 bit
//
/// <summary>
/// Reads a Byte without advancing the read pointer
/// </summary>
public byte PeekByte()
{
NetException.Assert(m_bitLength - m_readPosition >= 8, c_readOverflowError);
byte retval = NetBitWriter.ReadByte(m_data, 8, m_readPosition);
return retval;
}
/// <summary>
/// Reads an SByte without advancing the read pointer
/// </summary>
[CLSCompliant(false)]
public sbyte PeekSByte()
{
NetException.Assert(m_bitLength - m_readPosition >= 8, c_readOverflowError);
byte retval = NetBitWriter.ReadByte(m_data, 8, m_readPosition);
return (sbyte)retval;
}
/// <summary>
/// Reads the specified number of bits into a Byte without advancing the read pointer
/// </summary>
public byte PeekByte(int numberOfBits)
{
byte retval = NetBitWriter.ReadByte(m_data, numberOfBits, m_readPosition);
return retval;
}
/// <summary>
/// Reads the specified number of bytes without advancing the read pointer
/// </summary>
public byte[] PeekBytes(int numberOfBytes)
{
NetException.Assert(m_bitLength - m_readPosition >= (numberOfBytes * 8), c_readOverflowError);
byte[] retval = new byte[numberOfBytes];
NetBitWriter.ReadBytes(m_data, numberOfBytes, m_readPosition, retval, 0);
return retval;
}
/// <summary>
/// Reads the specified number of bytes without advancing the read pointer
/// </summary>
public void PeekBytes(byte[] into, int offset, int numberOfBytes)
{
NetException.Assert(m_bitLength - m_readPosition >= (numberOfBytes * 8), c_readOverflowError);
NetException.Assert(offset + numberOfBytes <= into.Length);
NetBitWriter.ReadBytes(m_data, numberOfBytes, m_readPosition, into, offset);
return;
}
//
// 16 bit
//
/// <summary>
/// Reads an Int16 without advancing the read pointer
/// </summary>
public Int16 PeekInt16()
{
NetException.Assert(m_bitLength - m_readPosition >= 16, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt16(m_data, 16, m_readPosition);
return (short)retval;
}
/// <summary>
/// Reads a UInt16 without advancing the read pointer
/// </summary>
[CLSCompliant(false)]
public UInt16 PeekUInt16()
{
NetException.Assert(m_bitLength - m_readPosition >= 16, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt16(m_data, 16, m_readPosition);
return (ushort)retval;
}
//
// 32 bit
//
/// <summary>
/// Reads an Int32 without advancing the read pointer
/// </summary>
public Int32 PeekInt32()
{
NetException.Assert(m_bitLength - m_readPosition >= 32, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
return (Int32)retval;
}
/// <summary>
/// Reads the specified number of bits into an Int32 without advancing the read pointer
/// </summary>
public Int32 PeekInt32(int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 32), "ReadInt() can only read between 1 and 32 bits");
NetException.Assert(m_bitLength - m_readPosition >= numberOfBits, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt32(m_data, numberOfBits, m_readPosition);
if (numberOfBits == 32)
return (int)retval;
int signBit = 1 << (numberOfBits - 1);
if ((retval & signBit) == 0)
return (int)retval; // positive
// negative
unchecked
{
uint mask = ((uint)-1) >> (33 - numberOfBits);
uint tmp = (retval & mask) + 1;
return -((int)tmp);
}
}
/// <summary>
/// Reads a UInt32 without advancing the read pointer
/// </summary>
[CLSCompliant(false)]
public UInt32 PeekUInt32()
{
NetException.Assert(m_bitLength - m_readPosition >= 32, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
return retval;
}
/// <summary>
/// Reads the specified number of bits into a UInt32 without advancing the read pointer
/// </summary>
[CLSCompliant(false)]
public UInt32 PeekUInt32(int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 32), "ReadUInt() can only read between 1 and 32 bits");
//NetException.Assert(m_bitLength - m_readBitPtr >= numberOfBits, "tried to read past buffer size");
UInt32 retval = NetBitWriter.ReadUInt32(m_data, numberOfBits, m_readPosition);
return retval;
}
//
// 64 bit
//
/// <summary>
/// Reads a UInt64 without advancing the read pointer
/// </summary>
[CLSCompliant(false)]
public UInt64 PeekUInt64()
{
NetException.Assert(m_bitLength - m_readPosition >= 64, c_readOverflowError);
ulong low = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
ulong high = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition + 32);
ulong retval = low + (high << 32);
return retval;
}
/// <summary>
/// Reads an Int64 without advancing the read pointer
/// </summary>
public Int64 PeekInt64()
{
NetException.Assert(m_bitLength - m_readPosition >= 64, c_readOverflowError);
unchecked
{
ulong retval = PeekUInt64();
long longRetval = (long)retval;
return longRetval;
}
}
/// <summary>
/// Reads the specified number of bits into an UInt64 without advancing the read pointer
/// </summary>
[CLSCompliant(false)]
public UInt64 PeekUInt64(int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 64), "ReadUInt() can only read between 1 and 64 bits");
NetException.Assert(m_bitLength - m_readPosition >= numberOfBits, c_readOverflowError);
ulong retval;
if (numberOfBits <= 32)
{
retval = (ulong)NetBitWriter.ReadUInt32(m_data, numberOfBits, m_readPosition);
}
else
{
retval = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
retval |= NetBitWriter.ReadUInt32(m_data, numberOfBits - 32, m_readPosition) << 32;
}
return retval;
}
/// <summary>
/// Reads the specified number of bits into an Int64 without advancing the read pointer
/// </summary>
public Int64 PeekInt64(int numberOfBits)
{
NetException.Assert(((numberOfBits > 0) && (numberOfBits < 65)), "ReadInt64(bits) can only read between 1 and 64 bits");
return (long)PeekUInt64(numberOfBits);
}
//
// Floating point
//
/// <summary>
/// Reads a 32-bit Single without advancing the read pointer
/// </summary>
public float PeekFloat()
{
return PeekSingle();
}
/// <summary>
/// Reads a 32-bit Single without advancing the read pointer
/// </summary>
public float PeekSingle()
{
NetException.Assert(m_bitLength - m_readPosition >= 32, c_readOverflowError);
if ((m_readPosition & 7) == 0) // read directly
{
float retval = BitConverter.ToSingle(m_data, m_readPosition >> 3);
return retval;
}
byte[] bytes = PeekBytes(4);
return BitConverter.ToSingle(bytes, 0);
}
/// <summary>
/// Reads a 64-bit Double without advancing the read pointer
/// </summary>
public double PeekDouble()
{
NetException.Assert(m_bitLength - m_readPosition >= 64, c_readOverflowError);
if ((m_readPosition & 7) == 0) // read directly
{
// read directly
double retval = BitConverter.ToDouble(m_data, m_readPosition >> 3);
return retval;
}
byte[] bytes = PeekBytes(8);
return BitConverter.ToDouble(bytes, 0);
}
/// <summary>
/// Reads a string without advancing the read pointer
/// </summary>
public string PeekString()
{
int wasReadPosition = m_readPosition;
string retval = ReadString();
m_readPosition = wasReadPosition;
return retval;
}
}
}

View File

@@ -1,103 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Reflection;
namespace Lidgren.Network
{
public partial class NetBuffer
{
/// <summary>
/// Reads all public and private declared instance fields of the object in alphabetical order using reflection
/// </summary>
public void ReadAllFields(object target)
{
ReadAllFields(target, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
}
/// <summary>
/// Reads all fields with the specified binding of the object in alphabetical order using reflection
/// </summary>
public void ReadAllFields(object target, BindingFlags flags)
{
if (target == null)
return;
Type tp = target.GetType();
FieldInfo[] fields = tp.GetFields(flags);
NetUtility.SortMembersList(fields);
foreach (FieldInfo fi in fields)
{
object value;
// find read method
MethodInfo readMethod;
if (s_readMethods.TryGetValue(fi.FieldType, out readMethod))
{
// read value
value = readMethod.Invoke(this, null);
// set the value
fi.SetValue(target, value);
}
}
}
/// <summary>
/// Reads all public and private declared instance fields of the object in alphabetical order using reflection
/// </summary>
public void ReadAllProperties(object target)
{
ReadAllProperties(target, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
}
/// <summary>
/// Reads all fields with the specified binding of the object in alphabetical order using reflection
/// </summary>
public void ReadAllProperties(object target, BindingFlags flags)
{
if (target == null)
throw new ArgumentNullException("target");
if (target == null)
return;
Type tp = target.GetType();
PropertyInfo[] fields = tp.GetProperties(flags);
NetUtility.SortMembersList(fields);
foreach (PropertyInfo fi in fields)
{
object value;
// find read method
MethodInfo readMethod;
if (s_readMethods.TryGetValue(fi.PropertyType, out readMethod))
{
// read value
value = readMethod.Invoke(this, null);
// set the value
MethodInfo setMethod = fi.GetSetMethod((flags & BindingFlags.NonPublic) == BindingFlags.NonPublic);
setMethod.Invoke(target, new object[] { value });
}
}
}
}
}

View File

@@ -1,657 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Net;
namespace Lidgren.Network
{
/// <summary>
/// Base class for NetIncomingMessage and NetOutgoingMessage
/// </summary>
public partial class NetBuffer
{
private const string c_readOverflowError = "Trying to read past the buffer size - likely caused by mismatching Write/Reads, different size or order.";
/// <summary>
/// Reads a boolean value (stored as a single bit) written using Write(bool)
/// </summary>
public bool ReadBoolean()
{
NetException.Assert(m_bitLength - m_readPosition >= 1, c_readOverflowError);
byte retval = NetBitWriter.ReadByte(m_data, 1, m_readPosition);
m_readPosition += 1;
return (retval > 0 ? true : false);
}
/// <summary>
/// Reads a byte
/// </summary>
public byte ReadByte()
{
NetException.Assert(m_bitLength - m_readPosition >= 8, c_readOverflowError);
byte retval = NetBitWriter.ReadByte(m_data, 8, m_readPosition);
m_readPosition += 8;
return retval;
}
/// <summary>
/// Reads a byte and returns true or false for success
/// </summary>
public bool ReadByte(out byte result)
{
if (m_bitLength - m_readPosition < 8)
{
result = 0;
return false;
}
result = NetBitWriter.ReadByte(m_data, 8, m_readPosition);
m_readPosition += 8;
return true;
}
/// <summary>
/// Reads a signed byte
/// </summary>
[CLSCompliant(false)]
public sbyte ReadSByte()
{
NetException.Assert(m_bitLength - m_readPosition >= 8, c_readOverflowError);
byte retval = NetBitWriter.ReadByte(m_data, 8, m_readPosition);
m_readPosition += 8;
return (sbyte)retval;
}
/// <summary>
/// Reads 1 to 8 bits into a byte
/// </summary>
public byte ReadByte(int numberOfBits)
{
NetException.Assert(numberOfBits > 0 && numberOfBits <= 8, "ReadByte(bits) can only read between 1 and 8 bits");
byte retval = NetBitWriter.ReadByte(m_data, numberOfBits, m_readPosition);
m_readPosition += numberOfBits;
return retval;
}
/// <summary>
/// Reads the specified number of bytes
/// </summary>
public byte[] ReadBytes(int numberOfBytes)
{
NetException.Assert(m_bitLength - m_readPosition + 7 >= (numberOfBytes * 8), c_readOverflowError);
byte[] retval = new byte[numberOfBytes];
NetBitWriter.ReadBytes(m_data, numberOfBytes, m_readPosition, retval, 0);
m_readPosition += (8 * numberOfBytes);
return retval;
}
/// <summary>
/// Reads the specified number of bytes and returns true for success
/// </summary>
public bool ReadBytes(int numberOfBytes, out byte[] result)
{
if (m_bitLength - m_readPosition + 7 < (numberOfBytes * 8))
{
result = null;
return false;
}
result = new byte[numberOfBytes];
NetBitWriter.ReadBytes(m_data, numberOfBytes, m_readPosition, result, 0);
m_readPosition += (8 * numberOfBytes);
return true;
}
/// <summary>
/// Reads the specified number of bytes into a preallocated array
/// </summary>
/// <param name="into">The destination array</param>
/// <param name="offset">The offset where to start writing in the destination array</param>
/// <param name="numberOfBytes">The number of bytes to read</param>
public void ReadBytes(byte[] into, int offset, int numberOfBytes)
{
NetException.Assert(m_bitLength - m_readPosition + 7 >= (numberOfBytes * 8), c_readOverflowError);
NetException.Assert(offset + numberOfBytes <= into.Length);
NetBitWriter.ReadBytes(m_data, numberOfBytes, m_readPosition, into, offset);
m_readPosition += (8 * numberOfBytes);
return;
}
/// <summary>
/// Reads the specified number of bits into a preallocated array
/// </summary>
/// <param name="into">The destination array</param>
/// <param name="offset">The offset where to start writing in the destination array</param>
/// <param name="numberOfBits">The number of bits to read</param>
public void ReadBits(byte[] into, int offset, int numberOfBits)
{
NetException.Assert(m_bitLength - m_readPosition >= numberOfBits, c_readOverflowError);
NetException.Assert(offset + NetUtility.BytesToHoldBits(numberOfBits) <= into.Length);
int numberOfWholeBytes = numberOfBits / 8;
int extraBits = numberOfBits - (numberOfWholeBytes * 8);
NetBitWriter.ReadBytes(m_data, numberOfWholeBytes, m_readPosition, into, offset);
m_readPosition += (8 * numberOfWholeBytes);
if (extraBits > 0)
into[offset + numberOfWholeBytes] = ReadByte(extraBits);
return;
}
/// <summary>
/// Reads a 16 bit signed integer written using Write(Int16)
/// </summary>
public Int16 ReadInt16()
{
NetException.Assert(m_bitLength - m_readPosition >= 16, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt16(m_data, 16, m_readPosition);
m_readPosition += 16;
return (short)retval;
}
/// <summary>
/// Reads a 16 bit unsigned integer written using Write(UInt16)
/// </summary>
[CLSCompliant(false)]
public UInt16 ReadUInt16()
{
NetException.Assert(m_bitLength - m_readPosition >= 16, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt16(m_data, 16, m_readPosition);
m_readPosition += 16;
return (ushort)retval;
}
/// <summary>
/// Reads a 32 bit signed integer written using Write(Int32)
/// </summary>
public Int32 ReadInt32()
{
NetException.Assert(m_bitLength - m_readPosition >= 32, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
m_readPosition += 32;
return (Int32)retval;
}
/// <summary>
/// Reads a 32 bit signed integer written using Write(Int32)
/// </summary>
[CLSCompliant(false)]
public bool ReadInt32(out Int32 result)
{
if (m_bitLength - m_readPosition < 32)
{
result = 0;
return false;
}
result = (Int32)NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
m_readPosition += 32;
return true;
}
/// <summary>
/// Reads a signed integer stored in 1 to 32 bits, written using Write(Int32, Int32)
/// </summary>
public Int32 ReadInt32(int numberOfBits)
{
NetException.Assert(numberOfBits > 0 && numberOfBits <= 32, "ReadInt32(bits) can only read between 1 and 32 bits");
NetException.Assert(m_bitLength - m_readPosition >= numberOfBits, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt32(m_data, numberOfBits, m_readPosition);
m_readPosition += numberOfBits;
if (numberOfBits == 32)
return (int)retval;
int signBit = 1 << (numberOfBits - 1);
if ((retval & signBit) == 0)
return (int)retval; // positive
// negative
unchecked
{
uint mask = ((uint)-1) >> (33 - numberOfBits);
uint tmp = (retval & mask) + 1;
return -((int)tmp);
}
}
/// <summary>
/// Reads an 32 bit unsigned integer written using Write(UInt32)
/// </summary>
[CLSCompliant(false)]
public UInt32 ReadUInt32()
{
NetException.Assert(m_bitLength - m_readPosition >= 32, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
m_readPosition += 32;
return retval;
}
/// <summary>
/// Reads an 32 bit unsigned integer written using Write(UInt32) and returns true for success
/// </summary>
[CLSCompliant(false)]
public bool ReadUInt32(out UInt32 result)
{
if (m_bitLength - m_readPosition < 32)
{
result = 0;
return false;
}
result = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
m_readPosition += 32;
return true;
}
/// <summary>
/// Reads an unsigned integer stored in 1 to 32 bits, written using Write(UInt32, Int32)
/// </summary>
[CLSCompliant(false)]
public UInt32 ReadUInt32(int numberOfBits)
{
NetException.Assert(numberOfBits > 0 && numberOfBits <= 32, "ReadUInt32(bits) can only read between 1 and 32 bits");
//NetException.Assert(m_bitLength - m_readBitPtr >= numberOfBits, "tried to read past buffer size");
UInt32 retval = NetBitWriter.ReadUInt32(m_data, numberOfBits, m_readPosition);
m_readPosition += numberOfBits;
return retval;
}
/// <summary>
/// Reads a 64 bit unsigned integer written using Write(UInt64)
/// </summary>
[CLSCompliant(false)]
public UInt64 ReadUInt64()
{
NetException.Assert(m_bitLength - m_readPosition >= 64, c_readOverflowError);
ulong low = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
m_readPosition += 32;
ulong high = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
ulong retval = low + (high << 32);
m_readPosition += 32;
return retval;
}
/// <summary>
/// Reads a 64 bit signed integer written using Write(Int64)
/// </summary>
public Int64 ReadInt64()
{
NetException.Assert(m_bitLength - m_readPosition >= 64, c_readOverflowError);
unchecked
{
ulong retval = ReadUInt64();
long longRetval = (long)retval;
return longRetval;
}
}
/// <summary>
/// Reads an unsigned integer stored in 1 to 64 bits, written using Write(UInt64, Int32)
/// </summary>
[CLSCompliant(false)]
public UInt64 ReadUInt64(int numberOfBits)
{
NetException.Assert(numberOfBits > 0 && numberOfBits <= 64, "ReadUInt64(bits) can only read between 1 and 64 bits");
NetException.Assert(m_bitLength - m_readPosition >= numberOfBits, c_readOverflowError);
ulong retval;
if (numberOfBits <= 32)
{
retval = (ulong)NetBitWriter.ReadUInt32(m_data, numberOfBits, m_readPosition);
}
else
{
retval = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
retval |= NetBitWriter.ReadUInt32(m_data, numberOfBits - 32, m_readPosition) << 32;
}
m_readPosition += numberOfBits;
return retval;
}
/// <summary>
/// Reads a signed integer stored in 1 to 64 bits, written using Write(Int64, Int32)
/// </summary>
public Int64 ReadInt64(int numberOfBits)
{
NetException.Assert(((numberOfBits > 0) && (numberOfBits <= 64)), "ReadInt64(bits) can only read between 1 and 64 bits");
return (long)ReadUInt64(numberOfBits);
}
/// <summary>
/// Reads a 32 bit floating point value written using Write(Single)
/// </summary>
public float ReadFloat()
{
return ReadSingle();
}
/// <summary>
/// Reads a 32 bit floating point value written using Write(Single)
/// </summary>
public float ReadSingle()
{
NetException.Assert(m_bitLength - m_readPosition >= 32, c_readOverflowError);
if ((m_readPosition & 7) == 0) // read directly
{
float retval = BitConverter.ToSingle(m_data, m_readPosition >> 3);
m_readPosition += 32;
return retval;
}
byte[] bytes = ReadBytes(4);
return BitConverter.ToSingle(bytes, 0);
}
/// <summary>
/// Reads a 32 bit floating point value written using Write(Single)
/// </summary>
public bool ReadSingle(out float result)
{
if (m_bitLength - m_readPosition < 32)
{
result = 0.0f;
return false;
}
if ((m_readPosition & 7) == 0) // read directly
{
result = BitConverter.ToSingle(m_data, m_readPosition >> 3);
m_readPosition += 32;
return true;
}
byte[] bytes = ReadBytes(4);
result = BitConverter.ToSingle(bytes, 0);
return true;
}
/// <summary>
/// Reads a 64 bit floating point value written using Write(Double)
/// </summary>
public double ReadDouble()
{
NetException.Assert(m_bitLength - m_readPosition >= 64, c_readOverflowError);
if ((m_readPosition & 7) == 0) // read directly
{
// read directly
double retval = BitConverter.ToDouble(m_data, m_readPosition >> 3);
m_readPosition += 64;
return retval;
}
byte[] bytes = ReadBytes(8);
return BitConverter.ToDouble(bytes, 0);
}
//
// Variable bit count
//
/// <summary>
/// Reads a variable sized UInt32 written using WriteVariableUInt32()
/// </summary>
[CLSCompliant(false)]
public uint ReadVariableUInt32()
{
int num1 = 0;
int num2 = 0;
while (true)
{
byte num3 = this.ReadByte();
num1 |= (num3 & 0x7f) << num2;
num2 += 7;
if ((num3 & 0x80) == 0)
return (uint)num1;
}
}
/// <summary>
/// Reads a variable sized UInt32 written using WriteVariableUInt32() and returns true for success
/// </summary>
[CLSCompliant(false)]
public bool ReadVariableUInt32(out uint result)
{
int num1 = 0;
int num2 = 0;
while (true)
{
byte num3;
if (ReadByte(out num3) == false)
{
result = 0;
return false;
}
num1 |= (num3 & 0x7f) << num2;
num2 += 7;
if ((num3 & 0x80) == 0)
{
result = (uint)num1;
return true;
}
}
}
/// <summary>
/// Reads a variable sized Int32 written using WriteVariableInt32()
/// </summary>
public int ReadVariableInt32()
{
uint n = ReadVariableUInt32();
return (int)(n >> 1) ^ -(int)(n & 1); // decode zigzag
}
/// <summary>
/// Reads a variable sized Int64 written using WriteVariableInt64()
/// </summary>
public Int64 ReadVariableInt64()
{
UInt64 n = ReadVariableUInt64();
return (Int64)(n >> 1) ^ -(long)(n & 1); // decode zigzag
}
/// <summary>
/// Reads a variable sized UInt32 written using WriteVariableInt64()
/// </summary>
[CLSCompliant(false)]
public UInt64 ReadVariableUInt64()
{
UInt64 num1 = 0;
int num2 = 0;
while (true)
{
//if (num2 == 0x23)
// throw new FormatException("Bad 7-bit encoded integer");
byte num3 = this.ReadByte();
num1 |= ((UInt64)num3 & 0x7f) << num2;
num2 += 7;
if ((num3 & 0x80) == 0)
return num1;
}
}
/// <summary>
/// Reads a 32 bit floating point value written using WriteSignedSingle()
/// </summary>
/// <param name="numberOfBits">The number of bits used when writing the value</param>
/// <returns>A floating point value larger or equal to -1 and smaller or equal to 1</returns>
public float ReadSignedSingle(int numberOfBits)
{
uint encodedVal = ReadUInt32(numberOfBits);
int maxVal = (1 << numberOfBits) - 1;
return ((float)(encodedVal + 1) / (float)(maxVal + 1) - 0.5f) * 2.0f;
}
/// <summary>
/// Reads a 32 bit floating point value written using WriteUnitSingle()
/// </summary>
/// <param name="numberOfBits">The number of bits used when writing the value</param>
/// <returns>A floating point value larger or equal to 0 and smaller or equal to 1</returns>
public float ReadUnitSingle(int numberOfBits)
{
uint encodedVal = ReadUInt32(numberOfBits);
int maxVal = (1 << numberOfBits) - 1;
return (float)(encodedVal + 1) / (float)(maxVal + 1);
}
/// <summary>
/// Reads a 32 bit floating point value written using WriteRangedSingle()
/// </summary>
/// <param name="min">The minimum value used when writing the value</param>
/// <param name="max">The maximum value used when writing the value</param>
/// <param name="numberOfBits">The number of bits used when writing the value</param>
/// <returns>A floating point value larger or equal to MIN and smaller or equal to MAX</returns>
public float ReadRangedSingle(float min, float max, int numberOfBits)
{
float range = max - min;
int maxVal = (1 << numberOfBits) - 1;
float encodedVal = (float)ReadUInt32(numberOfBits);
float unit = encodedVal / (float)maxVal;
return min + (unit * range);
}
/// <summary>
/// Reads a 32 bit integer value written using WriteRangedInteger()
/// </summary>
/// <param name="min">The minimum value used when writing the value</param>
/// <param name="max">The maximum value used when writing the value</param>
/// <returns>A signed integer value larger or equal to MIN and smaller or equal to MAX</returns>
public int ReadRangedInteger(int min, int max)
{
uint range = (uint)(max - min);
int numBits = NetUtility.BitsToHoldUInt(range);
uint rvalue = ReadUInt32(numBits);
return (int)(min + rvalue);
}
/// <summary>
/// Reads a string written using Write(string)
/// </summary>
public string ReadString()
{
int byteLen = (int)ReadVariableUInt32();
if (byteLen == 0)
return String.Empty;
NetException.Assert(m_bitLength - m_readPosition >= (byteLen * 8), c_readOverflowError);
if ((m_readPosition & 7) == 0)
{
// read directly
string retval = System.Text.Encoding.UTF8.GetString(m_data, m_readPosition >> 3, byteLen);
m_readPosition += (8 * byteLen);
return retval;
}
byte[] bytes = ReadBytes(byteLen);
return System.Text.Encoding.UTF8.GetString(bytes, 0, bytes.Length);
}
/// <summary>
/// Reads a string written using Write(string) and returns true for success
/// </summary>
public bool ReadString(out string result)
{
uint byteLen;
if (ReadVariableUInt32(out byteLen) == false)
{
result = String.Empty;
return false;
}
if (byteLen == 0)
{
result = String.Empty;
return true;
}
if (m_bitLength - m_readPosition < (byteLen * 8))
{
result = String.Empty;
return false;
}
if ((m_readPosition & 7) == 0)
{
// read directly
result = System.Text.Encoding.UTF8.GetString(m_data, m_readPosition >> 3, (int)byteLen);
m_readPosition += (8 * (int)byteLen);
return true;
}
byte[] bytes;
if (ReadBytes((int)byteLen, out bytes) == false)
{
result = String.Empty;
return false;
}
result = System.Text.Encoding.UTF8.GetString(bytes, 0, bytes.Length);
return true;
}
/// <summary>
/// Reads a value, in local time comparable to NetTime.Now, written using WriteTime() for the connection supplied
/// </summary>
public double ReadTime(NetConnection connection, bool highPrecision)
{
double remoteTime = (highPrecision ? ReadDouble() : (double)ReadSingle());
if (connection == null)
throw new NetException("Cannot call ReadTime() on message without a connected sender (ie. unconnected messages)");
// lets bypass NetConnection.GetLocalTime for speed
return remoteTime - connection.m_remoteTimeOffset;
}
/// <summary>
/// Reads a stored IPv4 endpoint description
/// </summary>
public IPEndPoint ReadIPEndPoint()
{
byte len = ReadByte();
byte[] addressBytes = ReadBytes(len);
int port = (int)ReadUInt16();
IPAddress address = new IPAddress(addressBytes);
return new IPEndPoint(address, port);
}
/// <summary>
/// Pads data with enough bits to reach a full byte. Decreases cpu usage for subsequent byte writes.
/// </summary>
public void SkipPadBits()
{
m_readPosition = ((m_readPosition + 7) >> 3) * 8;
}
/// <summary>
/// Pads data with enough bits to reach a full byte. Decreases cpu usage for subsequent byte writes.
/// </summary>
public void ReadPadBits()
{
m_readPosition = ((m_readPosition + 7) >> 3) * 8;
}
/// <summary>
/// Pads data with the specified number of bits.
/// </summary>
public void SkipPadBits(int numberOfBits)
{
m_readPosition += numberOfBits;
}
}
}

View File

@@ -1,91 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Reflection;
namespace Lidgren.Network
{
public partial class NetBuffer
{
/// <summary>
/// Writes all public and private declared instance fields of the object in alphabetical order using reflection
/// </summary>
public void WriteAllFields(object ob)
{
WriteAllFields(ob, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
}
/// <summary>
/// Writes all fields with specified binding in alphabetical order using reflection
/// </summary>
public void WriteAllFields(object ob, BindingFlags flags)
{
if (ob == null)
return;
Type tp = ob.GetType();
FieldInfo[] fields = tp.GetFields(flags);
NetUtility.SortMembersList(fields);
foreach (FieldInfo fi in fields)
{
object value = fi.GetValue(ob);
// find the appropriate Write method
MethodInfo writeMethod;
if (s_writeMethods.TryGetValue(fi.FieldType, out writeMethod))
writeMethod.Invoke(this, new object[] { value });
else
throw new NetException("Failed to find write method for type " + fi.FieldType);
}
}
/// <summary>
/// Writes all public and private declared instance properties of the object in alphabetical order using reflection
/// </summary>
public void WriteAllProperties(object ob)
{
WriteAllProperties(ob, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
}
/// <summary>
/// Writes all properties with specified binding in alphabetical order using reflection
/// </summary>
public void WriteAllProperties(object ob, BindingFlags flags)
{
if (ob == null)
return;
Type tp = ob.GetType();
PropertyInfo[] fields = tp.GetProperties(flags);
NetUtility.SortMembersList(fields);
foreach (PropertyInfo fi in fields)
{
MethodInfo getMethod = fi.GetGetMethod((flags & BindingFlags.NonPublic) == BindingFlags.NonPublic);
object value = getMethod.Invoke(ob, null);
// find the appropriate Write method
MethodInfo writeMethod;
if (s_writeMethods.TryGetValue(fi.PropertyType, out writeMethod))
writeMethod.Invoke(this, new object[] { value });
}
}
}
}

View File

@@ -1,637 +0,0 @@
//#define UNSAFE
//#define BIGENDIAN
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Collections.Generic;
using System.Net;
using System.Reflection;
using System.Text;
using System.Runtime.InteropServices;
namespace Lidgren.Network
{
/// <summary>
/// Utility struct for writing Singles
/// </summary>
[StructLayout(LayoutKind.Explicit)]
public struct SingleUIntUnion
{
/// <summary>
/// Value as a 32 bit float
/// </summary>
[FieldOffset(0)]
public float SingleValue;
/// <summary>
/// Value as an unsigned 32 bit integer
/// </summary>
[FieldOffset(0)]
[CLSCompliant(false)]
public uint UIntValue;
}
public partial class NetBuffer
{
/// <summary>
/// Ensures the buffer can hold this number of bits
/// </summary>
public void EnsureBufferSize(int numberOfBits)
{
int byteLen = ((numberOfBits + 7) >> 3);
if (m_data == null)
{
m_data = new byte[byteLen + c_overAllocateAmount];
return;
}
if (m_data.Length < byteLen)
Array.Resize<byte>(ref m_data, byteLen + c_overAllocateAmount);
return;
}
/// <summary>
/// Ensures the buffer can hold this number of bits
/// </summary>
internal void InternalEnsureBufferSize(int numberOfBits)
{
int byteLen = ((numberOfBits + 7) >> 3);
if (m_data == null)
{
m_data = new byte[byteLen];
return;
}
if (m_data.Length < byteLen)
Array.Resize<byte>(ref m_data, byteLen);
return;
}
/// <summary>
/// Writes a boolean value using 1 bit
/// </summary>
public void Write(bool value)
{
EnsureBufferSize(m_bitLength + 1);
NetBitWriter.WriteByte((value ? (byte)1 : (byte)0), 1, m_data, m_bitLength);
m_bitLength += 1;
}
/// <summary>
/// Write a byte
/// </summary>
public void Write(byte source)
{
EnsureBufferSize(m_bitLength + 8);
NetBitWriter.WriteByte(source, 8, m_data, m_bitLength);
m_bitLength += 8;
}
/// <summary>
/// Writes a signed byte
/// </summary>
[CLSCompliant(false)]
public void Write(sbyte source)
{
EnsureBufferSize(m_bitLength + 8);
NetBitWriter.WriteByte((byte)source, 8, m_data, m_bitLength);
m_bitLength += 8;
}
/// <summary>
/// Writes 1 to 8 bits of a byte
/// </summary>
public void Write(byte source, int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 8), "Write(byte, numberOfBits) can only write between 1 and 8 bits");
EnsureBufferSize(m_bitLength + numberOfBits);
NetBitWriter.WriteByte(source, numberOfBits, m_data, m_bitLength);
m_bitLength += numberOfBits;
}
/// <summary>
/// Writes all bytes in an array
/// </summary>
public void Write(byte[] source)
{
if (source == null)
throw new ArgumentNullException("source");
int bits = source.Length * 8;
EnsureBufferSize(m_bitLength + bits);
NetBitWriter.WriteBytes(source, 0, source.Length, m_data, m_bitLength);
m_bitLength += bits;
}
/// <summary>
/// Writes the specified number of bytes from an array
/// </summary>
public void Write(byte[] source, int offsetInBytes, int numberOfBytes)
{
if (source == null)
throw new ArgumentNullException("source");
int bits = numberOfBytes * 8;
EnsureBufferSize(m_bitLength + bits);
NetBitWriter.WriteBytes(source, offsetInBytes, numberOfBytes, m_data, m_bitLength);
m_bitLength += bits;
}
/// <summary>
/// Writes an unsigned 16 bit integer
/// </summary>
/// <param name="source"></param>
[CLSCompliant(false)]
public void Write(UInt16 source)
{
EnsureBufferSize(m_bitLength + 16);
NetBitWriter.WriteUInt16(source, 16, m_data, m_bitLength);
m_bitLength += 16;
}
/// <summary>
/// Writes an unsigned integer using 1 to 16 bits
/// </summary>
[CLSCompliant(false)]
public void Write(UInt16 source, int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 16), "Write(ushort, numberOfBits) can only write between 1 and 16 bits");
EnsureBufferSize(m_bitLength + numberOfBits);
NetBitWriter.WriteUInt16(source, numberOfBits, m_data, m_bitLength);
m_bitLength += numberOfBits;
}
/// <summary>
/// Writes a signed 16 bit integer
/// </summary>
public void Write(Int16 source)
{
EnsureBufferSize(m_bitLength + 16);
NetBitWriter.WriteUInt16((ushort)source, 16, m_data, m_bitLength);
m_bitLength += 16;
}
#if UNSAFE
/// <summary>
/// Writes a 32 bit signed integer
/// </summary>
public unsafe void Write(Int32 source)
{
EnsureBufferSize(m_bitLength + 32);
// can write fast?
if (m_bitLength % 8 == 0)
{
fixed (byte* numRef = &Data[m_bitLength / 8])
{
*((int*)numRef) = source;
}
}
else
{
NetBitWriter.WriteUInt32((UInt32)source, 32, Data, m_bitLength);
}
m_bitLength += 32;
}
#else
/// <summary>
/// Writes a 32 bit signed integer
/// </summary>
public void Write(Int32 source)
{
EnsureBufferSize(m_bitLength + 32);
NetBitWriter.WriteUInt32((UInt32)source, 32, m_data, m_bitLength);
m_bitLength += 32;
}
#endif
#if UNSAFE
/// <summary>
/// Writes a 32 bit unsigned integer
/// </summary>
public unsafe void Write(UInt32 source)
{
EnsureBufferSize(m_bitLength + 32);
// can write fast?
if (m_bitLength % 8 == 0)
{
fixed (byte* numRef = &Data[m_bitLength / 8])
{
*((uint*)numRef) = source;
}
}
else
{
NetBitWriter.WriteUInt32(source, 32, Data, m_bitLength);
}
m_bitLength += 32;
}
#else
/// <summary>
/// Writes a 32 bit unsigned integer
/// </summary>
[CLSCompliant(false)]
public void Write(UInt32 source)
{
EnsureBufferSize(m_bitLength + 32);
NetBitWriter.WriteUInt32(source, 32, m_data, m_bitLength);
m_bitLength += 32;
}
#endif
/// <summary>
/// Writes a 32 bit signed integer
/// </summary>
[CLSCompliant(false)]
public void Write(UInt32 source, int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 32), "Write(uint, numberOfBits) can only write between 1 and 32 bits");
EnsureBufferSize(m_bitLength + numberOfBits);
NetBitWriter.WriteUInt32(source, numberOfBits, m_data, m_bitLength);
m_bitLength += numberOfBits;
}
/// <summary>
/// Writes a signed integer using 1 to 32 bits
/// </summary>
public void Write(Int32 source, int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 32), "Write(int, numberOfBits) can only write between 1 and 32 bits");
EnsureBufferSize(m_bitLength + numberOfBits);
if (numberOfBits != 32)
{
// make first bit sign
int signBit = 1 << (numberOfBits - 1);
if (source < 0)
source = (-source - 1) | signBit;
else
source &= (~signBit);
}
NetBitWriter.WriteUInt32((uint)source, numberOfBits, m_data, m_bitLength);
m_bitLength += numberOfBits;
}
/// <summary>
/// Writes a 64 bit unsigned integer
/// </summary>
[CLSCompliant(false)]
public void Write(UInt64 source)
{
EnsureBufferSize(m_bitLength + 64);
NetBitWriter.WriteUInt64(source, 64, m_data, m_bitLength);
m_bitLength += 64;
}
/// <summary>
/// Writes an unsigned integer using 1 to 64 bits
/// </summary>
[CLSCompliant(false)]
public void Write(UInt64 source, int numberOfBits)
{
EnsureBufferSize(m_bitLength + numberOfBits);
NetBitWriter.WriteUInt64(source, numberOfBits, m_data, m_bitLength);
m_bitLength += numberOfBits;
}
/// <summary>
/// Writes a 64 bit signed integer
/// </summary>
public void Write(Int64 source)
{
EnsureBufferSize(m_bitLength + 64);
ulong usource = (ulong)source;
NetBitWriter.WriteUInt64(usource, 64, m_data, m_bitLength);
m_bitLength += 64;
}
/// <summary>
/// Writes a signed integer using 1 to 64 bits
/// </summary>
public void Write(Int64 source, int numberOfBits)
{
EnsureBufferSize(m_bitLength + numberOfBits);
ulong usource = (ulong)source;
NetBitWriter.WriteUInt64(usource, numberOfBits, m_data, m_bitLength);
m_bitLength += numberOfBits;
}
//
// Floating point
//
#if UNSAFE
/// <summary>
/// Writes a 32 bit floating point value
/// </summary>
public unsafe void Write(float source)
{
uint val = *((uint*)&source);
#if BIGENDIAN
val = NetUtility.SwapByteOrder(val);
#endif
Write(val);
}
#else
/// <summary>
/// Writes a 32 bit floating point value
/// </summary>
public void Write(float source)
{
// Use union to avoid BitConverter.GetBytes() which allocates memory on the heap
SingleUIntUnion su;
su.UIntValue = 0; // must initialize every member of the union to avoid warning
su.SingleValue = source;
#if BIGENDIAN
// swap byte order
su.UIntValue = NetUtility.SwapByteOrder(su.UIntValue);
#endif
Write(su.UIntValue);
}
#endif
#if UNSAFE
/// <summary>
/// Writes a 64 bit floating point value
/// </summary>
public unsafe void Write(double source)
{
ulong val = *((ulong*)&source);
#if BIGENDIAN
val = NetUtility.SwapByteOrder(val);
#endif
Write(val);
}
#else
/// <summary>
/// Writes a 64 bit floating point value
/// </summary>
public void Write(double source)
{
byte[] val = BitConverter.GetBytes(source);
#if BIGENDIAN
// 0 1 2 3 4 5 6 7
// swap byte order
byte tmp = val[7];
val[7] = val[0];
val[0] = tmp;
tmp = val[6];
val[6] = val[1];
val[1] = tmp;
tmp = val[5];
val[5] = val[2];
val[2] = tmp;
tmp = val[4];
val[4] = val[3];
val[3] = tmp;
#endif
Write(val);
}
#endif
//
// Variable bits
//
/// <summary>
/// Write Base128 encoded variable sized unsigned integer of up to 32 bits
/// </summary>
/// <returns>number of bytes written</returns>
[CLSCompliant(false)]
public int WriteVariableUInt32(uint value)
{
int retval = 1;
uint num1 = (uint)value;
while (num1 >= 0x80)
{
this.Write((byte)(num1 | 0x80));
num1 = num1 >> 7;
retval++;
}
this.Write((byte)num1);
return retval;
}
/// <summary>
/// Write Base128 encoded variable sized signed integer of up to 32 bits
/// </summary>
/// <returns>number of bytes written</returns>
public int WriteVariableInt32(int value)
{
uint zigzag = (uint)(value << 1) ^ (uint)(value >> 31);
return WriteVariableUInt32(zigzag);
}
/// <summary>
/// Write Base128 encoded variable sized signed integer of up to 64 bits
/// </summary>
/// <returns>number of bytes written</returns>
public int WriteVariableInt64(Int64 value)
{
ulong zigzag = (ulong)(value << 1) ^ (ulong)(value >> 63);
return WriteVariableUInt64(zigzag);
}
/// <summary>
/// Write Base128 encoded variable sized unsigned integer of up to 64 bits
/// </summary>
/// <returns>number of bytes written</returns>
[CLSCompliant(false)]
public int WriteVariableUInt64(UInt64 value)
{
int retval = 1;
UInt64 num1 = (UInt64)value;
while (num1 >= 0x80)
{
this.Write((byte)(num1 | 0x80));
num1 = num1 >> 7;
retval++;
}
this.Write((byte)num1);
return retval;
}
/// <summary>
/// Compress (lossy) a float in the range -1..1 using numberOfBits bits
/// </summary>
public void WriteSignedSingle(float value, int numberOfBits)
{
NetException.Assert(((value >= -1.0) && (value <= 1.0)), " WriteSignedSingle() must be passed a float in the range -1 to 1; val is " + value);
float unit = (value + 1.0f) * 0.5f;
int maxVal = (1 << numberOfBits) - 1;
uint writeVal = (uint)(unit * (float)maxVal);
Write(writeVal, numberOfBits);
}
/// <summary>
/// Compress (lossy) a float in the range 0..1 using numberOfBits bits
/// </summary>
public void WriteUnitSingle(float value, int numberOfBits)
{
NetException.Assert(((value >= 0.0) && (value <= 1.0)), " WriteUnitSingle() must be passed a float in the range 0 to 1; val is " + value);
int maxValue = (1 << numberOfBits) - 1;
uint writeVal = (uint)(value * (float)maxValue);
Write(writeVal, numberOfBits);
}
/// <summary>
/// Compress a float within a specified range using a certain number of bits
/// </summary>
public void WriteRangedSingle(float value, float min, float max, int numberOfBits)
{
NetException.Assert(((value >= min) && (value <= max)), " WriteRangedSingle() must be passed a float in the range MIN to MAX; val is " + value);
float range = max - min;
float unit = ((value - min) / range);
int maxVal = (1 << numberOfBits) - 1;
Write((UInt32)((float)maxVal * unit), numberOfBits);
}
/// <summary>
/// Writes an integer with the least amount of bits need for the specified range
/// Returns number of bits written
/// </summary>
public int WriteRangedInteger(int min, int max, int value)
{
NetException.Assert(value >= min && value <= max, "Value not within min/max range!");
uint range = (uint)(max - min);
int numBits = NetUtility.BitsToHoldUInt(range);
uint rvalue = (uint)(value - min);
Write(rvalue, numBits);
return numBits;
}
/// <summary>
/// Write a string
/// </summary>
public void Write(string source)
{
if (string.IsNullOrEmpty(source))
{
EnsureBufferSize(m_bitLength + 8);
WriteVariableUInt32(0);
return;
}
byte[] bytes = Encoding.UTF8.GetBytes(source);
EnsureBufferSize(m_bitLength + 8 + (bytes.Length * 8));
WriteVariableUInt32((uint)bytes.Length);
Write(bytes);
}
/// <summary>
/// Writes an endpoint description
/// </summary>
public void Write(IPEndPoint endPoint)
{
byte[] bytes = endPoint.Address.GetAddressBytes();
Write((byte)bytes.Length);
Write(bytes);
Write((ushort)endPoint.Port);
}
/// <summary>
/// Writes the current local time to a message; readable (and convertable to local time) by the remote host using ReadTime()
/// </summary>
public void WriteTime(bool highPrecision)
{
double localTime = NetTime.Now;
if (highPrecision)
Write(localTime);
else
Write((float)localTime);
}
/// <summary>
/// Writes a local timestamp to a message; readable (and convertable to local time) by the remote host using ReadTime()
/// </summary>
public void WriteTime(double localTime, bool highPrecision)
{
if (highPrecision)
Write(localTime);
else
Write((float)localTime);
}
/// <summary>
/// Pads data with enough bits to reach a full byte. Decreases cpu usage for subsequent byte writes.
/// </summary>
public void WritePadBits()
{
m_bitLength = ((m_bitLength + 7) >> 3) * 8;
EnsureBufferSize(m_bitLength);
}
/// <summary>
/// Pads data with the specified number of bits.
/// </summary>
public void WritePadBits(int numberOfBits)
{
m_bitLength += numberOfBits;
EnsureBufferSize(m_bitLength);
}
/// <summary>
/// Append all the bits of message to this message
/// </summary>
public void Write(NetOutgoingMessage message)
{
EnsureBufferSize(m_bitLength + (message.LengthBytes * 8));
Write(message.m_data, 0, message.LengthBytes);
// did we write excessive bits?
int bitsInLastByte = (message.m_bitLength % 8);
if (bitsInLastByte != 0)
{
int excessBits = 8 - bitsInLastByte;
m_bitLength -= excessBits;
}
}
/// <summary>
/// Append all the bits of message to this message
/// </summary>
public void Write(NetIncomingMessage message)
{
EnsureBufferSize(m_bitLength + (message.LengthBytes * 8));
Write(message.m_data, 0, message.LengthBytes);
// did we write excessive bits?
int bitsInLastByte = (message.m_bitLength % 8);
if (bitsInLastByte != 0)
{
int excessBits = 8 - bitsInLastByte;
m_bitLength -= excessBits;
}
}
}
}

View File

@@ -1,100 +0,0 @@
using System;
using System.Collections.Generic;
using System.Reflection;
namespace Lidgren.Network
{
public partial class NetBuffer
{
/// <summary>
/// Number of bytes to overallocate for each message to avoid resizing
/// </summary>
protected const int c_overAllocateAmount = 4;
private static readonly Dictionary<Type, MethodInfo> s_readMethods;
private static readonly Dictionary<Type, MethodInfo> s_writeMethods;
internal byte[] m_data;
internal int m_bitLength;
internal int m_readPosition;
/// <summary>
/// Gets or sets the internal data buffer
/// </summary>
public byte[] Data
{
get { return m_data; }
set { m_data = value; }
}
/// <summary>
/// Gets or sets the length of the used portion of the buffer in bytes
/// </summary>
public int LengthBytes
{
get { return ((m_bitLength + 7) >> 3); }
set
{
m_bitLength = value * 8;
InternalEnsureBufferSize(m_bitLength);
}
}
/// <summary>
/// Gets or sets the length of the used portion of the buffer in bits
/// </summary>
public int LengthBits
{
get { return m_bitLength; }
set
{
m_bitLength = value;
InternalEnsureBufferSize(m_bitLength);
}
}
/// <summary>
/// Gets or sets the read position in the buffer, in bits (not bytes)
/// </summary>
public long Position
{
get { return (long)m_readPosition; }
set { m_readPosition = (int)value; }
}
/// <summary>
/// Gets the position in the buffer in bytes; note that the bits of the first returned byte may already have been read - check the Position property to make sure.
/// </summary>
public int PositionInBytes
{
get { return (int)(m_readPosition / 8); }
}
static NetBuffer()
{
Type[] integralTypes = typeof(Byte).Assembly.GetTypes();
s_readMethods = new Dictionary<Type, MethodInfo>();
MethodInfo[] methods = typeof(NetIncomingMessage).GetMethods(BindingFlags.Instance | BindingFlags.Public);
foreach (MethodInfo mi in methods)
{
if (mi.GetParameters().Length == 0 && mi.Name.StartsWith("Read", StringComparison.InvariantCulture) && mi.Name.Substring(4) == mi.ReturnType.Name)
{
s_readMethods[mi.ReturnType] = mi;
}
}
s_writeMethods = new Dictionary<Type, MethodInfo>();
methods = typeof(NetOutgoingMessage).GetMethods(BindingFlags.Instance | BindingFlags.Public);
foreach (MethodInfo mi in methods)
{
if (mi.Name.Equals("Write", StringComparison.InvariantCulture))
{
ParameterInfo[] pis = mi.GetParameters();
if (pis.Length == 1)
s_writeMethods[pis[0].ParameterType] = mi;
}
}
}
}
}

View File

@@ -1,171 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Net;
namespace Lidgren.Network
{
/// <summary>
/// Specialized version of NetPeer used for a "client" connection. It does not accept any incoming connections and maintains a ServerConnection property
/// </summary>
public class NetClient : NetPeer
{
/// <summary>
/// Gets the connection to the server, if any
/// </summary>
public NetConnection ServerConnection
{
get
{
NetConnection retval = null;
if (m_connections.Count > 0)
{
try
{
retval = m_connections[0];
}
catch
{
// preempted!
return null;
}
}
return retval;
}
}
/// <summary>
/// Gets the connection status of the server connection (or NetConnectionStatus.Disconnected if no connection)
/// </summary>
public NetConnectionStatus ConnectionStatus
{
get
{
var conn = ServerConnection;
if (conn == null)
return NetConnectionStatus.Disconnected;
return conn.Status;
}
}
/// <summary>
/// NetClient constructor
/// </summary>
/// <param name="config"></param>
public NetClient(NetPeerConfiguration config)
: base(config)
{
config.AcceptIncomingConnections = false;
}
/// <summary>
/// Connect to a remote server
/// </summary>
/// <param name="remoteEndPoint">The remote endpoint to connect to</param>
/// <param name="hailMessage">The hail message to pass</param>
/// <returns>server connection, or null if already connected</returns>
public override NetConnection Connect(IPEndPoint remoteEndPoint, NetOutgoingMessage hailMessage)
{
lock (m_connections)
{
if (m_connections.Count > 0)
{
LogWarning("Connect attempt failed; Already connected");
return null;
}
}
lock (m_handshakes)
{
if (m_handshakes.Count > 0)
{
LogWarning("Connect attempt failed; Handshake already in progress");
return null;
}
}
return base.Connect(remoteEndPoint, hailMessage);
}
/// <summary>
/// Disconnect from server
/// </summary>
/// <param name="byeMessage">reason for disconnect</param>
public void Disconnect(string byeMessage)
{
NetConnection serverConnection = ServerConnection;
if (serverConnection == null)
{
lock (m_handshakes)
{
if (m_handshakes.Count > 0)
{
LogVerbose("Aborting connection attempt");
foreach(var hs in m_handshakes)
hs.Value.Disconnect(byeMessage);
return;
}
}
LogWarning("Disconnect requested when not connected!");
return;
}
serverConnection.Disconnect(byeMessage);
}
/// <summary>
/// Sends message to server
/// </summary>
public NetSendResult SendMessage(NetOutgoingMessage msg, NetDeliveryMethod method)
{
NetConnection serverConnection = ServerConnection;
if (serverConnection == null)
{
LogWarning("Cannot send message, no server connection!");
return NetSendResult.FailedNotConnected;
}
return serverConnection.SendMessage(msg, method, 0);
}
/// <summary>
/// Sends message to server
/// </summary>
public NetSendResult SendMessage(NetOutgoingMessage msg, NetDeliveryMethod method, int sequenceChannel)
{
NetConnection serverConnection = ServerConnection;
if (serverConnection == null)
{
LogWarning("Cannot send message, no server connection!");
return NetSendResult.FailedNotConnected;
}
return serverConnection.SendMessage(msg, method, sequenceChannel);
}
/// <summary>
/// Returns a string that represents this object
/// </summary>
public override string ToString()
{
return "[NetClient " + ServerConnection + "]";
}
}
}

View File

@@ -1,479 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Lidgren.Network
{
public partial class NetConnection
{
internal bool m_connectRequested;
internal bool m_disconnectRequested;
internal bool m_connectionInitiator;
internal string m_disconnectMessage;
internal NetIncomingMessage m_remoteHailMessage;
internal float m_lastHandshakeSendTime;
internal int m_handshakeAttempts;
/// <summary>
/// The message that the remote part specified via Connect() or Approve() - can be null.
/// </summary>
public NetIncomingMessage RemoteHailMessage { get { return m_remoteHailMessage; } }
// heartbeat called when connection still is in m_handshakes of NetPeer
internal void UnconnectedHeartbeat(float now)
{
m_peer.VerifyNetworkThread();
if (m_disconnectRequested)
ExecuteDisconnect(m_disconnectMessage, true);
if (m_connectRequested)
{
switch (m_status)
{
case NetConnectionStatus.Connected:
case NetConnectionStatus.RespondedConnect:
// reconnect
ExecuteDisconnect("Reconnecting", true);
break;
case NetConnectionStatus.InitiatedConnect:
// send another connect attempt
SendConnect(now);
break;
case NetConnectionStatus.Disconnected:
throw new NetException("This connection is Disconnected; spent. A new one should have been created");
case NetConnectionStatus.Disconnecting:
// let disconnect finish first
break;
case NetConnectionStatus.None:
default:
SendConnect(now);
break;
}
return;
}
if (now - m_lastHandshakeSendTime > m_peerConfiguration.m_resendHandshakeInterval)
{
if (m_handshakeAttempts >= m_peerConfiguration.m_maximumHandshakeAttempts)
{
// failed to connect
ExecuteDisconnect("Failed to establish connection - no response from remote host", true);
return;
}
// resend handshake
switch (m_status)
{
case NetConnectionStatus.InitiatedConnect:
SendConnect(now);
break;
case NetConnectionStatus.RespondedConnect:
SendConnectResponse(now, true);
break;
case NetConnectionStatus.None:
case NetConnectionStatus.ReceivedInitiation:
m_peer.LogWarning("Time to resend handshake, but status is " + m_status);
break;
case NetConnectionStatus.RespondedAwaitingApproval:
// awaiting approval
m_lastHandshakeSendTime = now; // postpone handshake resend
break;
default:
m_peer.LogWarning("Time to resend handshake, but status is " + m_status);
break;
}
}
}
internal void ExecuteDisconnect(string reason, bool sendByeMessage)
{
m_peer.VerifyNetworkThread();
//m_peer.LogDebug("Executing disconnect");
// clear send queues
for (int i = 0; i < m_sendChannels.Length; i++)
{
NetSenderChannelBase channel = m_sendChannels[i];
if (channel != null)
channel.Reset();
}
if (sendByeMessage)
SendDisconnect(reason, true);
SetStatus(NetConnectionStatus.Disconnected, reason);
// in case we're still in handshake
lock (m_peer.m_handshakes)
m_peer.m_handshakes.Remove(m_remoteEndPoint);
m_disconnectRequested = false;
m_connectRequested = false;
m_handshakeAttempts = 0;
}
internal void SendConnect(float now)
{
m_peer.VerifyNetworkThread();
int preAllocate = 13 + m_peerConfiguration.AppIdentifier.Length;
preAllocate += (m_localHailMessage == null ? 0 : m_localHailMessage.LengthBytes);
NetOutgoingMessage om = m_peer.CreateMessage(preAllocate);
om.m_messageType = NetMessageType.Connect;
om.Write(m_peerConfiguration.AppIdentifier);
om.Write(m_peer.m_uniqueIdentifier);
om.Write(now);
WriteLocalHail(om);
m_peer.SendLibrary(om, m_remoteEndPoint);
m_connectRequested = false;
m_lastHandshakeSendTime = now;
m_handshakeAttempts++;
if (m_handshakeAttempts > 1)
m_peer.LogDebug("Resending Connect...");
SetStatus(NetConnectionStatus.InitiatedConnect, "Locally requested connect");
}
internal void SendConnectResponse(float now, bool onLibraryThread)
{
if (onLibraryThread)
m_peer.VerifyNetworkThread();
NetOutgoingMessage om = m_peer.CreateMessage(m_peerConfiguration.AppIdentifier.Length + 13 + (m_localHailMessage == null ? 0 : m_localHailMessage.LengthBytes));
om.m_messageType = NetMessageType.ConnectResponse;
om.Write(m_peerConfiguration.AppIdentifier);
om.Write(m_peer.m_uniqueIdentifier);
om.Write(now);
WriteLocalHail(om);
if (onLibraryThread)
m_peer.SendLibrary(om, m_remoteEndPoint);
else
m_peer.m_unsentUnconnectedMessages.Enqueue(new NetTuple<System.Net.IPEndPoint, NetOutgoingMessage>(m_remoteEndPoint, om));
m_lastHandshakeSendTime = now;
m_handshakeAttempts++;
if (m_handshakeAttempts > 1)
m_peer.LogDebug("Resending ConnectResponse...");
SetStatus(NetConnectionStatus.RespondedConnect, "Remotely requested connect");
}
internal void SendDisconnect(string reason, bool onLibraryThread)
{
if (onLibraryThread)
m_peer.VerifyNetworkThread();
NetOutgoingMessage om = m_peer.CreateMessage(reason);
om.m_messageType = NetMessageType.Disconnect;
if (onLibraryThread)
m_peer.SendLibrary(om, m_remoteEndPoint);
else
m_peer.m_unsentUnconnectedMessages.Enqueue(new NetTuple<System.Net.IPEndPoint, NetOutgoingMessage>(m_remoteEndPoint, om));
}
private void WriteLocalHail(NetOutgoingMessage om)
{
if (m_localHailMessage != null)
{
byte[] hi = m_localHailMessage.Data;
if (hi != null && hi.Length >= m_localHailMessage.LengthBytes)
{
if (om.LengthBytes + m_localHailMessage.LengthBytes > m_peerConfiguration.m_maximumTransmissionUnit - 10)
throw new NetException("Hail message too large; can maximally be " + (m_peerConfiguration.m_maximumTransmissionUnit - 10 - om.LengthBytes));
om.Write(m_localHailMessage.Data, 0, m_localHailMessage.LengthBytes);
}
}
}
internal void SendConnectionEstablished()
{
NetOutgoingMessage om = m_peer.CreateMessage(4);
om.m_messageType = NetMessageType.ConnectionEstablished;
om.Write((float)NetTime.Now);
m_peer.SendLibrary(om, m_remoteEndPoint);
m_handshakeAttempts = 0;
InitializePing();
if (m_status != NetConnectionStatus.Connected)
SetStatus(NetConnectionStatus.Connected, "Connected to " + NetUtility.ToHexString(m_remoteUniqueIdentifier));
}
/// <summary>
/// Approves this connection; sending a connection response to the remote host
/// </summary>
public void Approve()
{
if (m_status != NetConnectionStatus.RespondedAwaitingApproval)
{
m_peer.LogWarning("Approve() called in wrong status; expected RespondedAwaitingApproval; got " + m_status);
return;
}
m_localHailMessage = null;
m_handshakeAttempts = 0;
SendConnectResponse((float)NetTime.Now, false);
}
/// <summary>
/// Approves this connection; sending a connection response to the remote host
/// </summary>
/// <param name="localHail">The local hail message that will be set as RemoteHailMessage on the remote host</param>
public void Approve(NetOutgoingMessage localHail)
{
if (m_status != NetConnectionStatus.RespondedAwaitingApproval)
{
m_peer.LogWarning("Approve() called in wrong status; expected RespondedAwaitingApproval; got " + m_status);
return;
}
m_localHailMessage = localHail;
m_handshakeAttempts = 0;
SendConnectResponse((float)NetTime.Now, false);
}
/// <summary>
/// Denies this connection; disconnecting it
/// </summary>
public void Deny()
{
Deny(string.Empty);
}
/// <summary>
/// Denies this connection; disconnecting it
/// </summary>
/// <param name="reason">The stated reason for the disconnect, readable as a string in the StatusChanged message on the remote host</param>
public void Deny(string reason)
{
// send disconnect; remove from handshakes
SendDisconnect(reason, false);
// remove from handshakes
m_peer.m_handshakes.Remove(m_remoteEndPoint); // TODO: make this more thread safe? we're on user thread
}
internal void ReceivedHandshake(double now, NetMessageType tp, int ptr, int payloadLength)
{
m_peer.VerifyNetworkThread();
byte[] hail;
switch (tp)
{
case NetMessageType.Connect:
if (m_status == NetConnectionStatus.ReceivedInitiation)
{
// Whee! Server full has already been checked
bool ok = ValidateHandshakeData(ptr, payloadLength, out hail);
if (ok)
{
if (hail != null)
{
m_remoteHailMessage = m_peer.CreateIncomingMessage(NetIncomingMessageType.Data, hail);
m_remoteHailMessage.LengthBits = (hail.Length * 8);
}
else
{
m_remoteHailMessage = null;
}
if (m_peerConfiguration.IsMessageTypeEnabled(NetIncomingMessageType.ConnectionApproval))
{
// ok, let's not add connection just yet
NetIncomingMessage appMsg = m_peer.CreateIncomingMessage(NetIncomingMessageType.ConnectionApproval, (m_remoteHailMessage == null ? 0 : m_remoteHailMessage.LengthBytes));
appMsg.m_receiveTime = now;
appMsg.m_senderConnection = this;
appMsg.m_senderEndPoint = this.m_remoteEndPoint;
if (m_remoteHailMessage != null)
appMsg.Write(m_remoteHailMessage.m_data, 0, m_remoteHailMessage.LengthBytes);
SetStatus(NetConnectionStatus.RespondedAwaitingApproval, "Awaiting approval");
m_peer.ReleaseMessage(appMsg);
return;
}
SendConnectResponse((float)now, true);
}
return;
}
if (m_status == NetConnectionStatus.RespondedAwaitingApproval)
{
m_peer.LogWarning("Ignoring multiple Connect() most likely due to a delayed Approval");
return;
}
if (m_status == NetConnectionStatus.RespondedConnect)
{
// our ConnectResponse must have been lost
SendConnectResponse((float)now, true);
return;
}
m_peer.LogDebug("Unhandled Connect: " + tp + ", status is " + m_status + " length: " + payloadLength);
break;
case NetMessageType.ConnectResponse:
switch (m_status)
{
case NetConnectionStatus.InitiatedConnect:
// awesome
bool ok = ValidateHandshakeData(ptr, payloadLength, out hail);
if (ok)
{
if (hail != null)
{
m_remoteHailMessage = m_peer.CreateIncomingMessage(NetIncomingMessageType.Data, hail);
m_remoteHailMessage.LengthBits = (hail.Length * 8);
}
else
{
m_remoteHailMessage = null;
}
m_peer.AcceptConnection(this);
SendConnectionEstablished();
return;
}
break;
case NetConnectionStatus.RespondedConnect:
// hello, wtf?
break;
case NetConnectionStatus.Disconnecting:
case NetConnectionStatus.Disconnected:
case NetConnectionStatus.ReceivedInitiation:
case NetConnectionStatus.None:
// wtf? anyway, bye!
break;
case NetConnectionStatus.Connected:
// my ConnectionEstablished must have been lost, send another one
SendConnectionEstablished();
return;
}
break;
case NetMessageType.ConnectionEstablished:
switch (m_status)
{
case NetConnectionStatus.Connected:
// ok...
break;
case NetConnectionStatus.Disconnected:
case NetConnectionStatus.Disconnecting:
case NetConnectionStatus.None:
// too bad, almost made it
break;
case NetConnectionStatus.ReceivedInitiation:
// uh, a little premature... ignore
break;
case NetConnectionStatus.InitiatedConnect:
// weird, should have been RespondedConnect...
break;
case NetConnectionStatus.RespondedConnect:
// awesome
NetIncomingMessage msg = m_peer.SetupReadHelperMessage(ptr, payloadLength);
InitializeRemoteTimeOffset(msg.ReadSingle());
m_peer.AcceptConnection(this);
InitializePing();
SetStatus(NetConnectionStatus.Connected, "Connected to " + NetUtility.ToHexString(m_remoteUniqueIdentifier));
return;
}
break;
case NetMessageType.Disconnect:
// ouch
string reason = "Ouch";
try
{
NetIncomingMessage inc = m_peer.SetupReadHelperMessage(ptr, payloadLength);
reason = inc.ReadString();
}
catch
{
}
ExecuteDisconnect(reason, false);
break;
case NetMessageType.Discovery:
m_peer.HandleIncomingDiscoveryRequest(now, m_remoteEndPoint, ptr, payloadLength);
return;
case NetMessageType.DiscoveryResponse:
m_peer.HandleIncomingDiscoveryResponse(now, m_remoteEndPoint, ptr, payloadLength);
return;
case NetMessageType.Ping:
// silently ignore
return;
default:
m_peer.LogDebug("Unhandled type during handshake: " + tp + " length: " + payloadLength);
break;
}
}
private bool ValidateHandshakeData(int ptr, int payloadLength, out byte[] hail)
{
hail = null;
// create temporary incoming message
NetIncomingMessage msg = m_peer.SetupReadHelperMessage(ptr, payloadLength);
try
{
string remoteAppIdentifier = msg.ReadString();
long remoteUniqueIdentifier = msg.ReadInt64();
InitializeRemoteTimeOffset(msg.ReadSingle());
int remainingBytes = payloadLength - (msg.PositionInBytes - ptr);
if (remainingBytes > 0)
hail = msg.ReadBytes(remainingBytes);
if (remoteAppIdentifier != m_peer.m_configuration.AppIdentifier)
{
// wrong app identifier
ExecuteDisconnect("Wrong application identifier!", true);
return false;
}
m_remoteUniqueIdentifier = remoteUniqueIdentifier;
}
catch(Exception ex)
{
// whatever; we failed
ExecuteDisconnect("Handshake data validation failed", true);
m_peer.LogWarning("ReadRemoteHandshakeData failed: " + ex.Message);
return false;
}
return true;
}
/// <summary>
/// Disconnect from the remote peer
/// </summary>
/// <param name="byeMessage">the message to send with the disconnect message</param>
public void Disconnect(string byeMessage)
{
// user or library thread
if (m_status == NetConnectionStatus.None || m_status == NetConnectionStatus.Disconnected)
return;
m_peer.LogVerbose("Disconnect requested for " + this);
m_disconnectMessage = byeMessage;
if (m_status != NetConnectionStatus.Disconnected && m_status != NetConnectionStatus.None)
SetStatus(NetConnectionStatus.Disconnecting, byeMessage);
m_handshakeAttempts = 0;
m_disconnectRequested = true;
}
}
}

View File

@@ -1,147 +0,0 @@
using System;
namespace Lidgren.Network
{
public partial class NetConnection
{
private float m_sentPingTime;
private int m_sentPingNumber;
private float m_averageRoundtripTime;
private float m_timeoutDeadline = float.MaxValue;
// local time value + m_remoteTimeOffset = remote time value
internal double m_remoteTimeOffset;
/// <summary>
/// Gets the current average roundtrip time in seconds
/// </summary>
public float AverageRoundtripTime { get { return m_averageRoundtripTime; } }
/// <summary>
/// Time offset between this peer and the remote peer
/// </summary>
public float RemoteTimeOffset { get { return (float)m_remoteTimeOffset; } }
// this might happen more than once
internal void InitializeRemoteTimeOffset(float remoteSendTime)
{
m_remoteTimeOffset = (remoteSendTime + (m_averageRoundtripTime / 2.0)) - NetTime.Now;
}
/// <summary>
/// Gets local time value comparable to NetTime.Now from a remote value
/// </summary>
public double GetLocalTime(double remoteTimestamp)
{
return remoteTimestamp - m_remoteTimeOffset;
}
/// <summary>
/// Gets the remote time value for a local time value produced by NetTime.Now
/// </summary>
public double GetRemoteTime(double localTimestamp)
{
return localTimestamp + m_remoteTimeOffset;
}
internal void InitializePing()
{
float now = (float)NetTime.Now;
// randomize ping sent time (0.25 - 1.0 x ping interval)
m_sentPingTime = now;
m_sentPingTime -= (m_peerConfiguration.PingInterval * 0.25f); // delay ping for a little while
m_sentPingTime -= (NetRandom.Instance.NextSingle() * (m_peerConfiguration.PingInterval * 0.75f));
m_timeoutDeadline = now + (m_peerConfiguration.m_connectionTimeout * 2.0f); // initially allow a little more time
// make it better, quick :-)
SendPing();
}
internal void SendPing()
{
m_peer.VerifyNetworkThread();
m_sentPingNumber++;
m_sentPingTime = (float)NetTime.Now;
NetOutgoingMessage om = m_peer.CreateMessage(1);
om.Write((byte)m_sentPingNumber); // truncating to 0-255
om.m_messageType = NetMessageType.Ping;
int len = om.Encode(m_peer.m_sendBuffer, 0, 0);
bool connectionReset;
m_peer.SendPacket(len, m_remoteEndPoint, 1, out connectionReset);
m_statistics.PacketSent(len, 1);
}
internal void SendPong(int pingNumber)
{
m_peer.VerifyNetworkThread();
NetOutgoingMessage om = m_peer.CreateMessage(5);
om.Write((byte)pingNumber);
om.Write((float)NetTime.Now); // we should update this value to reflect the exact point in time the packet is SENT
om.m_messageType = NetMessageType.Pong;
int len = om.Encode(m_peer.m_sendBuffer, 0, 0);
bool connectionReset;
m_peer.SendPacket(len, m_remoteEndPoint, 1, out connectionReset);
m_statistics.PacketSent(len, 1);
}
internal void ReceivedPong(float now, int pongNumber, float remoteSendTime)
{
if ((byte)pongNumber != (byte)m_sentPingNumber)
{
m_peer.LogVerbose("Ping/Pong mismatch; dropped message?");
return;
}
m_timeoutDeadline = now + m_peerConfiguration.m_connectionTimeout;
float rtt = now - m_sentPingTime;
NetException.Assert(rtt >= 0);
double diff = (remoteSendTime + (rtt / 2.0)) - now;
if (m_averageRoundtripTime < 0)
{
m_remoteTimeOffset = diff;
m_averageRoundtripTime = rtt;
m_peer.LogDebug("Initiated average roundtrip time to " + NetTime.ToReadable(m_averageRoundtripTime) + " Remote time is: " + (now + diff));
}
else
{
m_averageRoundtripTime = (m_averageRoundtripTime * 0.7f) + (float)(rtt * 0.3f);
m_remoteTimeOffset = ((m_remoteTimeOffset * (double)(m_sentPingNumber - 1)) + diff) / (double)m_sentPingNumber;
m_peer.LogVerbose("Updated average roundtrip time to " + NetTime.ToReadable(m_averageRoundtripTime) + ", remote time to " + (now + m_remoteTimeOffset) + " (ie. diff " + m_remoteTimeOffset + ")");
}
// update resend delay for all channels
float resendDelay = GetResendDelay();
foreach (var chan in m_sendChannels)
{
var rchan = chan as NetReliableSenderChannel;
if (rchan != null)
rchan.m_resendDelay = resendDelay;
}
// m_peer.LogVerbose("Timeout deadline pushed to " + m_timeoutDeadline);
// notify the application that average rtt changed
if (m_peer.m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.ConnectionLatencyUpdated))
{
NetIncomingMessage update = m_peer.CreateIncomingMessage(NetIncomingMessageType.ConnectionLatencyUpdated, 4);
update.m_senderConnection = this;
update.m_senderEndPoint = this.m_remoteEndPoint;
update.Write(rtt);
m_peer.ReleaseMessage(update);
}
}
}
}

View File

@@ -1,175 +0,0 @@
using System;
namespace Lidgren.Network
{
public partial class NetConnection
{
private enum ExpandMTUStatus
{
None,
InProgress,
Finished
}
private const int c_protocolMaxMTU = (int)((((float)ushort.MaxValue / 8.0f) - 1.0f));
private ExpandMTUStatus m_expandMTUStatus;
private int m_largestSuccessfulMTU;
private int m_smallestFailedMTU;
private int m_lastSentMTUAttemptSize;
private double m_lastSentMTUAttemptTime;
private int m_mtuAttemptFails;
internal int m_currentMTU;
internal void InitExpandMTU(double now)
{
m_lastSentMTUAttemptTime = now + m_peerConfiguration.m_expandMTUFrequency + 1.5f + m_averageRoundtripTime; // wait a tiny bit before starting to expand mtu
m_largestSuccessfulMTU = 512;
m_smallestFailedMTU = -1;
m_currentMTU = m_peerConfiguration.MaximumTransmissionUnit;
}
private void MTUExpansionHeartbeat(double now)
{
if (m_expandMTUStatus == ExpandMTUStatus.Finished)
return;
if (m_expandMTUStatus == ExpandMTUStatus.None)
{
if (m_peerConfiguration.m_autoExpandMTU == false)
{
FinalizeMTU(m_currentMTU);
return;
}
// begin expansion
ExpandMTU(now, true);
return;
}
if (now > m_lastSentMTUAttemptTime + m_peerConfiguration.ExpandMTUFrequency)
{
m_mtuAttemptFails++;
if (m_mtuAttemptFails == 3)
{
FinalizeMTU(m_currentMTU);
return;
}
// timed out; ie. failed
m_smallestFailedMTU = m_lastSentMTUAttemptSize;
ExpandMTU(now, false);
}
}
private void ExpandMTU(double now, bool succeeded)
{
int tryMTU;
// we've nevered encountered failure
if (m_smallestFailedMTU == -1)
{
// we've never encountered failure; expand by 25% each time
tryMTU = (int)((float)m_currentMTU * 1.25f);
//m_peer.LogDebug("Trying MTU " + tryMTU);
}
else
{
// we HAVE encountered failure; so try in between
tryMTU = (int)(((float)m_smallestFailedMTU + (float)m_largestSuccessfulMTU) / 2.0f);
//m_peer.LogDebug("Trying MTU " + m_smallestFailedMTU + " <-> " + m_largestSuccessfulMTU + " = " + tryMTU);
}
if (tryMTU > c_protocolMaxMTU)
tryMTU = c_protocolMaxMTU;
if (tryMTU == m_largestSuccessfulMTU)
{
//m_peer.LogDebug("Found optimal MTU - exiting");
FinalizeMTU(m_largestSuccessfulMTU);
return;
}
SendExpandMTU(now, tryMTU);
}
private void SendExpandMTU(double now, int size)
{
NetOutgoingMessage om = m_peer.CreateMessage(size);
byte[] tmp = new byte[size];
om.Write(tmp);
om.m_messageType = NetMessageType.ExpandMTURequest;
int len = om.Encode(m_peer.m_sendBuffer, 0, 0);
bool ok = m_peer.SendMTUPacket(len, m_remoteEndPoint);
if (ok == false)
{
//m_peer.LogDebug("Send MTU failed for size " + size);
// failure
if (m_smallestFailedMTU == -1 || size < m_smallestFailedMTU)
{
m_smallestFailedMTU = size;
m_mtuAttemptFails++;
if (m_mtuAttemptFails >= m_peerConfiguration.ExpandMTUFailAttempts)
{
FinalizeMTU(m_largestSuccessfulMTU);
return;
}
}
ExpandMTU(now, false);
return;
}
m_lastSentMTUAttemptSize = size;
m_lastSentMTUAttemptTime = now;
m_statistics.PacketSent(len, 1);
}
private void FinalizeMTU(int size)
{
if (m_expandMTUStatus == ExpandMTUStatus.Finished)
return;
m_expandMTUStatus = ExpandMTUStatus.Finished;
m_currentMTU = size;
if (m_currentMTU != m_peerConfiguration.m_maximumTransmissionUnit)
m_peer.LogDebug("Expanded Maximum Transmission Unit to: " + m_currentMTU + " bytes");
return;
}
private void SendMTUSuccess(int size)
{
NetOutgoingMessage om = m_peer.CreateMessage(4);
om.Write(size);
om.m_messageType = NetMessageType.ExpandMTUSuccess;
int len = om.Encode(m_peer.m_sendBuffer, 0, 0);
bool connectionReset;
m_peer.SendPacket(len, m_remoteEndPoint, 1, out connectionReset);
// m_peer.LogDebug("Received MTU expand request for " + size + " bytes");
m_statistics.PacketSent(len, 1);
}
private void HandleExpandMTUSuccess(double now, int size)
{
if (size > m_largestSuccessfulMTU)
m_largestSuccessfulMTU = size;
if (size < m_currentMTU)
{
//m_peer.LogDebug("Received low MTU expand success (size " + size + "); current mtu is " + m_currentMTU);
return;
}
//m_peer.LogDebug("Expanding MTU to " + size);
m_currentMTU = size;
ExpandMTU(now, true);
}
}
}

View File

@@ -1,505 +0,0 @@
using System;
using System.Net;
using System.Threading;
using System.Diagnostics;
namespace Lidgren.Network
{
/// <summary>
/// Represents a connection to a remote peer
/// </summary>
[DebuggerDisplay("RemoteUniqueIdentifier={RemoteUniqueIdentifier} RemoteEndPoint={remoteEndPoint}")]
public partial class NetConnection
{
internal NetPeer m_peer;
internal NetPeerConfiguration m_peerConfiguration;
internal NetConnectionStatus m_status;
internal NetConnectionStatus m_visibleStatus;
internal IPEndPoint m_remoteEndPoint;
internal NetSenderChannelBase[] m_sendChannels;
internal NetReceiverChannelBase[] m_receiveChannels;
internal NetOutgoingMessage m_localHailMessage;
internal long m_remoteUniqueIdentifier;
internal NetQueue<NetTuple<NetMessageType, int>> m_queuedOutgoingAcks;
internal NetQueue<NetTuple<NetMessageType, int>> m_queuedIncomingAcks;
private int m_sendBufferWritePtr;
private int m_sendBufferNumMessages;
private object m_tag;
internal NetConnectionStatistics m_statistics;
/// <summary>
/// Gets or sets the application defined object containing data about the connection
/// </summary>
public object Tag
{
get { return m_tag; }
set { m_tag = value; }
}
/// <summary>
/// Gets the peer which holds this connection
/// </summary>
public NetPeer Peer { get { return m_peer; } }
/// <summary>
/// Gets the current status of the connection (synced to the last status message read)
/// </summary>
public NetConnectionStatus Status { get { return m_visibleStatus; } }
/// <summary>
/// Gets various statistics for this connection
/// </summary>
public NetConnectionStatistics Statistics { get { return m_statistics; } }
/// <summary>
/// Gets the remote endpoint for the connection
/// </summary>
public IPEndPoint RemoteEndPoint { get { return m_remoteEndPoint; } }
/// <summary>
/// Gets the unique identifier of the remote NetPeer for this connection
/// </summary>
public long RemoteUniqueIdentifier { get { return m_remoteUniqueIdentifier; } }
/// <summary>
/// Gets the local hail message that was sent as part of the handshake
/// </summary>
public NetOutgoingMessage LocalHailMessage { get { return m_localHailMessage; } }
// gets the time before automatically resending an unacked message
internal float GetResendDelay()
{
float avgRtt = m_averageRoundtripTime;
if (avgRtt <= 0)
avgRtt = 0.1f; // "default" resend is based on 100 ms roundtrip time
return 0.02f + (avgRtt * 2.0f); // 20 ms + double rtt
}
internal NetConnection(NetPeer peer, IPEndPoint remoteEndPoint)
{
m_peer = peer;
m_peerConfiguration = m_peer.Configuration;
m_status = NetConnectionStatus.None;
m_visibleStatus = NetConnectionStatus.None;
m_remoteEndPoint = remoteEndPoint;
m_sendChannels = new NetSenderChannelBase[NetConstants.NumTotalChannels];
m_receiveChannels = new NetReceiverChannelBase[NetConstants.NumTotalChannels];
m_queuedOutgoingAcks = new NetQueue<NetTuple<NetMessageType, int>>(4);
m_queuedIncomingAcks = new NetQueue<NetTuple<NetMessageType, int>>(4);
m_statistics = new NetConnectionStatistics(this);
m_averageRoundtripTime = -1.0f;
m_currentMTU = m_peerConfiguration.MaximumTransmissionUnit;
}
/// <summary>
/// Change the internal endpoint to this new one. Used when, during handshake, a switch in port is detected (due to NAT)
/// </summary>
internal void MutateEndPoint(IPEndPoint endPoint)
{
m_remoteEndPoint = endPoint;
}
internal void SetStatus(NetConnectionStatus status, string reason)
{
// user or library thread
if (status == m_status)
return;
m_status = status;
if (reason == null)
reason = string.Empty;
if (m_status == NetConnectionStatus.Connected)
{
m_timeoutDeadline = (float)NetTime.Now + m_peerConfiguration.m_connectionTimeout;
m_peer.LogVerbose("Timeout deadline initialized to " + m_timeoutDeadline);
}
if (m_peerConfiguration.IsMessageTypeEnabled(NetIncomingMessageType.StatusChanged))
{
NetIncomingMessage info = m_peer.CreateIncomingMessage(NetIncomingMessageType.StatusChanged, 4 + reason.Length + (reason.Length > 126 ? 2 : 1));
info.m_senderConnection = this;
info.m_senderEndPoint = m_remoteEndPoint;
info.Write((byte)m_status);
info.Write(reason);
m_peer.ReleaseMessage(info);
}
else
{
// app dont want those messages, update visible status immediately
m_visibleStatus = m_status;
}
}
internal void Heartbeat(float now, uint frameCounter)
{
m_peer.VerifyNetworkThread();
NetException.Assert(m_status != NetConnectionStatus.InitiatedConnect && m_status != NetConnectionStatus.RespondedConnect);
if ((frameCounter % 5) == 0)
{
if (now > m_timeoutDeadline)
{
//
// connection timed out
//
m_peer.LogVerbose("Connection timed out at " + now + " deadline was " + m_timeoutDeadline);
ExecuteDisconnect("Connection timed out", true);
}
// send ping?
if (m_status == NetConnectionStatus.Connected)
{
if (now > m_sentPingTime + m_peer.m_configuration.m_pingInterval)
SendPing();
// handle expand mtu
MTUExpansionHeartbeat(now);
}
if (m_disconnectRequested)
{
ExecuteDisconnect(m_disconnectMessage, true);
return;
}
}
bool connectionReset; // TODO: handle connection reset
//
// Note: at this point m_sendBufferWritePtr and m_sendBufferNumMessages may be non-null; resends may already be queued up
//
byte[] sendBuffer = m_peer.m_sendBuffer;
int mtu = m_currentMTU;
if ((frameCounter % 3) == 0) // coalesce a few frames
{
//
// send ack messages
//
while (m_queuedOutgoingAcks.Count > 0)
{
int acks = (mtu - (m_sendBufferWritePtr + 5)) / 3; // 3 bytes per actual ack
if (acks > m_queuedOutgoingAcks.Count)
acks = m_queuedOutgoingAcks.Count;
NetException.Assert(acks > 0);
m_sendBufferNumMessages++;
// write acks header
sendBuffer[m_sendBufferWritePtr++] = (byte)NetMessageType.Acknowledge;
sendBuffer[m_sendBufferWritePtr++] = 0; // no sequence number
sendBuffer[m_sendBufferWritePtr++] = 0; // no sequence number
int len = (acks * 3) * 8; // bits
sendBuffer[m_sendBufferWritePtr++] = (byte)len;
sendBuffer[m_sendBufferWritePtr++] = (byte)(len >> 8);
// write acks
for (int i = 0; i < acks; i++)
{
NetTuple<NetMessageType, int> tuple;
m_queuedOutgoingAcks.TryDequeue(out tuple);
//m_peer.LogVerbose("Sending ack for " + tuple.Item1 + "#" + tuple.Item2);
sendBuffer[m_sendBufferWritePtr++] = (byte)tuple.Item1;
sendBuffer[m_sendBufferWritePtr++] = (byte)tuple.Item2;
sendBuffer[m_sendBufferWritePtr++] = (byte)(tuple.Item2 >> 8);
}
if (m_queuedOutgoingAcks.Count > 0)
{
// send packet and go for another round of acks
NetException.Assert(m_sendBufferWritePtr > 0 && m_sendBufferNumMessages > 0);
m_peer.SendPacket(m_sendBufferWritePtr, m_remoteEndPoint, m_sendBufferNumMessages, out connectionReset);
m_statistics.PacketSent(m_sendBufferWritePtr, 1);
m_sendBufferWritePtr = 0;
m_sendBufferNumMessages = 0;
}
}
//
// Parse incoming acks (may trigger resends)
//
NetTuple<NetMessageType, int> incAck;
while (m_queuedIncomingAcks.TryDequeue(out incAck))
{
//m_peer.LogVerbose("Received ack for " + acktp + "#" + seqNr);
NetSenderChannelBase chan = m_sendChannels[(int)incAck.Item1 - 1];
if (chan == null)
chan = CreateSenderChannel(incAck.Item1);
chan.ReceiveAcknowledge(now, incAck.Item2);
}
}
//
// send queued messages
//
if (m_peer.m_executeFlushSendQueue)
{
for (int i = m_sendChannels.Length - 1; i >= 0; i--) // Reverse order so reliable messages are sent first
{
var channel = m_sendChannels[i];
NetException.Assert(m_sendBufferWritePtr < 1 || m_sendBufferNumMessages > 0);
if (channel != null)
channel.SendQueuedMessages(now);
NetException.Assert(m_sendBufferWritePtr < 1 || m_sendBufferNumMessages > 0);
}
}
//
// Put on wire data has been written to send buffer but not yet sent
//
if (m_sendBufferWritePtr > 0)
{
m_peer.VerifyNetworkThread();
NetException.Assert(m_sendBufferWritePtr > 0 && m_sendBufferNumMessages > 0);
m_peer.SendPacket(m_sendBufferWritePtr, m_remoteEndPoint, m_sendBufferNumMessages, out connectionReset);
m_statistics.PacketSent(m_sendBufferWritePtr, m_sendBufferNumMessages);
m_sendBufferWritePtr = 0;
m_sendBufferNumMessages = 0;
}
}
// Queue an item for immediate sending on the wire
// This method is called from the ISenderChannels
internal void QueueSendMessage(NetOutgoingMessage om, int seqNr)
{
m_peer.VerifyNetworkThread();
int sz = om.GetEncodedSize();
if (sz > m_currentMTU)
m_peer.LogWarning("Message larger than MTU! Fragmentation must have failed!");
if (m_sendBufferWritePtr + sz > m_currentMTU)
{
bool connReset; // TODO: handle connection reset
NetException.Assert(m_sendBufferWritePtr > 0 && m_sendBufferNumMessages > 0); // or else the message should have been fragmented earlier
m_peer.SendPacket(m_sendBufferWritePtr, m_remoteEndPoint, m_sendBufferNumMessages, out connReset);
m_statistics.PacketSent(m_sendBufferWritePtr, m_sendBufferNumMessages);
m_sendBufferWritePtr = 0;
m_sendBufferNumMessages = 0;
}
m_sendBufferWritePtr = om.Encode(m_peer.m_sendBuffer, m_sendBufferWritePtr, seqNr);
m_sendBufferNumMessages++;
NetException.Assert(m_sendBufferWritePtr > 0, "Encoded zero size message?");
NetException.Assert(m_sendBufferNumMessages > 0);
}
/// <summary>
/// Send a message to this remote connection
/// </summary>
/// <param name="msg">The message to send</param>
/// <param name="method">How to deliver the message</param>
/// <param name="sequenceChannel">Sequence channel within the delivery method</param>
public NetSendResult SendMessage(NetOutgoingMessage msg, NetDeliveryMethod method, int sequenceChannel)
{
return m_peer.SendMessage(msg, this, method, sequenceChannel);
}
// called by SendMessage() and NetPeer.SendMessage; ie. may be user thread
internal NetSendResult EnqueueMessage(NetOutgoingMessage msg, NetDeliveryMethod method, int sequenceChannel)
{
if (m_status != NetConnectionStatus.Connected)
return NetSendResult.FailedNotConnected;
NetMessageType tp = (NetMessageType)((int)method + sequenceChannel);
msg.m_messageType = tp;
// TODO: do we need to make this more thread safe?
int channelSlot = (int)method - 1 + sequenceChannel;
NetSenderChannelBase chan = m_sendChannels[channelSlot];
if (chan == null)
chan = CreateSenderChannel(tp);
if (msg.GetEncodedSize() > m_currentMTU)
throw new NetException("Message too large! Fragmentation failure?");
var retval = chan.Enqueue(msg);
if (retval == NetSendResult.Sent && m_peerConfiguration.m_autoFlushSendQueue == false)
retval = NetSendResult.Queued; // queued since we're not autoflushing
return retval;
}
// may be on user thread
private NetSenderChannelBase CreateSenderChannel(NetMessageType tp)
{
NetSenderChannelBase chan;
lock (m_sendChannels)
{
NetDeliveryMethod method = NetUtility.GetDeliveryMethod(tp);
int sequenceChannel = (int)tp - (int)method;
int channelSlot = (int)method - 1 + sequenceChannel;
if (m_sendChannels[channelSlot] != null)
{
// we were pre-empted by another call to this method
chan = m_sendChannels[channelSlot];
}
else
{
switch (method)
{
case NetDeliveryMethod.Unreliable:
case NetDeliveryMethod.UnreliableSequenced:
chan = new NetUnreliableSenderChannel(this, NetUtility.GetWindowSize(method));
break;
case NetDeliveryMethod.ReliableOrdered:
chan = new NetReliableSenderChannel(this, NetUtility.GetWindowSize(method));
break;
case NetDeliveryMethod.ReliableSequenced:
case NetDeliveryMethod.ReliableUnordered:
default:
chan = new NetReliableSenderChannel(this, NetUtility.GetWindowSize(method));
break;
}
m_sendChannels[channelSlot] = chan;
}
}
return chan;
}
// received a library message while Connected
internal void ReceivedLibraryMessage(NetMessageType tp, int ptr, int payloadLength)
{
m_peer.VerifyNetworkThread();
float now = (float)NetTime.Now;
switch (tp)
{
case NetMessageType.Disconnect:
NetIncomingMessage msg = m_peer.SetupReadHelperMessage(ptr, payloadLength);
ExecuteDisconnect(msg.ReadString(), false);
break;
case NetMessageType.Acknowledge:
for (int i = 0; i < payloadLength; i+=3)
{
NetMessageType acktp = (NetMessageType)m_peer.m_receiveBuffer[ptr++]; // netmessagetype
int seqNr = m_peer.m_receiveBuffer[ptr++];
seqNr |= (m_peer.m_receiveBuffer[ptr++] << 8);
// need to enqueue this and handle it in the netconnection heartbeat; so be able to send resends together with normal sends
m_queuedIncomingAcks.Enqueue(new NetTuple<NetMessageType, int>(acktp, seqNr));
}
break;
case NetMessageType.Ping:
int pingNr = m_peer.m_receiveBuffer[ptr++];
SendPong(pingNr);
break;
case NetMessageType.Pong:
NetIncomingMessage pmsg = m_peer.SetupReadHelperMessage(ptr, payloadLength);
int pongNr = pmsg.ReadByte();
float remoteSendTime = pmsg.ReadSingle();
ReceivedPong(now, pongNr, remoteSendTime);
break;
case NetMessageType.ExpandMTURequest:
SendMTUSuccess(payloadLength);
break;
case NetMessageType.ExpandMTUSuccess:
NetIncomingMessage emsg = m_peer.SetupReadHelperMessage(ptr, payloadLength);
int size = emsg.ReadInt32();
HandleExpandMTUSuccess(now, size);
break;
default:
m_peer.LogWarning("Connection received unhandled library message: " + tp);
break;
}
}
internal void ReceivedMessage(NetIncomingMessage msg)
{
m_peer.VerifyNetworkThread();
NetMessageType tp = msg.m_receivedMessageType;
int channelSlot = (int)tp - 1;
NetReceiverChannelBase chan = m_receiveChannels[channelSlot];
if (chan == null)
chan = CreateReceiverChannel(tp);
chan.ReceiveMessage(msg);
}
private NetReceiverChannelBase CreateReceiverChannel(NetMessageType tp)
{
m_peer.VerifyNetworkThread();
// create receiver channel
NetReceiverChannelBase chan;
NetDeliveryMethod method = NetUtility.GetDeliveryMethod(tp);
switch (method)
{
case NetDeliveryMethod.Unreliable:
chan = new NetUnreliableUnorderedReceiver(this);
break;
case NetDeliveryMethod.ReliableOrdered:
chan = new NetReliableOrderedReceiver(this, NetConstants.ReliableOrderedWindowSize);
break;
case NetDeliveryMethod.UnreliableSequenced:
chan = new NetUnreliableSequencedReceiver(this);
break;
case NetDeliveryMethod.ReliableUnordered:
chan = new NetReliableUnorderedReceiver(this, NetConstants.ReliableOrderedWindowSize);
break;
case NetDeliveryMethod.ReliableSequenced:
chan = new NetReliableSequencedReceiver(this, NetConstants.ReliableSequencedWindowSize);
break;
default:
throw new NetException("Unhandled NetDeliveryMethod!");
}
int channelSlot = (int)tp - 1;
NetException.Assert(m_receiveChannels[channelSlot] == null);
m_receiveChannels[channelSlot] = chan;
return chan;
}
internal void QueueAck(NetMessageType tp, int sequenceNumber)
{
m_queuedOutgoingAcks.Enqueue(new NetTuple<NetMessageType, int>(tp, sequenceNumber));
}
/// <summary>
/// Zero windowSize indicates that the channel is not yet instantiated (used)
/// Negative freeWindowSlots means this amount of messages are currently queued but delayed due to closed window
/// </summary>
public void GetSendQueueInfo(NetDeliveryMethod method, int sequenceChannel, out int windowSize, out int freeWindowSlots)
{
int channelSlot = (int)method - 1 + sequenceChannel;
var chan = m_sendChannels[channelSlot];
if (chan == null)
{
windowSize = NetUtility.GetWindowSize(method);
freeWindowSlots = windowSize;
return;
}
windowSize = chan.WindowSize;
freeWindowSlots = chan.GetAllowedSends() - chan.m_queuedSends.Count;
return;
}
internal void Shutdown(string reason)
{
ExecuteDisconnect(reason, true);
}
/// <summary>
/// Returns a string that represents this object
/// </summary>
public override string ToString()
{
return "[NetConnection to " + m_remoteEndPoint + "]";
}
}
}

View File

@@ -1,204 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
// Uncomment the line below to get statistics in RELEASE builds
#define USE_RELEASE_STATISTICS
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
namespace Lidgren.Network
{
internal enum MessageResendReason
{
Delay,
HoleInSequence
}
/// <summary>
/// Statistics for a NetConnection instance
/// </summary>
public sealed class NetConnectionStatistics
{
private readonly NetConnection m_connection;
internal int m_sentPackets;
internal int m_receivedPackets;
internal int m_sentMessages;
internal int m_receivedMessages;
internal int m_sentBytes;
internal int m_receivedBytes;
internal int m_resentMessagesDueToDelay;
internal int m_resentMessagesDueToHole;
internal NetConnectionStatistics(NetConnection conn)
{
m_connection = conn;
Reset();
}
internal void Reset()
{
m_sentPackets = 0;
m_receivedPackets = 0;
m_sentBytes = 0;
m_receivedBytes = 0;
}
/// <summary>
/// Gets the number of sent packets for this connection
/// </summary>
public int SentPackets { get { return m_sentPackets; } }
/// <summary>
/// Gets the number of received packets for this connection
/// </summary>
public int ReceivedPackets { get { return m_receivedPackets; } }
/// <summary>
/// Gets the number of sent bytes for this connection
/// </summary>
public int SentBytes { get { return m_sentBytes; } }
/// <summary>
/// Gets the number of received bytes for this connection
/// </summary>
public int ReceivedBytes { get { return m_receivedBytes; } }
/// <summary>
/// Gets the number of resent reliable messages for this connection
/// </summary>
public int ResentMessages { get { return m_resentMessagesDueToHole + m_resentMessagesDueToDelay; } }
// public double LastSendRespondedTo { get { return m_connection.m_lastSendRespondedTo; } }
#if USE_RELEASE_STATISTICS
internal void PacketSent(int numBytes, int numMessages)
{
NetException.Assert(numBytes > 0 && numMessages > 0);
m_sentPackets++;
m_sentBytes += numBytes;
m_sentMessages += numMessages;
}
#else
[Conditional("DEBUG")]
internal void PacketSent(int numBytes, int numMessages)
{
NetException.Assert(numBytes > 0 && numMessages > 0);
m_sentPackets++;
m_sentBytes += numBytes;
m_sentMessages += numMessages;
}
#endif
#if USE_RELEASE_STATISTICS
internal void PacketReceived(int numBytes, int numMessages)
{
NetException.Assert(numBytes > 0 && numMessages > 0);
m_receivedPackets++;
m_receivedBytes += numBytes;
m_receivedMessages += numMessages;
}
#else
[Conditional("DEBUG")]
internal void PacketReceived(int numBytes, int numMessages)
{
NetException.Assert(numBytes > 0 && numMessages > 0);
m_receivedPackets++;
m_receivedBytes += numBytes;
m_receivedMessages += numMessages;
}
#endif
#if USE_RELEASE_STATISTICS
internal void MessageResent(MessageResendReason reason)
{
if (reason == MessageResendReason.Delay)
m_resentMessagesDueToDelay++;
else
m_resentMessagesDueToHole++;
}
#else
[Conditional("DEBUG")]
internal void MessageResent(MessageResendReason reason)
{
if (reason == MessageResendReason.Delay)
m_resentMessagesDueToDelay++;
else
m_resentMessagesDueToHole++;
}
#endif
/// <summary>
/// Returns a string that represents this object
/// </summary>
public override string ToString()
{
StringBuilder bdr = new StringBuilder();
//bdr.AppendLine("Average roundtrip time: " + NetTime.ToReadable(m_connection.m_averageRoundtripTime));
bdr.AppendLine("Sent " + m_sentBytes + " bytes in " + m_sentMessages + " messages in " + m_sentPackets + " packets");
bdr.AppendLine("Received " + m_receivedBytes + " bytes in " + m_receivedMessages + " messages in " + m_receivedPackets + " packets");
if (m_resentMessagesDueToDelay > 0)
bdr.AppendLine("Resent messages (delay): " + m_resentMessagesDueToDelay);
if (m_resentMessagesDueToDelay > 0)
bdr.AppendLine("Resent messages (holes): " + m_resentMessagesDueToHole);
int numUnsent = 0;
int numStored = 0;
foreach (NetSenderChannelBase sendChan in m_connection.m_sendChannels)
{
if (sendChan == null)
continue;
numUnsent += sendChan.m_queuedSends.Count;
var relSendChan = sendChan as NetReliableSenderChannel;
if (relSendChan != null)
{
for (int i = 0; i < relSendChan.m_storedMessages.Length; i++)
if (relSendChan.m_storedMessages[i].Message != null)
numStored++;
}
}
int numWithheld = 0;
foreach (NetReceiverChannelBase recChan in m_connection.m_receiveChannels)
{
var relRecChan = recChan as NetReliableOrderedReceiver;
if (relRecChan != null)
{
for (int i = 0; i < relRecChan.m_withheldMessages.Length; i++)
if (relRecChan.m_withheldMessages[i] != null)
numWithheld++;
}
}
bdr.AppendLine("Unsent messages: " + numUnsent);
bdr.AppendLine("Stored messages: " + numStored);
bdr.AppendLine("Withheld messages: " + numWithheld);
return bdr.ToString();
}
}
}

View File

@@ -1,68 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
namespace Lidgren.Network
{
/// <summary>
/// Status for a NetConnection instance
/// </summary>
public enum NetConnectionStatus
{
/// <summary>
/// No connection, or attempt, in place
/// </summary>
None,
/// <summary>
/// Connect has been sent; waiting for ConnectResponse
/// </summary>
InitiatedConnect,
/// <summary>
/// Connect was received, but ConnectResponse hasn't been sent yet
/// </summary>
ReceivedInitiation,
/// <summary>
/// Connect was received and ApprovalMessage released to the application; awaiting Approve() or Deny()
/// </summary>
RespondedAwaitingApproval, // We got Connect, released ApprovalMessage
/// <summary>
/// Connect was received and ConnectResponse has been sent; waiting for ConnectionEstablished
/// </summary>
RespondedConnect, // we got Connect, sent ConnectResponse
/// <summary>
/// Connected
/// </summary>
Connected, // we received ConnectResponse (if initiator) or ConnectionEstablished (if passive)
/// <summary>
/// In the process of disconnecting
/// </summary>
Disconnecting,
/// <summary>
/// Disconnected
/// </summary>
Disconnected
}
}

View File

@@ -1,57 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
namespace Lidgren.Network
{
/// <summary>
/// All the constants used when compiling the library
/// </summary>
internal static class NetConstants
{
internal const int NumTotalChannels = 99;
internal const int NetChannelsPerDeliveryMethod = 32;
internal const int NumSequenceNumbers = 1024;
internal const int HeaderByteSize = 5;
internal const int UnreliableWindowSize = 128;
internal const int ReliableOrderedWindowSize = 64;
internal const int ReliableSequencedWindowSize = 64;
internal const int DefaultWindowSize = 64;
internal const int MaxFragmentationGroups = ushort.MaxValue - 1;
internal const int UnfragmentedMessageHeaderSize = 5;
/// <summary>
/// Number of channels which needs a sequence number to work
/// </summary>
internal const int NumSequencedChannels = ((int)NetMessageType.UserReliableOrdered1 + NetConstants.NetChannelsPerDeliveryMethod) - (int)NetMessageType.UserSequenced1;
/// <summary>
/// Number of reliable channels
/// </summary>
internal const int NumReliableChannels = ((int)NetMessageType.UserReliableOrdered1 + NetConstants.NetChannelsPerDeliveryMethod) - (int)NetMessageType.UserReliableUnordered;
internal const string ConnResetMessage = "Connection was reset by remote host";
}
}

View File

@@ -1,46 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Lidgren.Network
{
/// <summary>
/// How the library deals with resends and handling of late messages
/// </summary>
public enum NetDeliveryMethod : byte
{
//
// Actually a publicly visible subset of NetMessageType
//
/// <summary>
/// Indicates an error
/// </summary>
Unknown = 0,
/// <summary>
/// Unreliable, unordered delivery
/// </summary>
Unreliable = 1,
/// <summary>
/// Unreliable delivery, but automatically dropping late messages
/// </summary>
UnreliableSequenced = 2,
/// <summary>
/// Reliable delivery, but unordered
/// </summary>
ReliableUnordered = 34,
/// <summary>
/// Reliable delivery, except for late messages which are dropped
/// </summary>
ReliableSequenced = 35,
/// <summary>
/// Reliable, ordered delivery
/// </summary>
ReliableOrdered = 67,
}
}

View File

@@ -1,83 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Diagnostics;
using System.Runtime.Serialization;
namespace Lidgren.Network
{
/// <summary>
/// Exception thrown in the Lidgren Network Library
/// </summary>
[Serializable]
public sealed class NetException : Exception
{
/// <summary>
/// NetException constructor
/// </summary>
public NetException()
: base()
{
}
/// <summary>
/// NetException constructor
/// </summary>
public NetException(string message)
: base(message)
{
}
/// <summary>
/// NetException constructor
/// </summary>
public NetException(string message, Exception inner)
: base(message, inner)
{
}
/// <summary>
/// NetException constructor
/// </summary>
private NetException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
/// <summary>
/// Throws an exception, in DEBUG only, if first parameter is false
/// </summary>
[Conditional("DEBUG")]
public static void Assert(bool isOk, string message)
{
if (!isOk)
throw new NetException(message);
}
/// <summary>
/// Throws an exception, in DEBUG only, if first parameter is false
/// </summary>
[Conditional("DEBUG")]
public static void Assert(bool isOk)
{
if (!isOk)
throw new NetException();
}
}
}

View File

@@ -1,174 +0,0 @@
using System;
namespace Lidgren.Network
{
internal static class NetFragmentationHelper
{
internal static int WriteHeader(
byte[] destination,
int ptr,
int group,
int totalBits,
int chunkByteSize,
int chunkNumber)
{
uint num1 = (uint)group;
while (num1 >= 0x80)
{
destination[ptr++] = (byte)(num1 | 0x80);
num1 = num1 >> 7;
}
destination[ptr++] = (byte)num1;
// write variable length fragment total bits
uint num2 = (uint)totalBits;
while (num2 >= 0x80)
{
destination[ptr++] = (byte)(num2 | 0x80);
num2 = num2 >> 7;
}
destination[ptr++] = (byte)num2;
// write variable length fragment chunk size
uint num3 = (uint)chunkByteSize;
while (num3 >= 0x80)
{
destination[ptr++] = (byte)(num3 | 0x80);
num3 = num3 >> 7;
}
destination[ptr++] = (byte)num3;
// write variable length fragment chunk number
uint num4 = (uint)chunkNumber;
while (num4 >= 0x80)
{
destination[ptr++] = (byte)(num4 | 0x80);
num4 = num4 >> 7;
}
destination[ptr++] = (byte)num4;
return ptr;
}
internal static int ReadHeader(byte[] buffer, int ptr, out int group, out int totalBits, out int chunkByteSize, out int chunkNumber)
{
int num1 = 0;
int num2 = 0;
while (true)
{
byte num3 = buffer[ptr++];
num1 |= (num3 & 0x7f) << (num2 & 0x1f);
num2 += 7;
if ((num3 & 0x80) == 0)
{
group = num1;
break;
}
}
num1 = 0;
num2 = 0;
while (true)
{
byte num3 = buffer[ptr++];
num1 |= (num3 & 0x7f) << (num2 & 0x1f);
num2 += 7;
if ((num3 & 0x80) == 0)
{
totalBits = num1;
break;
}
}
num1 = 0;
num2 = 0;
while (true)
{
byte num3 = buffer[ptr++];
num1 |= (num3 & 0x7f) << (num2 & 0x1f);
num2 += 7;
if ((num3 & 0x80) == 0)
{
chunkByteSize = num1;
break;
}
}
num1 = 0;
num2 = 0;
while (true)
{
byte num3 = buffer[ptr++];
num1 |= (num3 & 0x7f) << (num2 & 0x1f);
num2 += 7;
if ((num3 & 0x80) == 0)
{
chunkNumber = num1;
break;
}
}
return ptr;
}
internal static int GetFragmentationHeaderSize(int groupId, int totalBytes, int chunkByteSize, int numChunks)
{
int len = 4;
// write variable length fragment group id
uint num1 = (uint)groupId;
while (num1 >= 0x80)
{
len++;
num1 = num1 >> 7;
}
// write variable length fragment total bits
uint num2 = (uint)(totalBytes * 8);
while (num2 >= 0x80)
{
len++;
num2 = num2 >> 7;
}
// write variable length fragment chunk byte size
uint num3 = (uint)chunkByteSize;
while (num3 >= 0x80)
{
len++;
num3 = num3 >> 7;
}
// write variable length fragment chunk number
uint num4 = (uint)numChunks;
while (num4 >= 0x80)
{
len++;
num4 = num4 >> 7;
}
return len;
}
internal static int GetBestChunkSize(int group, int totalBytes, int mtu)
{
int tryNumChunks = (totalBytes / (mtu - 8)) + 1;
int tryChunkSize = (totalBytes / tryNumChunks) + 1; // +1 since we immediately decrement it in the loop
int headerSize = 0;
do
{
tryChunkSize--; // keep reducing chunk size until it fits within MTU including header
int numChunks = totalBytes / tryChunkSize;
if (numChunks * tryChunkSize < totalBytes)
numChunks++;
headerSize = GetFragmentationHeaderSize(group, totalBytes, tryChunkSize, numChunks);
} while (tryChunkSize + headerSize + 5 + 1 >= mtu);
return tryChunkSize;
}
}
}

View File

@@ -1,12 +0,0 @@
using System;
namespace Lidgren.Network
{
public sealed class NetFragmentationInfo
{
public int TotalFragmentCount;
public bool[] Received;
public int TotalReceived;
public int FragmentSize;
}
}

View File

@@ -1,314 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Diagnostics;
using System.Net;
namespace Lidgren.Network
{
public partial class NetIncomingMessage
{
/// <summary>
/// Returns the internal data buffer, don't modify
/// </summary>
public byte[] PeekDataBuffer()
{
return m_data;
}
//
// 1 bit
//
/// <summary>
/// Reads a 1-bit Boolean without advancing the read pointer
/// </summary>
public bool PeekBoolean()
{
NetException.Assert(m_bitLength - m_readPosition >= 1, c_readOverflowError);
byte retval = NetBitWriter.ReadByte(m_data, 1, m_readPosition);
return (retval > 0 ? true : false);
}
//
// 8 bit
//
/// <summary>
/// Reads a Byte without advancing the read pointer
/// </summary>
public byte PeekByte()
{
NetException.Assert(m_bitLength - m_readPosition >= 8, c_readOverflowError);
byte retval = NetBitWriter.ReadByte(m_data, 8, m_readPosition);
return retval;
}
/// <summary>
/// Reads an SByte without advancing the read pointer
/// </summary>
[CLSCompliant(false)]
public sbyte PeekSByte()
{
NetException.Assert(m_bitLength - m_readPosition >= 8, c_readOverflowError);
byte retval = NetBitWriter.ReadByte(m_data, 8, m_readPosition);
return (sbyte)retval;
}
/// <summary>
/// Reads the specified number of bits into a Byte without advancing the read pointer
/// </summary>
public byte PeekByte(int numberOfBits)
{
byte retval = NetBitWriter.ReadByte(m_data, numberOfBits, m_readPosition);
return retval;
}
/// <summary>
/// Reads the specified number of bytes without advancing the read pointer
/// </summary>
public byte[] PeekBytes(int numberOfBytes)
{
NetException.Assert(m_bitLength - m_readPosition >= (numberOfBytes * 8), c_readOverflowError);
byte[] retval = new byte[numberOfBytes];
NetBitWriter.ReadBytes(m_data, numberOfBytes, m_readPosition, retval, 0);
return retval;
}
/// <summary>
/// Reads the specified number of bytes without advancing the read pointer
/// </summary>
public void PeekBytes(byte[] into, int offset, int numberOfBytes)
{
NetException.Assert(m_bitLength - m_readPosition >= (numberOfBytes * 8), c_readOverflowError);
NetException.Assert(offset + numberOfBytes <= into.Length);
NetBitWriter.ReadBytes(m_data, numberOfBytes, m_readPosition, into, offset);
return;
}
//
// 16 bit
//
/// <summary>
/// Reads an Int16 without advancing the read pointer
/// </summary>
public Int16 PeekInt16()
{
NetException.Assert(m_bitLength - m_readPosition >= 16, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt32(m_data, 16, m_readPosition);
return (short)retval;
}
/// <summary>
/// Reads a UInt16 without advancing the read pointer
/// </summary>
[CLSCompliant(false)]
public UInt16 PeekUInt16()
{
NetException.Assert(m_bitLength - m_readPosition >= 16, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt32(m_data, 16, m_readPosition);
return (ushort)retval;
}
//
// 32 bit
//
/// <summary>
/// Reads an Int32 without advancing the read pointer
/// </summary>
public Int32 PeekInt32()
{
NetException.Assert(m_bitLength - m_readPosition >= 32, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
return (Int32)retval;
}
/// <summary>
/// Reads the specified number of bits into an Int32 without advancing the read pointer
/// </summary>
public Int32 PeekInt32(int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 32), "ReadInt() can only read between 1 and 32 bits");
NetException.Assert(m_bitLength - m_readPosition >= numberOfBits, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt32(m_data, numberOfBits, m_readPosition);
if (numberOfBits == 32)
return (int)retval;
int signBit = 1 << (numberOfBits - 1);
if ((retval & signBit) == 0)
return (int)retval; // positive
// negative
unchecked
{
uint mask = ((uint)-1) >> (33 - numberOfBits);
uint tmp = (retval & mask) + 1;
return -((int)tmp);
}
}
/// <summary>
/// Reads a UInt32 without advancing the read pointer
/// </summary>
[CLSCompliant(false)]
public UInt32 PeekUInt32()
{
NetException.Assert(m_bitLength - m_readPosition >= 32, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
return retval;
}
/// <summary>
/// Reads the specified number of bits into a UInt32 without advancing the read pointer
/// </summary>
[CLSCompliant(false)]
public UInt32 PeekUInt32(int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 32), "ReadUInt() can only read between 1 and 32 bits");
//NetException.Assert(m_bitLength - m_readBitPtr >= numberOfBits, "tried to read past buffer size");
UInt32 retval = NetBitWriter.ReadUInt32(m_data, numberOfBits, m_readPosition);
return retval;
}
//
// 64 bit
//
/// <summary>
/// Reads a UInt64 without advancing the read pointer
/// </summary>
[CLSCompliant(false)]
public UInt64 PeekUInt64()
{
NetException.Assert(m_bitLength - m_readPosition >= 64, c_readOverflowError);
ulong low = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
ulong high = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition + 32);
ulong retval = low + (high << 32);
return retval;
}
/// <summary>
/// Reads an Int64 without advancing the read pointer
/// </summary>
public Int64 PeekInt64()
{
NetException.Assert(m_bitLength - m_readPosition >= 64, c_readOverflowError);
unchecked
{
ulong retval = PeekUInt64();
long longRetval = (long)retval;
return longRetval;
}
}
/// <summary>
/// Reads the specified number of bits into an UInt64 without advancing the read pointer
/// </summary>
[CLSCompliant(false)]
public UInt64 PeekUInt64(int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 64), "ReadUInt() can only read between 1 and 64 bits");
NetException.Assert(m_bitLength - m_readPosition >= numberOfBits, c_readOverflowError);
ulong retval;
if (numberOfBits <= 32)
{
retval = (ulong)NetBitWriter.ReadUInt32(m_data, numberOfBits, m_readPosition);
}
else
{
retval = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
retval |= NetBitWriter.ReadUInt32(m_data, numberOfBits - 32, m_readPosition) << 32;
}
return retval;
}
/// <summary>
/// Reads the specified number of bits into an Int64 without advancing the read pointer
/// </summary>
public Int64 PeekInt64(int numberOfBits)
{
NetException.Assert(((numberOfBits > 0) && (numberOfBits < 65)), "ReadInt64(bits) can only read between 1 and 64 bits");
return (long)PeekUInt64(numberOfBits);
}
//
// Floating point
//
/// <summary>
/// Reads a 32-bit Single without advancing the read pointer
/// </summary>
public float PeekFloat()
{
return PeekSingle();
}
/// <summary>
/// Reads a 32-bit Single without advancing the read pointer
/// </summary>
public float PeekSingle()
{
NetException.Assert(m_bitLength - m_readPosition >= 32, c_readOverflowError);
if ((m_readPosition & 7) == 0) // read directly
{
float retval = BitConverter.ToSingle(m_data, m_readPosition >> 3);
return retval;
}
byte[] bytes = PeekBytes(4);
return BitConverter.ToSingle(bytes, 0);
}
/// <summary>
/// Reads a 64-bit Double without advancing the read pointer
/// </summary>
public double PeekDouble()
{
NetException.Assert(m_bitLength - m_readPosition >= 64, c_readOverflowError);
if ((m_readPosition & 7) == 0) // read directly
{
// read directly
double retval = BitConverter.ToDouble(m_data, m_readPosition >> 3);
return retval;
}
byte[] bytes = PeekBytes(8);
return BitConverter.ToDouble(bytes, 0);
}
/// <summary>
/// Reads a string without advancing the read pointer
/// </summary>
public string PeekString()
{
int wasReadPosition = m_readPosition;
string retval = ReadString();
m_readPosition = wasReadPosition;
return retval;
}
}
}

View File

@@ -1,103 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Reflection;
namespace Lidgren.Network
{
public partial class NetIncomingMessage
{
/// <summary>
/// Reads all public and private declared instance fields of the object in alphabetical order using reflection
/// </summary>
public void ReadAllFields(object target)
{
ReadAllFields(target, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
}
/// <summary>
/// Reads all fields with the specified binding of the object in alphabetical order using reflection
/// </summary>
public void ReadAllFields(object target, BindingFlags flags)
{
if (target == null)
return;
Type tp = target.GetType();
FieldInfo[] fields = tp.GetFields(flags);
NetUtility.SortMembersList(fields);
foreach (FieldInfo fi in fields)
{
object value;
// find read method
MethodInfo readMethod;
if (s_readMethods.TryGetValue(fi.FieldType, out readMethod))
{
// read value
value = readMethod.Invoke(this, null);
// set the value
fi.SetValue(target, value);
}
}
}
/// <summary>
/// Reads all public and private declared instance fields of the object in alphabetical order using reflection
/// </summary>
public void ReadAllProperties(object target)
{
ReadAllProperties(target, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
}
/// <summary>
/// Reads all fields with the specified binding of the object in alphabetical order using reflection
/// </summary>
public void ReadAllProperties(object target, BindingFlags flags)
{
if (target == null)
throw new ArgumentNullException("target");
if (target == null)
return;
Type tp = target.GetType();
PropertyInfo[] fields = tp.GetProperties(flags);
NetUtility.SortMembersList(fields);
foreach (PropertyInfo fi in fields)
{
object value;
// find read method
MethodInfo readMethod;
if (s_readMethods.TryGetValue(fi.PropertyType, out readMethod))
{
// read value
value = readMethod.Invoke(this, null);
// set the value
MethodInfo setMethod = fi.GetSetMethod((flags & BindingFlags.NonPublic) == BindingFlags.NonPublic);
setMethod.Invoke(target, new object[] { value });
}
}
}
}
}

View File

@@ -1,714 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Collections.Generic;
using System.Net;
using System.Reflection;
namespace Lidgren.Network
{
public partial class NetIncomingMessage
{
private const string c_readOverflowError = "Trying to read past the buffer size - likely caused by mismatching Write/Reads, different size or order.";
private static readonly Dictionary<Type, MethodInfo> s_readMethods;
internal int m_readPosition;
/// <summary>
/// Gets or sets the read position in the buffer, in bits (not bytes)
/// </summary>
public long Position
{
get { return (long)m_readPosition; }
set { m_readPosition = (int)value; }
}
/// <summary>
/// Gets the position in the buffer in bytes; note that the bits of the first returned byte may already have been read - check the Position property to make sure.
/// </summary>
public int PositionInBytes
{
get { return (int)(m_readPosition / 8); }
}
static NetIncomingMessage()
{
Type[] integralTypes = typeof(Byte).Assembly.GetTypes();
s_readMethods = new Dictionary<Type, MethodInfo>();
MethodInfo[] methods = typeof(NetIncomingMessage).GetMethods(BindingFlags.Instance | BindingFlags.Public);
foreach (MethodInfo mi in methods)
{
if (mi.GetParameters().Length == 0 && mi.Name.StartsWith("Read", StringComparison.InvariantCulture))
{
string n = mi.Name.Substring(4);
foreach (Type it in integralTypes)
{
if (it.Name == n)
s_readMethods[it] = mi;
}
}
}
}
/// <summary>
/// Reads a boolean value (stored as a single bit) written using Write(bool)
/// </summary>
public bool ReadBoolean()
{
NetException.Assert(m_bitLength - m_readPosition >= 1, c_readOverflowError);
byte retval = NetBitWriter.ReadByte(m_data, 1, m_readPosition);
m_readPosition += 1;
return (retval > 0 ? true : false);
}
/// <summary>
/// Reads a byte
/// </summary>
public byte ReadByte()
{
NetException.Assert(m_bitLength - m_readPosition >= 8, c_readOverflowError);
byte retval = NetBitWriter.ReadByte(m_data, 8, m_readPosition);
m_readPosition += 8;
return retval;
}
/// <summary>
/// Reads a byte and returns true or false for success
/// </summary>
public bool ReadByte(out byte result)
{
if (m_bitLength - m_readPosition < 8)
{
result = 0;
return false;
}
result = NetBitWriter.ReadByte(m_data, 8, m_readPosition);
m_readPosition += 8;
return true;
}
/// <summary>
/// Reads a signed byte
/// </summary>
[CLSCompliant(false)]
public sbyte ReadSByte()
{
NetException.Assert(m_bitLength - m_readPosition >= 8, c_readOverflowError);
byte retval = NetBitWriter.ReadByte(m_data, 8, m_readPosition);
m_readPosition += 8;
return (sbyte)retval;
}
/// <summary>
/// Reads 1 to 8 bits into a byte
/// </summary>
public byte ReadByte(int numberOfBits)
{
NetException.Assert(numberOfBits > 0 && numberOfBits <= 8, "ReadByte(bits) can only read between 1 and 8 bits");
byte retval = NetBitWriter.ReadByte(m_data, numberOfBits, m_readPosition);
m_readPosition += numberOfBits;
return retval;
}
/// <summary>
/// Reads the specified number of bytes
/// </summary>
public byte[] ReadBytes(int numberOfBytes)
{
NetException.Assert(m_bitLength - m_readPosition + 7 >= (numberOfBytes * 8), c_readOverflowError);
byte[] retval = new byte[numberOfBytes];
NetBitWriter.ReadBytes(m_data, numberOfBytes, m_readPosition, retval, 0);
m_readPosition += (8 * numberOfBytes);
return retval;
}
/// <summary>
/// Reads the specified number of bytes and returns true for success
/// </summary>
public bool ReadBytes(int numberOfBytes, out byte[] result)
{
if (m_bitLength - m_readPosition + 7 < (numberOfBytes * 8))
{
result = null;
return false;
}
result = new byte[numberOfBytes];
NetBitWriter.ReadBytes(m_data, numberOfBytes, m_readPosition, result, 0);
m_readPosition += (8 * numberOfBytes);
return true;
}
/// <summary>
/// Reads the specified number of bytes into a preallocated array
/// </summary>
/// <param name="into">The destination array</param>
/// <param name="offset">The offset where to start writing in the destination array</param>
/// <param name="numberOfBytes">The number of bytes to read</param>
public void ReadBytes(byte[] into, int offset, int numberOfBytes)
{
NetException.Assert(m_bitLength - m_readPosition + 7 >= (numberOfBytes * 8), c_readOverflowError);
NetException.Assert(offset + numberOfBytes <= into.Length);
NetBitWriter.ReadBytes(m_data, numberOfBytes, m_readPosition, into, offset);
m_readPosition += (8 * numberOfBytes);
return;
}
/// <summary>
/// Reads the specified number of bits into a preallocated array
/// </summary>
/// <param name="into">The destination array</param>
/// <param name="offset">The offset where to start writing in the destination array</param>
/// <param name="numberOfBits">The number of bits to read</param>
public void ReadBits(byte[] into, int offset, int numberOfBits)
{
NetException.Assert(m_bitLength - m_readPosition >= numberOfBits, c_readOverflowError);
NetException.Assert(offset + NetUtility.BytesToHoldBits(numberOfBits) <= into.Length);
int numberOfWholeBytes = numberOfBits / 8;
int extraBits = numberOfBits - (numberOfWholeBytes * 8);
NetBitWriter.ReadBytes(m_data, numberOfWholeBytes, m_readPosition, into, offset);
m_readPosition += (8 * numberOfWholeBytes);
if (extraBits > 0)
into[offset + numberOfWholeBytes] = ReadByte(extraBits);
return;
}
/// <summary>
/// Reads a 16 bit signed integer written using Write(Int16)
/// </summary>
public Int16 ReadInt16()
{
NetException.Assert(m_bitLength - m_readPosition >= 16, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt32(m_data, 16, m_readPosition);
m_readPosition += 16;
return (short)retval;
}
/// <summary>
/// Reads a 16 bit unsigned integer written using Write(UInt16)
/// </summary>
[CLSCompliant(false)]
public UInt16 ReadUInt16()
{
NetException.Assert(m_bitLength - m_readPosition >= 16, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt32(m_data, 16, m_readPosition);
m_readPosition += 16;
return (ushort)retval;
}
/// <summary>
/// Reads a 32 bit signed integer written using Write(Int32)
/// </summary>
public Int32 ReadInt32()
{
NetException.Assert(m_bitLength - m_readPosition >= 32, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
m_readPosition += 32;
return (Int32)retval;
}
/// <summary>
/// Reads a 32 bit signed integer written using Write(Int32)
/// </summary>
[CLSCompliant(false)]
public bool ReadInt32(out Int32 result)
{
if (m_bitLength - m_readPosition < 32)
{
result = 0;
return false;
}
result = (Int32)NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
m_readPosition += 32;
return true;
}
/// <summary>
/// Reads a signed integer stored in 1 to 32 bits, written using Write(Int32, Int32)
/// </summary>
public Int32 ReadInt32(int numberOfBits)
{
NetException.Assert(numberOfBits > 0 && numberOfBits <= 32, "ReadInt32(bits) can only read between 1 and 32 bits");
NetException.Assert(m_bitLength - m_readPosition >= numberOfBits, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt32(m_data, numberOfBits, m_readPosition);
m_readPosition += numberOfBits;
if (numberOfBits == 32)
return (int)retval;
int signBit = 1 << (numberOfBits - 1);
if ((retval & signBit) == 0)
return (int)retval; // positive
// negative
unchecked
{
uint mask = ((uint)-1) >> (33 - numberOfBits);
uint tmp = (retval & mask) + 1;
return -((int)tmp);
}
}
/// <summary>
/// Reads an 32 bit unsigned integer written using Write(UInt32)
/// </summary>
[CLSCompliant(false)]
public UInt32 ReadUInt32()
{
NetException.Assert(m_bitLength - m_readPosition >= 32, c_readOverflowError);
uint retval = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
m_readPosition += 32;
return retval;
}
/// <summary>
/// Reads an 32 bit unsigned integer written using Write(UInt32) and returns true for success
/// </summary>
[CLSCompliant(false)]
public bool ReadUInt32(out UInt32 result)
{
if (m_bitLength - m_readPosition < 32)
{
result = 0;
return false;
}
result = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
m_readPosition += 32;
return true;
}
/// <summary>
/// Reads an unsigned integer stored in 1 to 32 bits, written using Write(UInt32, Int32)
/// </summary>
[CLSCompliant(false)]
public UInt32 ReadUInt32(int numberOfBits)
{
NetException.Assert(numberOfBits > 0 && numberOfBits <= 32, "ReadUInt32(bits) can only read between 1 and 32 bits");
//NetException.Assert(m_bitLength - m_readBitPtr >= numberOfBits, "tried to read past buffer size");
UInt32 retval = NetBitWriter.ReadUInt32(m_data, numberOfBits, m_readPosition);
m_readPosition += numberOfBits;
return retval;
}
/// <summary>
/// Reads a 64 bit unsigned integer written using Write(UInt64)
/// </summary>
[CLSCompliant(false)]
public UInt64 ReadUInt64()
{
NetException.Assert(m_bitLength - m_readPosition >= 64, c_readOverflowError);
ulong low = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
m_readPosition += 32;
ulong high = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
ulong retval = low + (high << 32);
m_readPosition += 32;
return retval;
}
/// <summary>
/// Reads a 64 bit signed integer written using Write(Int64)
/// </summary>
public Int64 ReadInt64()
{
NetException.Assert(m_bitLength - m_readPosition >= 64, c_readOverflowError);
unchecked
{
ulong retval = ReadUInt64();
long longRetval = (long)retval;
return longRetval;
}
}
/// <summary>
/// Reads an unsigned integer stored in 1 to 64 bits, written using Write(UInt64, Int32)
/// </summary>
[CLSCompliant(false)]
public UInt64 ReadUInt64(int numberOfBits)
{
NetException.Assert(numberOfBits > 0 && numberOfBits <= 64, "ReadUInt64(bits) can only read between 1 and 64 bits");
NetException.Assert(m_bitLength - m_readPosition >= numberOfBits, c_readOverflowError);
ulong retval;
if (numberOfBits <= 32)
{
retval = (ulong)NetBitWriter.ReadUInt32(m_data, numberOfBits, m_readPosition);
}
else
{
retval = NetBitWriter.ReadUInt32(m_data, 32, m_readPosition);
retval |= NetBitWriter.ReadUInt32(m_data, numberOfBits - 32, m_readPosition) << 32;
}
m_readPosition += numberOfBits;
return retval;
}
/// <summary>
/// Reads a signed integer stored in 1 to 64 bits, written using Write(Int64, Int32)
/// </summary>
public Int64 ReadInt64(int numberOfBits)
{
NetException.Assert(((numberOfBits > 0) && (numberOfBits <= 64)), "ReadInt64(bits) can only read between 1 and 64 bits");
return (long)ReadUInt64(numberOfBits);
}
/// <summary>
/// Reads a 32 bit floating point value written using Write(Single)
/// </summary>
public float ReadFloat()
{
return ReadSingle();
}
/// <summary>
/// Reads a 32 bit floating point value written using Write(Single)
/// </summary>
public float ReadSingle()
{
NetException.Assert(m_bitLength - m_readPosition >= 32, c_readOverflowError);
if ((m_readPosition & 7) == 0) // read directly
{
float retval = BitConverter.ToSingle(m_data, m_readPosition >> 3);
m_readPosition += 32;
return retval;
}
byte[] bytes = ReadBytes(4);
return BitConverter.ToSingle(bytes, 0);
}
/// <summary>
/// Reads a 32 bit floating point value written using Write(Single)
/// </summary>
public bool ReadSingle(out float result)
{
if (m_bitLength - m_readPosition < 32)
{
result = 0.0f;
return false;
}
if ((m_readPosition & 7) == 0) // read directly
{
result = BitConverter.ToSingle(m_data, m_readPosition >> 3);
m_readPosition += 32;
return true;
}
byte[] bytes = ReadBytes(4);
result = BitConverter.ToSingle(bytes, 0);
return true;
}
/// <summary>
/// Reads a 64 bit floating point value written using Write(Double)
/// </summary>
public double ReadDouble()
{
NetException.Assert(m_bitLength - m_readPosition >= 64, c_readOverflowError);
if ((m_readPosition & 7) == 0) // read directly
{
// read directly
double retval = BitConverter.ToDouble(m_data, m_readPosition >> 3);
m_readPosition += 64;
return retval;
}
byte[] bytes = ReadBytes(8);
return BitConverter.ToDouble(bytes, 0);
}
//
// Variable bit count
//
/// <summary>
/// Reads a variable sized UInt32 written using WriteVariableUInt32()
/// </summary>
[CLSCompliant(false)]
public uint ReadVariableUInt32()
{
int num1 = 0;
int num2 = 0;
while (true)
{
byte num3 = this.ReadByte();
num1 |= (num3 & 0x7f) << num2;
num2 += 7;
if ((num3 & 0x80) == 0)
return (uint)num1;
}
}
/// <summary>
/// Reads a variable sized UInt32 written using WriteVariableUInt32() and returns true for success
/// </summary>
[CLSCompliant(false)]
public bool ReadVariableUInt32(out uint result)
{
int num1 = 0;
int num2 = 0;
while (true)
{
byte num3;
if (ReadByte(out num3) == false)
{
result = 0;
return false;
}
num1 |= (num3 & 0x7f) << num2;
num2 += 7;
if ((num3 & 0x80) == 0)
{
result = (uint)num1;
return true;
}
}
}
/// <summary>
/// Reads a variable sized Int32 written using WriteVariableInt32()
/// </summary>
public int ReadVariableInt32()
{
uint n = ReadVariableUInt32();
return (int)(n >> 1) ^ -(int)(n & 1); // decode zigzag
}
/// <summary>
/// Reads a variable sized Int64 written using WriteVariableInt64()
/// </summary>
public Int64 ReadVariableInt64()
{
UInt64 n = ReadVariableUInt64();
return (Int64)(n >> 1) ^ -(long)(n & 1); // decode zigzag
}
/// <summary>
/// Reads a variable sized UInt32 written using WriteVariableInt64()
/// </summary>
[CLSCompliant(false)]
public UInt64 ReadVariableUInt64()
{
UInt64 num1 = 0;
int num2 = 0;
while (true)
{
//if (num2 == 0x23)
// throw new FormatException("Bad 7-bit encoded integer");
byte num3 = this.ReadByte();
num1 |= ((UInt64)num3 & 0x7f) << num2;
num2 += 7;
if ((num3 & 0x80) == 0)
return num1;
}
}
/// <summary>
/// Reads a 32 bit floating point value written using WriteSignedSingle()
/// </summary>
/// <param name="numberOfBits">The number of bits used when writing the value</param>
/// <returns>A floating point value larger or equal to -1 and smaller or equal to 1</returns>
public float ReadSignedSingle(int numberOfBits)
{
uint encodedVal = ReadUInt32(numberOfBits);
int maxVal = (1 << numberOfBits) - 1;
return ((float)(encodedVal + 1) / (float)(maxVal + 1) - 0.5f) * 2.0f;
}
/// <summary>
/// Reads a 32 bit floating point value written using WriteUnitSingle()
/// </summary>
/// <param name="numberOfBits">The number of bits used when writing the value</param>
/// <returns>A floating point value larger or equal to 0 and smaller or equal to 1</returns>
public float ReadUnitSingle(int numberOfBits)
{
uint encodedVal = ReadUInt32(numberOfBits);
int maxVal = (1 << numberOfBits) - 1;
return (float)(encodedVal + 1) / (float)(maxVal + 1);
}
/// <summary>
/// Reads a 32 bit floating point value written using WriteRangedSingle()
/// </summary>
/// <param name="min">The minimum value used when writing the value</param>
/// <param name="max">The maximum value used when writing the value</param>
/// <param name="numberOfBits">The number of bits used when writing the value</param>
/// <returns>A floating point value larger or equal to MIN and smaller or equal to MAX</returns>
public float ReadRangedSingle(float min, float max, int numberOfBits)
{
float range = max - min;
int maxVal = (1 << numberOfBits) - 1;
float encodedVal = (float)ReadUInt32(numberOfBits);
float unit = encodedVal / (float)maxVal;
return min + (unit * range);
}
/// <summary>
/// Reads a 32 bit integer value written using WriteRangedInteger()
/// </summary>
/// <param name="min">The minimum value used when writing the value</param>
/// <param name="max">The maximum value used when writing the value</param>
/// <returns>A signed integer value larger or equal to MIN and smaller or equal to MAX</returns>
public int ReadRangedInteger(int min, int max)
{
uint range = (uint)(max - min);
int numBits = NetUtility.BitsToHoldUInt(range);
uint rvalue = ReadUInt32(numBits);
return (int)(min + rvalue);
}
/// <summary>
/// Reads a string written using Write(string)
/// </summary>
public string ReadString()
{
int byteLen = (int)ReadVariableUInt32();
if (byteLen == 0)
return String.Empty;
NetException.Assert(m_bitLength - m_readPosition >= (byteLen * 8), c_readOverflowError);
if ((m_readPosition & 7) == 0)
{
// read directly
string retval = System.Text.Encoding.UTF8.GetString(m_data, m_readPosition >> 3, byteLen);
m_readPosition += (8 * byteLen);
return retval;
}
byte[] bytes = ReadBytes(byteLen);
return System.Text.Encoding.UTF8.GetString(bytes, 0, bytes.Length);
}
/// <summary>
/// Reads a string written using Write(string) and returns true for success
/// </summary>
public bool ReadString(out string result)
{
uint byteLen;
if (ReadVariableUInt32(out byteLen) == false)
{
result = String.Empty;
return false;
}
if (byteLen == 0)
{
result = String.Empty;
return true;
}
if (m_bitLength - m_readPosition < (byteLen * 8))
{
result = String.Empty;
return false;
}
if ((m_readPosition & 7) == 0)
{
// read directly
result = System.Text.Encoding.UTF8.GetString(m_data, m_readPosition >> 3, (int)byteLen);
m_readPosition += (8 * (int)byteLen);
return true;
}
byte[] bytes;
if (ReadBytes((int)byteLen, out bytes) == false)
{
result = String.Empty;
return false;
}
result = System.Text.Encoding.UTF8.GetString(bytes, 0, bytes.Length);
return true;
}
/// <summary>
/// Reads a stored IPv4 endpoint description
/// </summary>
public IPEndPoint ReadIPEndpoint()
{
byte len = ReadByte();
byte[] addressBytes = ReadBytes(len);
int port = (int)ReadUInt16();
IPAddress address = new IPAddress(addressBytes);
return new IPEndPoint(address, port);
}
/// <summary>
/// Reads a value, in local time comparable to NetTime.Now, written using WriteTime()
/// Must have a connected sender
/// </summary>
public double ReadTime(bool highPrecision)
{
double remoteTime = (highPrecision ? ReadDouble() : (double)ReadSingle());
if (m_senderConnection == null)
throw new NetException("Cannot call ReadTime() on message without a connected sender (ie. unconnected messages)");
// lets bypass NetConnection.GetLocalTime for speed
return remoteTime - m_senderConnection.m_remoteTimeOffset;
}
/// <summary>
/// Pads data with enough bits to reach a full byte. Decreases cpu usage for subsequent byte writes.
/// </summary>
public void SkipPadBits()
{
m_readPosition = ((m_readPosition + 7) >> 3) * 8;
}
/// <summary>
/// Pads data with enough bits to reach a full byte. Decreases cpu usage for subsequent byte writes.
/// </summary>
public void ReadPadBits()
{
m_readPosition = ((m_readPosition + 7) >> 3) * 8;
}
/// <summary>
/// Pads data with the specified number of bits.
/// </summary>
public void SkipPadBits(int numberOfBits)
{
m_readPosition += numberOfBits;
}
}
}

View File

@@ -1,475 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Collections.Generic;
using System.Net;
using System.Diagnostics;
using System.Text;
namespace Lidgren.Network
{
public partial class NetIncomingMessage
{
/// <summary>
/// Ensures the buffer can hold this number of bits
/// </summary>
private void InternalEnsureBufferSize(int numberOfBits)
{
int byteLen = ((numberOfBits + 7) >> 3);
if (m_data == null)
{
m_data = new byte[byteLen];
return;
}
if (m_data.Length < byteLen)
Array.Resize<byte>(ref m_data, byteLen);
return;
}
//
// 1 bit
//
internal void Write(bool value)
{
InternalEnsureBufferSize(m_bitLength + 1);
NetBitWriter.WriteByte((value ? (byte)1 : (byte)0), 1, m_data, m_bitLength);
m_bitLength += 1;
}
//
// 8 bit
//
internal void Write(byte source)
{
InternalEnsureBufferSize(m_bitLength + 8);
NetBitWriter.WriteByte(source, 8, m_data, m_bitLength);
m_bitLength += 8;
}
internal void Write(sbyte source)
{
InternalEnsureBufferSize(m_bitLength + 8);
NetBitWriter.WriteByte((byte)source, 8, m_data, m_bitLength);
m_bitLength += 8;
}
internal void Write(byte source, int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 8), "Write(byte, numberOfBits) can only write between 1 and 8 bits");
InternalEnsureBufferSize(m_bitLength + numberOfBits);
NetBitWriter.WriteByte(source, numberOfBits, m_data, m_bitLength);
m_bitLength += numberOfBits;
}
internal void Write(byte[] source)
{
if (source == null)
throw new ArgumentNullException("source");
int bits = source.Length * 8;
InternalEnsureBufferSize(m_bitLength + bits);
NetBitWriter.WriteBytes(source, 0, source.Length, m_data, m_bitLength);
m_bitLength += bits;
}
internal void Write(byte[] source, int offsetInBytes, int numberOfBytes)
{
if (source == null)
throw new ArgumentNullException("source");
int bits = numberOfBytes * 8;
InternalEnsureBufferSize(m_bitLength + bits);
NetBitWriter.WriteBytes(source, offsetInBytes, numberOfBytes, m_data, m_bitLength);
m_bitLength += bits;
}
//
// 16 bit
//
internal void Write(UInt16 source)
{
InternalEnsureBufferSize(m_bitLength + 16);
NetBitWriter.WriteUInt32((uint)source, 16, m_data, m_bitLength);
m_bitLength += 16;
}
internal void Write(UInt16 source, int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 16), "Write(ushort, numberOfBits) can only write between 1 and 16 bits");
InternalEnsureBufferSize(m_bitLength + numberOfBits);
NetBitWriter.WriteUInt32((uint)source, numberOfBits, m_data, m_bitLength);
m_bitLength += numberOfBits;
}
internal void Write(Int16 source)
{
InternalEnsureBufferSize(m_bitLength + 16);
NetBitWriter.WriteUInt32((uint)source, 16, m_data, m_bitLength);
m_bitLength += 16;
}
//
// 32 bit
//
#if UNSAFE
internal unsafe void Write(Int32 source)
{
EnsureBufferSize(m_bitLength + 32);
// can write fast?
if (m_bitLength % 8 == 0)
{
fixed (byte* numRef = &Data[m_bitLength / 8])
{
*((int*)numRef) = source;
}
}
else
{
NetBitWriter.WriteUInt32((UInt32)source, 32, Data, m_bitLength);
}
m_bitLength += 32;
}
#else
internal void Write(Int32 source)
{
InternalEnsureBufferSize(m_bitLength + 32);
NetBitWriter.WriteUInt32((UInt32)source, 32, m_data, m_bitLength);
m_bitLength += 32;
}
#endif
#if UNSAFE
internal unsafe void Write(UInt32 source)
{
EnsureBufferSize(m_bitLength + 32);
// can write fast?
if (m_bitLength % 8 == 0)
{
fixed (byte* numRef = &Data[m_bitLength / 8])
{
*((uint*)numRef) = source;
}
}
else
{
NetBitWriter.WriteUInt32(source, 32, Data, m_bitLength);
}
m_bitLength += 32;
}
#else
internal void Write(UInt32 source)
{
InternalEnsureBufferSize(m_bitLength + 32);
NetBitWriter.WriteUInt32(source, 32, m_data, m_bitLength);
m_bitLength += 32;
}
#endif
internal void Write(UInt32 source, int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 32), "Write(uint, numberOfBits) can only write between 1 and 32 bits");
InternalEnsureBufferSize(m_bitLength + numberOfBits);
NetBitWriter.WriteUInt32(source, numberOfBits, m_data, m_bitLength);
m_bitLength += numberOfBits;
}
internal void Write(Int32 source, int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 32), "Write(int, numberOfBits) can only write between 1 and 32 bits");
InternalEnsureBufferSize(m_bitLength + numberOfBits);
if (numberOfBits != 32)
{
// make first bit sign
int signBit = 1 << (numberOfBits - 1);
if (source < 0)
source = (-source - 1) | signBit;
else
source &= (~signBit);
}
NetBitWriter.WriteUInt32((uint)source, numberOfBits, m_data, m_bitLength);
m_bitLength += numberOfBits;
}
//
// 64 bit
//
internal void Write(UInt64 source)
{
InternalEnsureBufferSize(m_bitLength + 64);
NetBitWriter.WriteUInt64(source, 64, m_data, m_bitLength);
m_bitLength += 64;
}
internal void Write(UInt64 source, int numberOfBits)
{
InternalEnsureBufferSize(m_bitLength + numberOfBits);
NetBitWriter.WriteUInt64(source, numberOfBits, m_data, m_bitLength);
m_bitLength += numberOfBits;
}
internal void Write(Int64 source)
{
InternalEnsureBufferSize(m_bitLength + 64);
ulong usource = (ulong)source;
NetBitWriter.WriteUInt64(usource, 64, m_data, m_bitLength);
m_bitLength += 64;
}
internal void Write(Int64 source, int numberOfBits)
{
InternalEnsureBufferSize(m_bitLength + numberOfBits);
ulong usource = (ulong)source;
NetBitWriter.WriteUInt64(usource, numberOfBits, m_data, m_bitLength);
m_bitLength += numberOfBits;
}
//
// Floating point
//
#if UNSAFE
internal unsafe void Write(float source)
{
uint val = *((uint*)&source);
#if BIGENDIAN
val = NetUtility.SwapByteOrder(val);
#endif
Write(val);
}
#else
internal void Write(float source)
{
byte[] val = BitConverter.GetBytes(source);
#if BIGENDIAN
// swap byte order
byte tmp = val[3];
val[3] = val[0];
val[0] = tmp;
tmp = val[2];
val[2] = val[1];
val[1] = tmp;
#endif
Write(val);
}
#endif
#if UNSAFE
internal unsafe void Write(double source)
{
ulong val = *((ulong*)&source);
#if BIGENDIAN
val = NetUtility.SwapByteOrder(val);
#endif
Write(val);
}
#else
internal void Write(double source)
{
byte[] val = BitConverter.GetBytes(source);
#if BIGENDIAN
// 0 1 2 3 4 5 6 7
// swap byte order
byte tmp = val[7];
val[7] = val[0];
val[0] = tmp;
tmp = val[6];
val[6] = val[1];
val[1] = tmp;
tmp = val[5];
val[5] = val[2];
val[2] = tmp;
tmp = val[4];
val[4] = val[3];
val[3] = tmp;
#endif
Write(val);
}
#endif
//
// Variable bits
//
/// <summary>
/// Write Base128 encoded variable sized unsigned integer
/// </summary>
/// <returns>number of bytes written</returns>
internal int WriteVariableUInt32(uint value)
{
int retval = 1;
uint num1 = (uint)value;
while (num1 >= 0x80)
{
this.Write((byte)(num1 | 0x80));
num1 = num1 >> 7;
retval++;
}
this.Write((byte)num1);
return retval;
}
/// <summary>
/// Write Base128 encoded variable sized signed integer
/// </summary>
/// <returns>number of bytes written</returns>
internal int WriteVariableInt32(int value)
{
int retval = 1;
uint num1 = (uint)((value << 1) ^ (value >> 31));
while (num1 >= 0x80)
{
this.Write((byte)(num1 | 0x80));
num1 = num1 >> 7;
retval++;
}
this.Write((byte)num1);
return retval;
}
/// <summary>
/// Write Base128 encoded variable sized unsigned integer
/// </summary>
/// <returns>number of bytes written</returns>
internal int WriteVariableUInt64(UInt64 value)
{
int retval = 1;
UInt64 num1 = (UInt64)value;
while (num1 >= 0x80)
{
this.Write((byte)(num1 | 0x80));
num1 = num1 >> 7;
retval++;
}
this.Write((byte)num1);
return retval;
}
/// <summary>
/// Compress (lossy) a float in the range -1..1 using numberOfBits bits
/// </summary>
internal void WriteSignedSingle(float value, int numberOfBits)
{
NetException.Assert(((value >= -1.0) && (value <= 1.0)), " WriteSignedSingle() must be passed a float in the range -1 to 1; val is " + value);
float unit = (value + 1.0f) * 0.5f;
int maxVal = (1 << numberOfBits) - 1;
uint writeVal = (uint)(unit * (float)maxVal);
Write(writeVal, numberOfBits);
}
/// <summary>
/// Compress (lossy) a float in the range 0..1 using numberOfBits bits
/// </summary>
internal void WriteUnitSingle(float value, int numberOfBits)
{
NetException.Assert(((value >= 0.0) && (value <= 1.0)), " WriteUnitSingle() must be passed a float in the range 0 to 1; val is " + value);
int maxValue = (1 << numberOfBits) - 1;
uint writeVal = (uint)(value * (float)maxValue);
Write(writeVal, numberOfBits);
}
/// <summary>
/// Compress a float within a specified range using a certain number of bits
/// </summary>
internal void WriteRangedSingle(float value, float min, float max, int numberOfBits)
{
NetException.Assert(((value >= min) && (value <= max)), " WriteRangedSingle() must be passed a float in the range MIN to MAX; val is " + value);
float range = max - min;
float unit = ((value - min) / range);
int maxVal = (1 << numberOfBits) - 1;
Write((UInt32)((float)maxVal * unit), numberOfBits);
}
/// <summary>
/// Writes an integer with the least amount of bits need for the specified range
/// Returns number of bits written
/// </summary>
internal int WriteRangedInteger(int min, int max, int value)
{
NetException.Assert(value >= min && value <= max, "Value not within min/max range!");
uint range = (uint)(max - min);
int numBits = NetUtility.BitsToHoldUInt(range);
uint rvalue = (uint)(value - min);
Write(rvalue, numBits);
return numBits;
}
/// <summary>
/// Write a string
/// </summary>
internal void Write(string source)
{
if (string.IsNullOrEmpty(source))
{
InternalEnsureBufferSize(m_bitLength + 8);
WriteVariableUInt32(0);
return;
}
byte[] bytes = Encoding.UTF8.GetBytes(source);
InternalEnsureBufferSize(m_bitLength + ((bytes.Length + 2) * 8));
WriteVariableUInt32((uint)bytes.Length);
Write(bytes);
}
/// <summary>
/// Writes an endpoint description
/// </summary>
internal void Write(IPEndPoint endPoint)
{
byte[] bytes = endPoint.Address.GetAddressBytes();
Write((byte)bytes.Length);
Write(bytes);
Write((ushort)endPoint.Port);
}
/// <summary>
/// Pads data with enough bits to reach a full byte. Decreases cpu usage for subsequent byte writes.
/// </summary>
internal void WritePadBits()
{
m_bitLength = ((m_bitLength + 7) / 8) * 8;
InternalEnsureBufferSize(m_bitLength);
}
/// <summary>
/// Pads data with the specified number of bits.
/// </summary>
internal void WritePadBits(int numberOfBits)
{
m_bitLength += numberOfBits;
InternalEnsureBufferSize(m_bitLength);
}
}
}

View File

@@ -1,115 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Net;
using System.Diagnostics;
namespace Lidgren.Network
{
/// <summary>
/// Incoming message either sent from a remote peer or generated within the library
/// </summary>
[DebuggerDisplay("Type={MessageType} LengthBits={LengthBits}")]
public sealed class NetIncomingMessage : NetBuffer
{
internal NetIncomingMessageType m_incomingMessageType;
internal IPEndPoint m_senderEndPoint;
internal NetConnection m_senderConnection;
internal int m_sequenceNumber;
internal NetMessageType m_receivedMessageType;
internal bool m_isFragment;
internal double m_receiveTime;
/// <summary>
/// Gets the type of this incoming message
/// </summary>
public NetIncomingMessageType MessageType { get { return m_incomingMessageType; } }
/// <summary>
/// Gets the delivery method this message was sent with (if user data)
/// </summary>
public NetDeliveryMethod DeliveryMethod { get { return NetUtility.GetDeliveryMethod(m_receivedMessageType); } }
/// <summary>
/// Gets the sequence channel this message was sent with (if user data)
/// </summary>
public int SequenceChannel { get { return (int)m_receivedMessageType - (int)NetUtility.GetDeliveryMethod(m_receivedMessageType); } }
/// <summary>
/// IPEndPoint of sender, if any
/// </summary>
public IPEndPoint SenderEndPoint { get { return m_senderEndPoint; } }
/// <summary>
/// NetConnection of sender, if any
/// </summary>
public NetConnection SenderConnection { get { return m_senderConnection; } }
/// <summary>
/// What local time the message was received from the network
/// </summary>
public double ReceiveTime { get { return m_receiveTime; } }
internal NetIncomingMessage()
{
}
internal NetIncomingMessage(NetIncomingMessageType tp)
{
m_incomingMessageType = tp;
}
internal void Reset()
{
m_incomingMessageType = NetIncomingMessageType.Error;
m_readPosition = 0;
m_receivedMessageType = NetMessageType.LibraryError;
m_senderConnection = null;
m_bitLength = 0;
m_isFragment = false;
}
/// <summary>
/// Decrypt a message
/// </summary>
/// <param name="encryption">The encryption algorithm used to encrypt the message</param>
/// <returns>true on success</returns>
public bool Decrypt(INetEncryption encryption)
{
return encryption.Decrypt(this);
}
/// <summary>
/// Reads a value, in local time comparable to NetTime.Now, written using WriteTime()
/// Must have a connected sender
/// </summary>
public double ReadTime(bool highPrecision)
{
return ReadTime(m_senderConnection, highPrecision);
}
/// <summary>
/// Returns a string that represents this object
/// </summary>
public override string ToString()
{
return "[NetIncomingMessage #" + m_sequenceNumber + " " + this.LengthBytes + " bytes]";
}
}
}

View File

@@ -1,105 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Diagnostics.CodeAnalysis;
namespace Lidgren.Network
{
/// <summary>
/// The type of a NetIncomingMessage
/// </summary>
[SuppressMessage("Microsoft.Design", "CA1027:MarkEnumsWithFlags")]
public enum NetIncomingMessageType
{
//
// library note: values are power-of-two, but they are not flags - it's a convenience for NetPeerConfiguration.DisabledMessageTypes
//
/// <summary>
/// Error; this value should never appear
/// </summary>
Error = 0,
/// <summary>
/// Status for a connection changed
/// </summary>
StatusChanged = 1 << 0, // Data (string)
/// <summary>
/// Data sent using SendUnconnectedMessage
/// </summary>
UnconnectedData = 1 << 1, // Data Based on data received
/// <summary>
/// Connection approval is needed
/// </summary>
ConnectionApproval = 1 << 2, // Data
/// <summary>
/// Application data
/// </summary>
Data = 1 << 3, // Data Based on data received
/// <summary>
/// Receipt of delivery
/// </summary>
Receipt = 1 << 4, // Data
/// <summary>
/// Discovery request for a response
/// </summary>
DiscoveryRequest = 1 << 5, // (no data)
/// <summary>
/// Discovery response to a request
/// </summary>
DiscoveryResponse = 1 << 6, // Data
/// <summary>
/// Verbose debug message
/// </summary>
VerboseDebugMessage = 1 << 7, // Data (string)
/// <summary>
/// Debug message
/// </summary>
DebugMessage = 1 << 8, // Data (string)
/// <summary>
/// Warning message
/// </summary>
WarningMessage = 1 << 9, // Data (string)
/// <summary>
/// Error message
/// </summary>
ErrorMessage = 1 << 10, // Data (string)
/// <summary>
/// NAT introduction was successful
/// </summary>
NatIntroductionSuccess = 1 << 11, // Data (as passed to master server)
/// <summary>
/// A roundtrip was measured and NetConnection.AverageRoundtripTime was updated
/// </summary>
ConnectionLatencyUpdated = 1 << 12, // Seconds as a Single
}
}

View File

@@ -1,175 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
namespace Lidgren.Network
{
internal enum NetMessageType : byte
{
Unconnected = 0,
UserUnreliable = 1,
UserSequenced1 = 2,
UserSequenced2 = 3,
UserSequenced3 = 4,
UserSequenced4 = 5,
UserSequenced5 = 6,
UserSequenced6 = 7,
UserSequenced7 = 8,
UserSequenced8 = 9,
UserSequenced9 = 10,
UserSequenced10 = 11,
UserSequenced11 = 12,
UserSequenced12 = 13,
UserSequenced13 = 14,
UserSequenced14 = 15,
UserSequenced15 = 16,
UserSequenced16 = 17,
UserSequenced17 = 18,
UserSequenced18 = 19,
UserSequenced19 = 20,
UserSequenced20 = 21,
UserSequenced21 = 22,
UserSequenced22 = 23,
UserSequenced23 = 24,
UserSequenced24 = 25,
UserSequenced25 = 26,
UserSequenced26 = 27,
UserSequenced27 = 28,
UserSequenced28 = 29,
UserSequenced29 = 30,
UserSequenced30 = 31,
UserSequenced31 = 32,
UserSequenced32 = 33,
UserReliableUnordered = 34,
UserReliableSequenced1 = 35,
UserReliableSequenced2 = 36,
UserReliableSequenced3 = 37,
UserReliableSequenced4 = 38,
UserReliableSequenced5 = 39,
UserReliableSequenced6 = 40,
UserReliableSequenced7 = 41,
UserReliableSequenced8 = 42,
UserReliableSequenced9 = 43,
UserReliableSequenced10 = 44,
UserReliableSequenced11 = 45,
UserReliableSequenced12 = 46,
UserReliableSequenced13 = 47,
UserReliableSequenced14 = 48,
UserReliableSequenced15 = 49,
UserReliableSequenced16 = 50,
UserReliableSequenced17 = 51,
UserReliableSequenced18 = 52,
UserReliableSequenced19 = 53,
UserReliableSequenced20 = 54,
UserReliableSequenced21 = 55,
UserReliableSequenced22 = 56,
UserReliableSequenced23 = 57,
UserReliableSequenced24 = 58,
UserReliableSequenced25 = 59,
UserReliableSequenced26 = 60,
UserReliableSequenced27 = 61,
UserReliableSequenced28 = 62,
UserReliableSequenced29 = 63,
UserReliableSequenced30 = 64,
UserReliableSequenced31 = 65,
UserReliableSequenced32 = 66,
UserReliableOrdered1 = 67,
UserReliableOrdered2 = 68,
UserReliableOrdered3 = 69,
UserReliableOrdered4 = 70,
UserReliableOrdered5 = 71,
UserReliableOrdered6 = 72,
UserReliableOrdered7 = 73,
UserReliableOrdered8 = 74,
UserReliableOrdered9 = 75,
UserReliableOrdered10 = 76,
UserReliableOrdered11 = 77,
UserReliableOrdered12 = 78,
UserReliableOrdered13 = 79,
UserReliableOrdered14 = 80,
UserReliableOrdered15 = 81,
UserReliableOrdered16 = 82,
UserReliableOrdered17 = 83,
UserReliableOrdered18 = 84,
UserReliableOrdered19 = 85,
UserReliableOrdered20 = 86,
UserReliableOrdered21 = 87,
UserReliableOrdered22 = 88,
UserReliableOrdered23 = 89,
UserReliableOrdered24 = 90,
UserReliableOrdered25 = 91,
UserReliableOrdered26 = 92,
UserReliableOrdered27 = 93,
UserReliableOrdered28 = 94,
UserReliableOrdered29 = 95,
UserReliableOrdered30 = 96,
UserReliableOrdered31 = 97,
UserReliableOrdered32 = 98,
Unused1 = 99,
Unused2 = 100,
Unused3 = 101,
Unused4 = 102,
Unused5 = 103,
Unused6 = 104,
Unused7 = 105,
Unused8 = 106,
Unused9 = 107,
Unused10 = 108,
Unused11 = 109,
Unused12 = 110,
Unused13 = 111,
Unused14 = 112,
Unused15 = 113,
Unused16 = 114,
Unused17 = 115,
Unused18 = 116,
Unused19 = 117,
Unused20 = 118,
Unused21 = 119,
Unused22 = 120,
Unused23 = 121,
Unused24 = 122,
Unused25 = 123,
Unused26 = 124,
Unused27 = 125,
Unused28 = 126,
Unused29 = 127,
LibraryError = 128,
Ping = 129, // used for RTT calculation
Pong = 130, // used for RTT calculation
Connect = 131,
ConnectResponse = 132,
ConnectionEstablished = 133,
Acknowledge = 134,
Disconnect = 135,
Discovery = 136,
DiscoveryResponse = 137,
NatPunchMessage = 138, // send between peers
NatIntroduction = 139, // send to master server
ExpandMTURequest = 140,
ExpandMTUSuccess = 141,
}
}

View File

@@ -1,110 +0,0 @@
using System;
using System.Collections.Generic;
using System.Net;
namespace Lidgren.Network
{
public partial class NetPeer
{
/// <summary>
/// Send NetIntroduction to hostExternal and clientExternal; introducing client to host
/// </summary>
public void Introduce(
IPEndPoint hostInternal,
IPEndPoint hostExternal,
IPEndPoint clientInternal,
IPEndPoint clientExternal,
string token)
{
// send message to client
NetOutgoingMessage msg = CreateMessage(10 + token.Length + 1);
msg.m_messageType = NetMessageType.NatIntroduction;
msg.Write((byte)0);
msg.Write(hostInternal);
msg.Write(hostExternal);
msg.Write(token);
m_unsentUnconnectedMessages.Enqueue(new NetTuple<IPEndPoint, NetOutgoingMessage>(clientExternal, msg));
// send message to host
msg = CreateMessage(10 + token.Length + 1);
msg.m_messageType = NetMessageType.NatIntroduction;
msg.Write((byte)1);
msg.Write(clientInternal);
msg.Write(clientExternal);
msg.Write(token);
m_unsentUnconnectedMessages.Enqueue(new NetTuple<IPEndPoint, NetOutgoingMessage>(hostExternal, msg));
}
/// <summary>
/// Called when host/client receives a NatIntroduction message from a master server
/// </summary>
private void HandleNatIntroduction(int ptr)
{
VerifyNetworkThread();
// read intro
NetIncomingMessage tmp = SetupReadHelperMessage(ptr, 1000); // never mind length
byte hostByte = tmp.ReadByte();
IPEndPoint remoteInternal = tmp.ReadIPEndPoint();
IPEndPoint remoteExternal = tmp.ReadIPEndPoint();
string token = tmp.ReadString();
bool isHost = (hostByte != 0);
LogDebug("NAT introduction received; we are designated " + (isHost ? "host" : "client"));
NetOutgoingMessage punch;
if (!isHost && m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.NatIntroductionSuccess) == false)
return; // no need to punch - we're not listening for nat intros!
// send internal punch
punch = CreateMessage(1);
punch.m_messageType = NetMessageType.NatPunchMessage;
punch.Write(hostByte);
punch.Write(token);
m_unsentUnconnectedMessages.Enqueue(new NetTuple<IPEndPoint, NetOutgoingMessage>(remoteInternal, punch));
// send external punch
punch = CreateMessage(1);
punch.m_messageType = NetMessageType.NatPunchMessage;
punch.Write(hostByte);
punch.Write(token);
m_unsentUnconnectedMessages.Enqueue(new NetTuple<IPEndPoint, NetOutgoingMessage>(remoteExternal, punch));
}
/// <summary>
/// Called when receiving a NatPunchMessage from a remote endpoint
/// </summary>
private void HandleNatPunch(int ptr, IPEndPoint senderEndPoint)
{
NetIncomingMessage tmp = SetupReadHelperMessage(ptr, 1000); // never mind length
byte fromHostByte = tmp.ReadByte();
if (fromHostByte == 0)
{
// it's from client
LogDebug("NAT punch received from " + senderEndPoint + " we're host, so we ignore this");
return; // don't alert hosts about nat punch successes; only clients
}
string token = tmp.ReadString();
LogDebug("NAT punch received from " + senderEndPoint + " we're client, so we've succeeded - token is " + token);
//
// Release punch success to client; enabling him to Connect() to msg.SenderIPEndPoint if token is ok
//
NetIncomingMessage punchSuccess = CreateIncomingMessage(NetIncomingMessageType.NatIntroductionSuccess, 10);
punchSuccess.m_senderEndPoint = senderEndPoint;
punchSuccess.Write(token);
ReleaseMessage(punchSuccess);
// send a return punch just for good measure
var punch = CreateMessage(1);
punch.m_messageType = NetMessageType.NatPunchMessage;
punch.Write((byte)0);
punch.Write(token);
m_unsentUnconnectedMessages.Enqueue(new NetTuple<IPEndPoint, NetOutgoingMessage>(senderEndPoint, punch));
}
}
}

View File

@@ -1,91 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Reflection;
namespace Lidgren.Network
{
public partial class NetOutgoingMessage
{
/// <summary>
/// Writes all public and private declared instance fields of the object in alphabetical order using reflection
/// </summary>
public void WriteAllFields(object ob)
{
WriteAllFields(ob, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
}
/// <summary>
/// Writes all fields with specified binding in alphabetical order using reflection
/// </summary>
public void WriteAllFields(object ob, BindingFlags flags)
{
if (ob == null)
return;
Type tp = ob.GetType();
FieldInfo[] fields = tp.GetFields(flags);
NetUtility.SortMembersList(fields);
foreach (FieldInfo fi in fields)
{
object value = fi.GetValue(ob);
// find the appropriate Write method
MethodInfo writeMethod;
if (s_writeMethods.TryGetValue(fi.FieldType, out writeMethod))
writeMethod.Invoke(this, new object[] { value });
else
throw new NetException("Failed to find write method for type " + fi.FieldType);
}
}
/// <summary>
/// Writes all public and private declared instance properties of the object in alphabetical order using reflection
/// </summary>
public void WriteAllProperties(object ob)
{
WriteAllProperties(ob, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
}
/// <summary>
/// Writes all properties with specified binding in alphabetical order using reflection
/// </summary>
public void WriteAllProperties(object ob, BindingFlags flags)
{
if (ob == null)
return;
Type tp = ob.GetType();
PropertyInfo[] fields = tp.GetProperties(flags);
NetUtility.SortMembersList(fields);
foreach (PropertyInfo fi in fields)
{
MethodInfo getMethod = fi.GetGetMethod((flags & BindingFlags.NonPublic) == BindingFlags.NonPublic);
object value = getMethod.Invoke(ob, null);
// find the appropriate Write method
MethodInfo writeMethod;
if (s_writeMethods.TryGetValue(fi.PropertyType, out writeMethod))
writeMethod.Invoke(this, new object[] { value });
}
}
}
}

View File

@@ -1,659 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Collections.Generic;
using System.Net;
using System.Reflection;
using System.Text;
using System.Runtime.InteropServices;
namespace Lidgren.Network
{
public sealed partial class NetOutgoingMessage
{
private const int c_overAllocateAmount = 4;
private static Dictionary<Type, MethodInfo> s_writeMethods;
internal byte[] m_data;
internal int m_bitLength;
static NetOutgoingMessage()
{
s_writeMethods = new Dictionary<Type, MethodInfo>();
MethodInfo[] methods = typeof(NetOutgoingMessage).GetMethods(BindingFlags.Instance | BindingFlags.Public);
foreach (MethodInfo mi in methods)
{
if (mi.Name.Equals("Write", StringComparison.InvariantCulture))
{
ParameterInfo[] pis = mi.GetParameters();
if (pis.Length == 1)
s_writeMethods[pis[0].ParameterType] = mi;
}
}
}
/// <summary>
/// Returns the internal data buffer, don't modify
/// </summary>
public byte[] PeekDataBuffer()
{
return m_data;
}
/// <summary>
/// Gets or sets the length of the buffer in bytes
/// </summary>
public int LengthBytes
{
get { return ((m_bitLength + 7) >> 3); }
set
{
m_bitLength = value * 8;
InternalEnsureBufferSize(m_bitLength);
}
}
/// <summary>
/// Gets or sets the length of the buffer in bits
/// </summary>
public int LengthBits
{
get { return m_bitLength; }
set
{
m_bitLength = value;
InternalEnsureBufferSize(m_bitLength);
}
}
/// <summary>
/// Ensures the buffer can hold this number of bits
/// </summary>
public void EnsureBufferSize(int numberOfBits)
{
int byteLen = ((numberOfBits + 7) >> 3);
if (m_data == null)
{
m_data = new byte[byteLen + c_overAllocateAmount];
return;
}
if (m_data.Length < byteLen)
Array.Resize<byte>(ref m_data, byteLen + c_overAllocateAmount);
return;
}
/// <summary>
/// Ensures the buffer can hold this number of bits
/// </summary>
public void InternalEnsureBufferSize(int numberOfBits)
{
int byteLen = ((numberOfBits + 7) >> 3);
if (m_data == null)
{
m_data = new byte[byteLen];
return;
}
if (m_data.Length < byteLen)
Array.Resize<byte>(ref m_data, byteLen);
return;
}
/// <summary>
/// Writes a boolean value using 1 bit
/// </summary>
public void Write(bool value)
{
EnsureBufferSize(m_bitLength + 1);
NetBitWriter.WriteByte((value ? (byte)1 : (byte)0), 1, m_data, m_bitLength);
m_bitLength += 1;
}
/// <summary>
/// Write a byte
/// </summary>
public void Write(byte source)
{
EnsureBufferSize(m_bitLength + 8);
NetBitWriter.WriteByte(source, 8, m_data, m_bitLength);
m_bitLength += 8;
}
/// <summary>
/// Writes a signed byte
/// </summary>
[CLSCompliant(false)]
public void Write(sbyte source)
{
EnsureBufferSize(m_bitLength + 8);
NetBitWriter.WriteByte((byte)source, 8, m_data, m_bitLength);
m_bitLength += 8;
}
/// <summary>
/// Writes 1 to 8 bits of a byte
/// </summary>
public void Write(byte source, int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 8), "Write(byte, numberOfBits) can only write between 1 and 8 bits");
EnsureBufferSize(m_bitLength + numberOfBits);
NetBitWriter.WriteByte(source, numberOfBits, m_data, m_bitLength);
m_bitLength += numberOfBits;
}
/// <summary>
/// Writes all bytes in an array
/// </summary>
public void Write(byte[] source)
{
if (source == null)
throw new ArgumentNullException("source");
int bits = source.Length * 8;
EnsureBufferSize(m_bitLength + bits);
NetBitWriter.WriteBytes(source, 0, source.Length, m_data, m_bitLength);
m_bitLength += bits;
}
/// <summary>
/// Writes the specified number of bytes from an array
/// </summary>
public void Write(byte[] source, int offsetInBytes, int numberOfBytes)
{
if (source == null)
throw new ArgumentNullException("source");
int bits = numberOfBytes * 8;
EnsureBufferSize(m_bitLength + bits);
NetBitWriter.WriteBytes(source, offsetInBytes, numberOfBytes, m_data, m_bitLength);
m_bitLength += bits;
}
/// <summary>
/// Writes an unsigned 16 bit integer
/// </summary>
/// <param name="source"></param>
[CLSCompliant(false)]
public void Write(UInt16 source)
{
EnsureBufferSize(m_bitLength + 16);
NetBitWriter.WriteUInt32((uint)source, 16, m_data, m_bitLength);
m_bitLength += 16;
}
/// <summary>
/// Writes an unsigned integer using 1 to 16 bits
/// </summary>
[CLSCompliant(false)]
public void Write(UInt16 source, int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 16), "Write(ushort, numberOfBits) can only write between 1 and 16 bits");
EnsureBufferSize(m_bitLength + numberOfBits);
NetBitWriter.WriteUInt32((uint)source, numberOfBits, m_data, m_bitLength);
m_bitLength += numberOfBits;
}
/// <summary>
/// Writes a signed 16 bit integer
/// </summary>
public void Write(Int16 source)
{
EnsureBufferSize(m_bitLength + 16);
NetBitWriter.WriteUInt32((uint)source, 16, m_data, m_bitLength);
m_bitLength += 16;
}
#if UNSAFE
/// <summary>
/// Writes a 32 bit signed integer
/// </summary>
public unsafe void Write(Int32 source)
{
EnsureBufferSize(m_bitLength + 32);
// can write fast?
if (m_bitLength % 8 == 0)
{
fixed (byte* numRef = &Data[m_bitLength / 8])
{
*((int*)numRef) = source;
}
}
else
{
NetBitWriter.WriteUInt32((UInt32)source, 32, Data, m_bitLength);
}
m_bitLength += 32;
}
#else
/// <summary>
/// Writes a 32 bit signed integer
/// </summary>
public void Write(Int32 source)
{
EnsureBufferSize(m_bitLength + 32);
NetBitWriter.WriteUInt32((UInt32)source, 32, m_data, m_bitLength);
m_bitLength += 32;
}
#endif
#if UNSAFE
/// <summary>
/// Writes a 32 bit unsigned integer
/// </summary>
public unsafe void Write(UInt32 source)
{
EnsureBufferSize(m_bitLength + 32);
// can write fast?
if (m_bitLength % 8 == 0)
{
fixed (byte* numRef = &Data[m_bitLength / 8])
{
*((uint*)numRef) = source;
}
}
else
{
NetBitWriter.WriteUInt32(source, 32, Data, m_bitLength);
}
m_bitLength += 32;
}
#else
/// <summary>
/// Writes a 32 bit unsigned integer
/// </summary>
[CLSCompliant(false)]
public void Write(UInt32 source)
{
EnsureBufferSize(m_bitLength + 32);
NetBitWriter.WriteUInt32(source, 32, m_data, m_bitLength);
m_bitLength += 32;
}
#endif
/// <summary>
/// Writes a 32 bit signed integer
/// </summary>
[CLSCompliant(false)]
public void Write(UInt32 source, int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 32), "Write(uint, numberOfBits) can only write between 1 and 32 bits");
EnsureBufferSize(m_bitLength + numberOfBits);
NetBitWriter.WriteUInt32(source, numberOfBits, m_data, m_bitLength);
m_bitLength += numberOfBits;
}
/// <summary>
/// Writes a signed integer using 1 to 32 bits
/// </summary>
public void Write(Int32 source, int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 32), "Write(int, numberOfBits) can only write between 1 and 32 bits");
EnsureBufferSize(m_bitLength + numberOfBits);
if (numberOfBits != 32)
{
// make first bit sign
int signBit = 1 << (numberOfBits - 1);
if (source < 0)
source = (-source - 1) | signBit;
else
source &= (~signBit);
}
NetBitWriter.WriteUInt32((uint)source, numberOfBits, m_data, m_bitLength);
m_bitLength += numberOfBits;
}
/// <summary>
/// Writes a 64 bit unsigned integer
/// </summary>
[CLSCompliant(false)]
public void Write(UInt64 source)
{
EnsureBufferSize(m_bitLength + 64);
NetBitWriter.WriteUInt64(source, 64, m_data, m_bitLength);
m_bitLength += 64;
}
/// <summary>
/// Writes an unsigned integer using 1 to 64 bits
/// </summary>
[CLSCompliant(false)]
public void Write(UInt64 source, int numberOfBits)
{
EnsureBufferSize(m_bitLength + numberOfBits);
NetBitWriter.WriteUInt64(source, numberOfBits, m_data, m_bitLength);
m_bitLength += numberOfBits;
}
/// <summary>
/// Writes a 64 bit signed integer
/// </summary>
public void Write(Int64 source)
{
EnsureBufferSize(m_bitLength + 64);
ulong usource = (ulong)source;
NetBitWriter.WriteUInt64(usource, 64, m_data, m_bitLength);
m_bitLength += 64;
}
/// <summary>
/// Writes a signed integer using 1 to 64 bits
/// </summary>
public void Write(Int64 source, int numberOfBits)
{
EnsureBufferSize(m_bitLength + numberOfBits);
ulong usource = (ulong)source;
NetBitWriter.WriteUInt64(usource, numberOfBits, m_data, m_bitLength);
m_bitLength += numberOfBits;
}
//
// Floating point
//
#if UNSAFE
/// <summary>
/// Writes a 32 bit floating point value
/// </summary>
public unsafe void Write(float source)
{
uint val = *((uint*)&source);
#if BIGENDIAN
val = NetUtility.SwapByteOrder(val);
#endif
Write(val);
}
#else
/// <summary>
/// Writes a 32 bit floating point value
/// </summary>
public void Write(float source)
{
// Use union to avoid BitConverter.GetBytes() which allocates memory on the heap
SingleUIntUnion su;
su.UIntValue = 0; // must initialize every member of the union to avoid warning
su.SingleValue = source;
#if BIGENDIAN
// swap byte order
su.UIntValue = NetUtility.SwapByteOrder(su.UIntValue);
#endif
Write(su.UIntValue);
}
#endif
#if UNSAFE
/// <summary>
/// Writes a 64 bit floating point value
/// </summary>
public unsafe void Write(double source)
{
ulong val = *((ulong*)&source);
#if BIGENDIAN
val = NetUtility.SwapByteOrder(val);
#endif
Write(val);
}
#else
/// <summary>
/// Writes a 64 bit floating point value
/// </summary>
public void Write(double source)
{
byte[] val = BitConverter.GetBytes(source);
#if BIGENDIAN
// 0 1 2 3 4 5 6 7
// swap byte order
byte tmp = val[7];
val[7] = val[0];
val[0] = tmp;
tmp = val[6];
val[6] = val[1];
val[1] = tmp;
tmp = val[5];
val[5] = val[2];
val[2] = tmp;
tmp = val[4];
val[4] = val[3];
val[3] = tmp;
#endif
Write(val);
}
#endif
//
// Variable bits
//
/// <summary>
/// Write Base128 encoded variable sized unsigned integer of up to 32 bits
/// </summary>
/// <returns>number of bytes written</returns>
[CLSCompliant(false)]
public int WriteVariableUInt32(uint value)
{
int retval = 1;
uint num1 = (uint)value;
while (num1 >= 0x80)
{
this.Write((byte)(num1 | 0x80));
num1 = num1 >> 7;
retval++;
}
this.Write((byte)num1);
return retval;
}
/// <summary>
/// Write Base128 encoded variable sized signed integer of up to 32 bits
/// </summary>
/// <returns>number of bytes written</returns>
public int WriteVariableInt32(int value)
{
uint zigzag = (uint)(value << 1) ^ (uint)(value >> 31);
return WriteVariableUInt32(zigzag);
}
/// <summary>
/// Write Base128 encoded variable sized signed integer of up to 64 bits
/// </summary>
/// <returns>number of bytes written</returns>
public int WriteVariableInt64(Int64 value)
{
ulong zigzag = (ulong)(value << 1) ^ (ulong)(value >> 63);
return WriteVariableUInt64(zigzag);
}
/// <summary>
/// Write Base128 encoded variable sized unsigned integer of up to 64 bits
/// </summary>
/// <returns>number of bytes written</returns>
[CLSCompliant(false)]
public int WriteVariableUInt64(UInt64 value)
{
int retval = 1;
UInt64 num1 = (UInt64)value;
while (num1 >= 0x80)
{
this.Write((byte)(num1 | 0x80));
num1 = num1 >> 7;
retval++;
}
this.Write((byte)num1);
return retval;
}
/// <summary>
/// Compress (lossy) a float in the range -1..1 using numberOfBits bits
/// </summary>
public void WriteSignedSingle(float value, int numberOfBits)
{
NetException.Assert(((value >= -1.0) && (value <= 1.0)), " WriteSignedSingle() must be passed a float in the range -1 to 1; val is " + value);
float unit = (value + 1.0f) * 0.5f;
int maxVal = (1 << numberOfBits) - 1;
uint writeVal = (uint)(unit * (float)maxVal);
Write(writeVal, numberOfBits);
}
/// <summary>
/// Compress (lossy) a float in the range 0..1 using numberOfBits bits
/// </summary>
public void WriteUnitSingle(float value, int numberOfBits)
{
NetException.Assert(((value >= 0.0) && (value <= 1.0)), " WriteUnitSingle() must be passed a float in the range 0 to 1; val is " + value);
int maxValue = (1 << numberOfBits) - 1;
uint writeVal = (uint)(value * (float)maxValue);
Write(writeVal, numberOfBits);
}
/// <summary>
/// Compress a float within a specified range using a certain number of bits
/// </summary>
public void WriteRangedSingle(float value, float min, float max, int numberOfBits)
{
NetException.Assert(((value >= min) && (value <= max)), " WriteRangedSingle() must be passed a float in the range MIN to MAX; val is " + value);
float range = max - min;
float unit = ((value - min) / range);
int maxVal = (1 << numberOfBits) - 1;
Write((UInt32)((float)maxVal * unit), numberOfBits);
}
/// <summary>
/// Writes an integer with the least amount of bits need for the specified range
/// Returns number of bits written
/// </summary>
public int WriteRangedInteger(int min, int max, int value)
{
NetException.Assert(value >= min && value <= max, "Value not within min/max range!");
uint range = (uint)(max - min);
int numBits = NetUtility.BitsToHoldUInt(range);
uint rvalue = (uint)(value - min);
Write(rvalue, numBits);
return numBits;
}
/// <summary>
/// Write a string
/// </summary>
public void Write(string source)
{
if (string.IsNullOrEmpty(source))
{
EnsureBufferSize(m_bitLength + 8);
WriteVariableUInt32(0);
return;
}
byte[] bytes = Encoding.UTF8.GetBytes(source);
EnsureBufferSize(m_bitLength + 8 + (bytes.Length * 8));
WriteVariableUInt32((uint)bytes.Length);
Write(bytes);
}
/// <summary>
/// Writes an endpoint description
/// </summary>
public void Write(IPEndPoint endPoint)
{
byte[] bytes = endPoint.Address.GetAddressBytes();
Write((byte)bytes.Length);
Write(bytes);
Write((ushort)endPoint.Port);
}
/// <summary>
/// Writes the local time to a message; readable (and convertable to local time) by the remote host using ReadTime()
/// </summary>
public void WriteTime(double localTime, bool highPrecision)
{
if (highPrecision)
Write(localTime);
else
Write((float)localTime);
}
/// <summary>
/// Pads data with enough bits to reach a full byte. Decreases cpu usage for subsequent byte writes.
/// </summary>
public void WritePadBits()
{
m_bitLength = ((m_bitLength + 7) >> 3) * 8;
EnsureBufferSize(m_bitLength);
}
/// <summary>
/// Pads data with the specified number of bits.
/// </summary>
public void WritePadBits(int numberOfBits)
{
m_bitLength += numberOfBits;
EnsureBufferSize(m_bitLength);
}
/// <summary>
/// Append all the bits of message to this message
/// </summary>
public void Write(NetOutgoingMessage message)
{
EnsureBufferSize(m_bitLength + (message.LengthBytes * 8));
Write(message.m_data, 0, message.LengthBytes);
// did we write excessive bits?
int bitsInLastByte = (message.m_bitLength % 8);
if (bitsInLastByte != 0)
{
int excessBits = 8 - bitsInLastByte;
m_bitLength -= excessBits;
}
}
/// <summary>
/// Append all the bits of message to this message
/// </summary>
public void Write(NetIncomingMessage message)
{
EnsureBufferSize(m_bitLength + (message.LengthBytes * 8));
Write(message.m_data, 0, message.LengthBytes);
// did we write excessive bits?
int bitsInLastByte = (message.m_bitLength % 8);
if (bitsInLastByte != 0)
{
int excessBits = 8 - bitsInLastByte;
m_bitLength -= excessBits;
}
}
}
}

View File

@@ -1,132 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Diagnostics;
namespace Lidgren.Network
{
/// <summary>
/// Outgoing message used to send data to remote peer(s)
/// </summary>
[DebuggerDisplay("LengthBits={LengthBits}")]
public sealed class NetOutgoingMessage : NetBuffer
{
internal NetMessageType m_messageType;
internal bool m_isSent;
internal int m_recyclingCount;
internal int m_fragmentGroup; // which group of fragments ths belongs to
internal int m_fragmentGroupTotalBits; // total number of bits in this group
internal int m_fragmentChunkByteSize; // size, in bytes, of every chunk but the last one
internal int m_fragmentChunkNumber; // which number chunk this is, starting with 0
internal NetOutgoingMessage()
{
}
internal void Reset()
{
m_messageType = NetMessageType.LibraryError;
m_bitLength = 0;
m_isSent = false;
m_recyclingCount = 0;
m_fragmentGroup = 0;
}
internal int Encode(byte[] intoBuffer, int ptr, int sequenceNumber)
{
// 8 bits - NetMessageType
// 1 bit - Fragment?
// 15 bits - Sequence number
// 16 bits - Payload length in bits
intoBuffer[ptr++] = (byte)m_messageType;
byte low = (byte)((sequenceNumber << 1) | (m_fragmentGroup == 0 ? 0 : 1));
intoBuffer[ptr++] = low;
intoBuffer[ptr++] = (byte)(sequenceNumber >> 7);
if (m_fragmentGroup == 0)
{
intoBuffer[ptr++] = (byte)m_bitLength;
intoBuffer[ptr++] = (byte)(m_bitLength >> 8);
int byteLen = NetUtility.BytesToHoldBits(m_bitLength);
if (byteLen > 0)
{
Buffer.BlockCopy(m_data, 0, intoBuffer, ptr, byteLen);
ptr += byteLen;
}
}
else
{
int wasPtr = ptr;
intoBuffer[ptr++] = (byte)m_bitLength;
intoBuffer[ptr++] = (byte)(m_bitLength >> 8);
//
// write fragmentation header
//
ptr = NetFragmentationHelper.WriteHeader(intoBuffer, ptr, m_fragmentGroup, m_fragmentGroupTotalBits, m_fragmentChunkByteSize, m_fragmentChunkNumber);
int hdrLen = ptr - wasPtr - 2;
// update length
int realBitLength = m_bitLength + (hdrLen * 8);
intoBuffer[wasPtr] = (byte)realBitLength;
intoBuffer[wasPtr + 1] = (byte)(realBitLength >> 8);
int byteLen = NetUtility.BytesToHoldBits(m_bitLength);
if (byteLen > 0)
{
Buffer.BlockCopy(m_data, (int)(m_fragmentChunkNumber * m_fragmentChunkByteSize), intoBuffer, ptr, byteLen);
ptr += byteLen;
}
}
NetException.Assert(ptr > 0);
return ptr;
}
internal int GetEncodedSize()
{
int retval = NetConstants.UnfragmentedMessageHeaderSize; // regular headers
if (m_fragmentGroup != 0)
retval += NetFragmentationHelper.GetFragmentationHeaderSize(m_fragmentGroup, m_fragmentGroupTotalBits / 8, m_fragmentChunkByteSize, m_fragmentChunkNumber);
retval += this.LengthBytes;
return retval;
}
/// <summary>
/// Encrypt this message using the provided algorithm; no more writing can be done before sending it or the message will be corrupt!
/// </summary>
public bool Encrypt(INetEncryption encryption)
{
return encryption.Encrypt(this);
}
/// <summary>
/// Returns a string that represents this object
/// </summary>
public override string ToString()
{
return "[NetOutgoingMessage " + m_messageType + " " + this.LengthBytes + " bytes]";
}
}
}

View File

@@ -1,60 +0,0 @@
using System;
using System.Net;
namespace Lidgren.Network
{
public partial class NetPeer
{
/// <summary>
/// Emit a discovery signal to all hosts on your subnet
/// </summary>
public void DiscoverLocalPeers(int serverPort)
{
NetOutgoingMessage om = CreateMessage(0);
om.m_messageType = NetMessageType.Discovery;
m_unsentUnconnectedMessages.Enqueue(new NetTuple<IPEndPoint, NetOutgoingMessage>(new IPEndPoint(IPAddress.Broadcast, serverPort), om));
}
/// <summary>
/// Emit a discovery signal to a single known host
/// </summary>
public bool DiscoverKnownPeer(string host, int serverPort)
{
IPAddress address = NetUtility.Resolve(host);
if (address == null)
return false;
DiscoverKnownPeer(new IPEndPoint(address, serverPort));
return true;
}
/// <summary>
/// Emit a discovery signal to a single known host
/// </summary>
public void DiscoverKnownPeer(IPEndPoint endPoint)
{
NetOutgoingMessage om = CreateMessage(0);
om.m_messageType = NetMessageType.Discovery;
m_unsentUnconnectedMessages.Enqueue(new NetTuple<IPEndPoint, NetOutgoingMessage>(endPoint, om));
}
/// <summary>
/// Send a discovery response message
/// </summary>
public void SendDiscoveryResponse(NetOutgoingMessage msg, IPEndPoint recipient)
{
if (recipient == null)
throw new ArgumentNullException("recipient");
if (msg == null)
msg = CreateMessage(0);
else if (msg.m_isSent)
throw new NetException("Message has already been sent!");
if (msg.LengthBytes >= m_configuration.MaximumTransmissionUnit)
throw new NetException("Cannot send discovery message larger than MTU (currently " + m_configuration.MaximumTransmissionUnit + " bytes)");
msg.m_messageType = NetMessageType.DiscoveryResponse;
m_unsentUnconnectedMessages.Enqueue(new NetTuple<IPEndPoint, NetOutgoingMessage>(recipient, msg));
}
}
}

View File

@@ -1,159 +0,0 @@
using System;
using System.Threading;
using System.Collections.Generic;
namespace Lidgren.Network
{
internal class ReceivedFragmentGroup
{
public float LastReceived;
public byte[] Data;
public NetBitVector ReceivedChunks;
}
public partial class NetPeer
{
private int m_lastUsedFragmentGroup;
private Dictionary<NetConnection, Dictionary<int, ReceivedFragmentGroup>> m_receivedFragmentGroups;
// on user thread
private void SendFragmentedMessage(NetOutgoingMessage msg, IList<NetConnection> recipients, NetDeliveryMethod method, int sequenceChannel)
{
// Note: this group id is PER SENDING/NetPeer; ie. same id is sent to all recipients;
// this should be ok however; as long as recipients differentiate between same id but different sender
int group = Interlocked.Increment(ref m_lastUsedFragmentGroup);
if (group >= NetConstants.MaxFragmentationGroups)
{
// @TODO: not thread safe; but in practice probably not an issue
m_lastUsedFragmentGroup = 1;
group = 1;
}
msg.m_fragmentGroup = group;
// do not send msg; but set fragmentgroup in case user tries to recycle it immediately
// create fragmentation specifics
int totalBytes = msg.LengthBytes;
// determine minimum mtu for all recipients
int mtu = GetMTU(recipients);
int bytesPerChunk = NetFragmentationHelper.GetBestChunkSize(group, totalBytes, mtu);
int numChunks = totalBytes / bytesPerChunk;
if (numChunks * bytesPerChunk < totalBytes)
numChunks++;
int bitsPerChunk = bytesPerChunk * 8;
int bitsLeft = msg.LengthBits;
for (int i = 0; i < numChunks; i++)
{
NetOutgoingMessage chunk = CreateMessage(mtu);
chunk.m_bitLength = (bitsLeft > bitsPerChunk ? bitsPerChunk : bitsLeft);
chunk.m_data = msg.m_data;
chunk.m_fragmentGroup = group;
chunk.m_fragmentGroupTotalBits = totalBytes * 8;
chunk.m_fragmentChunkByteSize = bytesPerChunk;
chunk.m_fragmentChunkNumber = i;
NetException.Assert(chunk.m_bitLength != 0);
NetException.Assert(chunk.GetEncodedSize() < mtu);
Interlocked.Add(ref chunk.m_recyclingCount, recipients.Count);
foreach (NetConnection recipient in recipients)
recipient.EnqueueMessage(chunk, method, sequenceChannel);
bitsLeft -= bitsPerChunk;
}
return;
}
private void HandleReleasedFragment(NetIncomingMessage im)
{
//
// read fragmentation header and combine fragments
//
int group;
int totalBits;
int chunkByteSize;
int chunkNumber;
int ptr = NetFragmentationHelper.ReadHeader(
im.m_data, 0,
out group,
out totalBits,
out chunkByteSize,
out chunkNumber
);
NetException.Assert(im.LengthBytes > ptr);
NetException.Assert(group > 0);
NetException.Assert(totalBits > 0);
NetException.Assert(chunkByteSize > 0);
int totalBytes = NetUtility.BytesToHoldBits((int)totalBits);
int totalNumChunks = totalBytes / chunkByteSize;
if (totalNumChunks * chunkByteSize < totalBytes)
totalNumChunks++;
NetException.Assert(chunkNumber < totalNumChunks);
if (chunkNumber >= totalNumChunks)
{
LogWarning("Index out of bounds for chunk " + chunkNumber + " (total chunks " + totalNumChunks + ")");
return;
}
Dictionary<int, ReceivedFragmentGroup> groups;
if (!m_receivedFragmentGroups.TryGetValue(im.SenderConnection, out groups))
{
groups = new Dictionary<int, ReceivedFragmentGroup>();
m_receivedFragmentGroups[im.SenderConnection] = groups;
}
ReceivedFragmentGroup info;
if (!groups.TryGetValue(group, out info))
{
info = new ReceivedFragmentGroup();
info.Data = new byte[totalBytes];
info.ReceivedChunks = new NetBitVector(totalNumChunks);
groups[group] = info;
}
info.ReceivedChunks[chunkNumber] = true;
info.LastReceived = (float)NetTime.Now;
// copy to data
int offset = (chunkNumber * chunkByteSize);
Buffer.BlockCopy(im.m_data, ptr, info.Data, offset, im.LengthBytes - ptr);
int cnt = info.ReceivedChunks.Count();
//LogVerbose("Found fragment #" + chunkNumber + " in group " + group + " offset " + offset + " of total bits " + totalBits + " (total chunks done " + cnt + ")");
LogVerbose("Received fragment " + chunkNumber + " of " + totalNumChunks + " (" + cnt + " chunks received)");
if (info.ReceivedChunks.Count() == totalNumChunks)
{
// Done! Transform this incoming message
im.m_data = info.Data;
im.m_bitLength = (int)totalBits;
im.m_isFragment = false;
LogVerbose("Fragment group #" + group + " fully received in " + totalNumChunks + " chunks (" + totalBits + " bits)");
groups.Remove(group);
ReleaseMessage(im);
}
else
{
// data has been copied; recycle this incoming message
Recycle(im);
}
return;
}
}
}

View File

@@ -1,688 +0,0 @@
#if !__ANDROID__ && !IOS
#define IS_MAC_AVAILABLE
#endif
using System;
using System.Net;
using System.Threading;
using System.Diagnostics;
using System.Security.Cryptography;
using System.Net.Sockets;
using System.Collections.Generic;
namespace Lidgren.Network
{
public partial class NetPeer
{
private NetPeerStatus m_status;
private Thread m_networkThread;
private Socket m_socket;
internal byte[] m_sendBuffer;
internal byte[] m_receiveBuffer;
internal NetIncomingMessage m_readHelperMessage;
private EndPoint m_senderRemote;
private object m_initializeLock = new object();
private uint m_frameCounter;
private double m_lastHeartbeat;
private NetUPnP m_upnp;
internal readonly NetPeerConfiguration m_configuration;
private readonly NetQueue<NetIncomingMessage> m_releasedIncomingMessages;
internal readonly NetQueue<NetTuple<IPEndPoint, NetOutgoingMessage>> m_unsentUnconnectedMessages;
internal Dictionary<IPEndPoint, NetConnection> m_handshakes;
internal readonly NetPeerStatistics m_statistics;
internal long m_uniqueIdentifier;
internal bool m_executeFlushSendQueue;
private AutoResetEvent m_messageReceivedEvent = new AutoResetEvent(false);
private List<NetTuple<SynchronizationContext, SendOrPostCallback>> m_receiveCallbacks;
/// <summary>
/// Gets the socket, if Start() has been called
/// </summary>
public Socket Socket { get { return m_socket; } }
/// <summary>
/// Call this to register a callback for when a new message arrives
/// </summary>
public void RegisterReceivedCallback(SendOrPostCallback callback)
{
if (SynchronizationContext.Current == null)
throw new NetException("Need a SynchronizationContext to register callback on correct thread!");
if (m_receiveCallbacks == null)
m_receiveCallbacks = new List<NetTuple<SynchronizationContext, SendOrPostCallback>>();
m_receiveCallbacks.Add(new NetTuple<SynchronizationContext, SendOrPostCallback>(SynchronizationContext.Current, callback));
}
/// <summary>
/// Call this to unregister a callback, but remember to do it in the same synchronization context!
/// </summary>
public void UnregisterReceivedCallback(SendOrPostCallback callback)
{
if (m_receiveCallbacks == null)
return;
m_receiveCallbacks.Remove(new NetTuple<SynchronizationContext, SendOrPostCallback>(SynchronizationContext.Current, callback));
if (m_receiveCallbacks.Count < 1)
m_receiveCallbacks = null;
}
internal void ReleaseMessage(NetIncomingMessage msg)
{
NetException.Assert(msg.m_incomingMessageType != NetIncomingMessageType.Error);
if (msg.m_isFragment)
{
HandleReleasedFragment(msg);
return;
}
m_releasedIncomingMessages.Enqueue(msg);
if (m_messageReceivedEvent != null)
m_messageReceivedEvent.Set();
if (m_receiveCallbacks != null)
{
foreach (var tuple in m_receiveCallbacks)
tuple.Item1.Post(tuple.Item2, this);
}
}
private void InitializeNetwork()
{
lock (m_initializeLock)
{
m_configuration.Lock();
if (m_status == NetPeerStatus.Running)
return;
if (m_configuration.m_enableUPnP)
m_upnp = new NetUPnP(this);
InitializePools();
m_releasedIncomingMessages.Clear();
m_unsentUnconnectedMessages.Clear();
m_handshakes.Clear();
// bind to socket
IPEndPoint iep = null;
iep = new IPEndPoint(m_configuration.LocalAddress, m_configuration.Port);
EndPoint ep = (EndPoint)iep;
m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
m_socket.ReceiveBufferSize = m_configuration.ReceiveBufferSize;
m_socket.SendBufferSize = m_configuration.SendBufferSize;
m_socket.Blocking = false;
m_socket.Bind(ep);
var platform = Environment.OSVersion.Platform;
if (platform != PlatformID.MacOSX && platform != PlatformID.Unix)
{
try
{
const uint IOC_IN = 0x80000000;
const uint IOC_VENDOR = 0x18000000;
uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;
m_socket.IOControl((int)SIO_UDP_CONNRESET, new byte[] { Convert.ToByte(false) }, null);
}
catch
{
// ignore; SIO_UDP_CONNRESET not supported on this platform
}
}
IPEndPoint boundEp = m_socket.LocalEndPoint as IPEndPoint;
LogDebug("Socket bound to " + boundEp + ": " + m_socket.IsBound);
m_listenPort = boundEp.Port;
m_receiveBuffer = new byte[m_configuration.ReceiveBufferSize];
m_sendBuffer = new byte[m_configuration.SendBufferSize];
m_readHelperMessage = new NetIncomingMessage(NetIncomingMessageType.Error);
m_readHelperMessage.m_data = m_receiveBuffer;
byte[] macBytes = new byte[8];
NetRandom.Instance.NextBytes(macBytes);
#if IS_MAC_AVAILABLE
try
{
System.Net.NetworkInformation.PhysicalAddress pa = NetUtility.GetMacAddress();
if (pa != null)
{
macBytes = pa.GetAddressBytes();
LogVerbose("Mac address is " + NetUtility.ToHexString(macBytes));
}
else
{
LogWarning("Failed to get Mac address");
}
}
catch (NotSupportedException)
{
// not supported; lets just keep the random bytes set above
}
#endif
byte[] epBytes = BitConverter.GetBytes(boundEp.GetHashCode());
byte[] combined = new byte[epBytes.Length + macBytes.Length];
Array.Copy(epBytes, 0, combined, 0, epBytes.Length);
Array.Copy(macBytes, 0, combined, epBytes.Length, macBytes.Length);
m_uniqueIdentifier = BitConverter.ToInt64(SHA1.Create().ComputeHash(combined), 0);
m_status = NetPeerStatus.Running;
}
}
private void NetworkLoop()
{
VerifyNetworkThread();
LogDebug("Network thread started");
//
// Network loop
//
do
{
try
{
Heartbeat();
}
catch (Exception ex)
{
LogWarning(ex.ToString());
}
} while (m_status == NetPeerStatus.Running);
//
// perform shutdown
//
ExecutePeerShutdown();
}
private void ExecutePeerShutdown()
{
VerifyNetworkThread();
LogDebug("Shutting down...");
// disconnect and make one final heartbeat
var list = new List<NetConnection>(m_handshakes.Count + m_connections.Count);
lock (m_connections)
{
foreach (var conn in m_connections)
if (conn != null)
list.Add(conn);
lock (m_handshakes)
{
foreach (var hs in m_handshakes.Values)
if (hs != null)
list.Add(hs);
// shut down connections
foreach (NetConnection conn in list)
conn.Shutdown(m_shutdownReason);
}
}
FlushDelayedPackets();
// one final heartbeat, will send stuff and do disconnect
Heartbeat();
Thread.Sleep(10);
lock (m_initializeLock)
{
try
{
if (m_socket != null)
{
try
{
m_socket.Shutdown(SocketShutdown.Receive);
}
catch { }
m_socket.Close(2); // 2 seconds timeout
}
if (m_messageReceivedEvent != null)
{
m_messageReceivedEvent.Set();
m_messageReceivedEvent.Close();
m_messageReceivedEvent = null;
}
}
finally
{
m_socket = null;
m_status = NetPeerStatus.NotRunning;
LogDebug("Shutdown complete");
}
m_receiveBuffer = null;
m_sendBuffer = null;
m_unsentUnconnectedMessages.Clear();
m_connections.Clear();
m_handshakes.Clear();
}
return;
}
private void Heartbeat()
{
VerifyNetworkThread();
double dnow = NetTime.Now;
float now = (float)dnow;
double delta = dnow - m_lastHeartbeat;
int maxCHBpS = 1250 - m_connections.Count;
if (maxCHBpS < 250)
maxCHBpS = 250;
if (delta > (1.0 / (double)maxCHBpS) || delta < 0.0) // max connection heartbeats/second max
{
m_frameCounter++;
m_lastHeartbeat = dnow;
// do handshake heartbeats
if ((m_frameCounter % 3) == 0)
{
foreach (var kvp in m_handshakes)
{
NetConnection conn = kvp.Value as NetConnection;
#if DEBUG
// sanity check
if (kvp.Key != kvp.Key)
LogWarning("Sanity fail! Connection in handshake list under wrong key!");
#endif
conn.UnconnectedHeartbeat(now);
if (conn.m_status == NetConnectionStatus.Connected || conn.m_status == NetConnectionStatus.Disconnected)
{
#if DEBUG
// sanity check
if (conn.m_status == NetConnectionStatus.Disconnected && m_handshakes.ContainsKey(conn.RemoteEndPoint))
{
LogWarning("Sanity fail! Handshakes list contained disconnected connection!");
m_handshakes.Remove(conn.RemoteEndPoint);
}
#endif
break; // collection has been modified
}
}
}
#if DEBUG
SendDelayedPackets();
#endif
// update m_executeFlushSendQueue
if (m_configuration.m_autoFlushSendQueue)
m_executeFlushSendQueue = true;
// do connection heartbeats
lock (m_connections)
{
foreach (NetConnection conn in m_connections)
{
conn.Heartbeat(now, m_frameCounter);
if (conn.m_status == NetConnectionStatus.Disconnected)
{
//
// remove connection
//
m_connections.Remove(conn);
m_connectionLookup.Remove(conn.RemoteEndPoint);
break; // can't continue iteration here
}
}
}
m_executeFlushSendQueue = false;
// send unsent unconnected messages
NetTuple<IPEndPoint, NetOutgoingMessage> unsent;
while (m_unsentUnconnectedMessages.TryDequeue(out unsent))
{
NetOutgoingMessage om = unsent.Item2;
bool connReset;
int len = om.Encode(m_sendBuffer, 0, 0);
SendPacket(len, unsent.Item1, 1, out connReset);
Interlocked.Decrement(ref om.m_recyclingCount);
if (om.m_recyclingCount <= 0)
Recycle(om);
}
}
//
// read from socket
//
if (m_socket == null)
return;
if (!m_socket.Poll(1000, SelectMode.SelectRead)) // wait up to 1 ms for data to arrive
return;
//if (m_socket == null || m_socket.Available < 1)
// return;
do
{
int bytesReceived = 0;
try
{
bytesReceived = m_socket.ReceiveFrom(m_receiveBuffer, 0, m_receiveBuffer.Length, SocketFlags.None, ref m_senderRemote);
}
catch (SocketException sx)
{
if (sx.SocketErrorCode == SocketError.ConnectionReset)
{
// connection reset by peer, aka connection forcibly closed aka "ICMP port unreachable"
// we should shut down the connection; but m_senderRemote seemingly cannot be trusted, so which connection should we shut down?!
// So, what to do?
LogWarning("ConnectionReset");
return;
}
LogWarning(sx.ToString());
return;
}
if (bytesReceived < NetConstants.HeaderByteSize)
return;
//LogVerbose("Received " + bytesReceived + " bytes");
IPEndPoint ipsender = (IPEndPoint)m_senderRemote;
if (ipsender.Port == 1900)
{
// UPnP response
try
{
string resp = System.Text.Encoding.ASCII.GetString(m_receiveBuffer, 0, bytesReceived);
if (resp.Contains("upnp:rootdevice"))
{
resp = resp.Substring(resp.ToLower().IndexOf("location:") + 9);
resp = resp.Substring(0, resp.IndexOf("\r")).Trim();
m_upnp.ExtractServiceUrl(resp);
return;
}
}
catch { }
}
NetConnection sender = null;
m_connectionLookup.TryGetValue(ipsender, out sender);
double receiveTime = NetTime.Now;
//
// parse packet into messages
//
int numMessages = 0;
int ptr = 0;
while ((bytesReceived - ptr) >= NetConstants.HeaderByteSize)
{
// decode header
// 8 bits - NetMessageType
// 1 bit - Fragment?
// 15 bits - Sequence number
// 16 bits - Payload length in bits
numMessages++;
NetMessageType tp = (NetMessageType)m_receiveBuffer[ptr++];
byte low = m_receiveBuffer[ptr++];
byte high = m_receiveBuffer[ptr++];
bool isFragment = ((low & 1) == 1);
ushort sequenceNumber = (ushort)((low >> 1) | (((int)high) << 7));
ushort payloadBitLength = (ushort)(m_receiveBuffer[ptr++] | (m_receiveBuffer[ptr++] << 8));
int payloadByteLength = NetUtility.BytesToHoldBits(payloadBitLength);
if (bytesReceived - ptr < payloadByteLength)
{
LogWarning("Malformed packet; stated payload length " + payloadByteLength + ", remaining bytes " + (bytesReceived - ptr));
return;
}
try
{
NetException.Assert(tp < NetMessageType.Unused1 || tp > NetMessageType.Unused29);
if (tp >= NetMessageType.LibraryError)
{
if (sender != null)
sender.ReceivedLibraryMessage(tp, ptr, payloadByteLength);
else
ReceivedUnconnectedLibraryMessage(receiveTime, ipsender, tp, ptr, payloadByteLength);
}
else
{
if (sender == null && !m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.UnconnectedData))
return; // dropping unconnected message since it's not enabled
NetIncomingMessage msg = CreateIncomingMessage(NetIncomingMessageType.Data, payloadByteLength);
msg.m_isFragment = isFragment;
msg.m_receiveTime = receiveTime;
msg.m_sequenceNumber = sequenceNumber;
msg.m_receivedMessageType = tp;
msg.m_senderConnection = sender;
msg.m_senderEndPoint = ipsender;
msg.m_bitLength = payloadBitLength;
Buffer.BlockCopy(m_receiveBuffer, ptr, msg.m_data, 0, payloadByteLength);
if (sender != null)
{
if (tp == NetMessageType.Unconnected)
{
// We're connected; but we can still send unconnected messages to this peer
msg.m_incomingMessageType = NetIncomingMessageType.UnconnectedData;
ReleaseMessage(msg);
}
else
{
// connected application (non-library) message
sender.ReceivedMessage(msg);
}
}
else
{
// at this point we know the message type is enabled
// unconnected application (non-library) message
msg.m_incomingMessageType = NetIncomingMessageType.UnconnectedData;
ReleaseMessage(msg);
}
}
}
catch (Exception ex)
{
LogError("Packet parsing error: " + ex.Message + " from " + ipsender);
}
ptr += payloadByteLength;
}
m_statistics.PacketReceived(bytesReceived, numMessages);
if (sender != null)
sender.m_statistics.PacketReceived(bytesReceived, numMessages);
} while (m_socket.Available > 0);
}
/// <summary>
/// If NetPeerConfiguration.AutoFlushSendQueue() is false; you need to call this to send all messages queued using SendMessage()
/// </summary>
public void FlushSendQueue()
{
m_executeFlushSendQueue = true;
}
internal void HandleIncomingDiscoveryRequest(double now, IPEndPoint senderEndPoint, int ptr, int payloadByteLength)
{
if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.DiscoveryRequest))
{
NetIncomingMessage dm = CreateIncomingMessage(NetIncomingMessageType.DiscoveryRequest, payloadByteLength);
if (payloadByteLength > 0)
Buffer.BlockCopy(m_receiveBuffer, ptr, dm.m_data, 0, payloadByteLength);
dm.m_receiveTime = now;
dm.m_bitLength = payloadByteLength * 8;
dm.m_senderEndPoint = senderEndPoint;
ReleaseMessage(dm);
}
}
internal void HandleIncomingDiscoveryResponse(double now, IPEndPoint senderEndPoint, int ptr, int payloadByteLength)
{
if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.DiscoveryResponse))
{
NetIncomingMessage dr = CreateIncomingMessage(NetIncomingMessageType.DiscoveryResponse, payloadByteLength);
if (payloadByteLength > 0)
Buffer.BlockCopy(m_receiveBuffer, ptr, dr.m_data, 0, payloadByteLength);
dr.m_receiveTime = now;
dr.m_bitLength = payloadByteLength * 8;
dr.m_senderEndPoint = senderEndPoint;
ReleaseMessage(dr);
}
}
private void ReceivedUnconnectedLibraryMessage(double now, IPEndPoint senderEndPoint, NetMessageType tp, int ptr, int payloadByteLength)
{
NetConnection shake;
if (m_handshakes.TryGetValue(senderEndPoint, out shake))
{
shake.ReceivedHandshake(now, tp, ptr, payloadByteLength);
return;
}
//
// Library message from a completely unknown sender; lets just accept Connect
//
switch (tp)
{
case NetMessageType.Discovery:
HandleIncomingDiscoveryRequest(now, senderEndPoint, ptr, payloadByteLength);
return;
case NetMessageType.DiscoveryResponse:
HandleIncomingDiscoveryResponse(now, senderEndPoint, ptr, payloadByteLength);
return;
case NetMessageType.NatIntroduction:
HandleNatIntroduction(ptr);
return;
case NetMessageType.NatPunchMessage:
HandleNatPunch(ptr, senderEndPoint);
return;
case NetMessageType.ConnectResponse:
lock (m_handshakes)
{
foreach (var hs in m_handshakes)
{
if (hs.Key.Address.Equals(senderEndPoint.Address))
{
if (hs.Value.m_connectionInitiator)
{
//
// We are currently trying to connection to XX.XX.XX.XX:Y
// ... but we just received a ConnectResponse from XX.XX.XX.XX:Z
// Lets just assume the router decided to use this port instead
//
var hsconn = hs.Value;
m_connectionLookup.Remove(hs.Key);
m_handshakes.Remove(hs.Key);
LogDebug("Detected host port change; rerouting connection to " + senderEndPoint);
hsconn.MutateEndPoint(senderEndPoint);
m_connectionLookup.Add(senderEndPoint, hsconn);
m_handshakes.Add(senderEndPoint, hsconn);
hsconn.ReceivedHandshake(now, tp, ptr, payloadByteLength);
return;
}
}
}
}
LogWarning("Received unhandled library message " + tp + " from " + senderEndPoint);
return;
case NetMessageType.Connect:
// proceed
break;
case NetMessageType.Disconnect:
// this is probably ok
LogVerbose("Received Disconnect from unconnected source: " + senderEndPoint);
return;
default:
LogWarning("Received unhandled library message " + tp + " from " + senderEndPoint);
return;
}
// It's someone wanting to shake hands with us!
int reservedSlots = m_handshakes.Count + m_connections.Count;
if (reservedSlots >= m_configuration.m_maximumConnections)
{
// server full
NetOutgoingMessage full = CreateMessage("Server full");
full.m_messageType = NetMessageType.Disconnect;
SendLibrary(full, senderEndPoint);
return;
}
// Ok, start handshake!
NetConnection conn = new NetConnection(this, senderEndPoint);
conn.m_status = NetConnectionStatus.ReceivedInitiation;
m_handshakes.Add(senderEndPoint, conn);
conn.ReceivedHandshake(now, tp, ptr, payloadByteLength);
return;
}
internal void AcceptConnection(NetConnection conn)
{
// LogDebug("Accepted connection " + conn);
conn.InitExpandMTU(NetTime.Now);
if (m_handshakes.Remove(conn.m_remoteEndPoint) == false)
LogWarning("AcceptConnection called but m_handshakes did not contain it!");
lock (m_connections)
{
if (m_connections.Contains(conn))
{
LogWarning("AcceptConnection called but m_connection already contains it!");
}
else
{
m_connections.Add(conn);
m_connectionLookup.Add(conn.m_remoteEndPoint, conn);
}
}
}
[Conditional("DEBUG")]
internal void VerifyNetworkThread()
{
Thread ct = Thread.CurrentThread;
if (Thread.CurrentThread != m_networkThread)
throw new NetException("Executing on wrong thread! Should be library system thread (is " + ct.Name + " mId " + ct.ManagedThreadId + ")");
}
internal NetIncomingMessage SetupReadHelperMessage(int ptr, int payloadLength)
{
VerifyNetworkThread();
m_readHelperMessage.m_bitLength = (ptr + payloadLength) * 8;
m_readHelperMessage.m_readPosition = (ptr * 8);
return m_readHelperMessage;
}
}
}

View File

@@ -1,304 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
//#define USE_RELEASE_STATISTICS
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;
namespace Lidgren.Network
{
public partial class NetPeer
{
#if DEBUG
private readonly List<DelayedPacket> m_delayedPackets = new List<DelayedPacket>();
private class DelayedPacket
{
public byte[] Data;
public double DelayedUntil;
public IPEndPoint Target;
}
internal void SendPacket(int numBytes, IPEndPoint target, int numMessages, out bool connectionReset)
{
connectionReset = false;
// simulate loss
float loss = m_configuration.m_loss;
if (loss > 0.0f)
{
if ((float)NetRandom.Instance.NextDouble() < loss)
{
LogVerbose("Sending packet " + numBytes + " bytes - SIMULATED LOST!");
return; // packet "lost"
}
}
m_statistics.PacketSent(numBytes, numMessages);
// simulate latency
float m = m_configuration.m_minimumOneWayLatency;
float r = m_configuration.m_randomOneWayLatency;
if (m == 0.0f && r == 0.0f)
{
// no latency simulation
// LogVerbose("Sending packet " + numBytes + " bytes");
bool wasSent = ActuallySendPacket(m_sendBuffer, numBytes, target, out connectionReset);
// TODO: handle wasSent == false?
return;
}
int num = 1;
if (m_configuration.m_duplicates > 0.0f && NetRandom.Instance.NextSingle() < m_configuration.m_duplicates)
num++;
float delay = 0;
for (int i = 0; i < num; i++)
{
delay = m_configuration.m_minimumOneWayLatency + (NetRandom.Instance.NextSingle() * m_configuration.m_randomOneWayLatency);
// Enqueue delayed packet
DelayedPacket p = new DelayedPacket();
p.Target = target;
p.Data = new byte[numBytes];
Buffer.BlockCopy(m_sendBuffer, 0, p.Data, 0, numBytes);
p.DelayedUntil = NetTime.Now + delay;
m_delayedPackets.Add(p);
}
// LogVerbose("Sending packet " + numBytes + " bytes - delayed " + NetTime.ToReadable(delay));
}
private void SendDelayedPackets()
{
if (m_delayedPackets.Count <= 0)
return;
double now = NetTime.Now;
bool connectionReset;
RestartDelaySending:
foreach (DelayedPacket p in m_delayedPackets)
{
if (now > p.DelayedUntil)
{
ActuallySendPacket(p.Data, p.Data.Length, p.Target, out connectionReset);
m_delayedPackets.Remove(p);
goto RestartDelaySending;
}
}
}
private void FlushDelayedPackets()
{
try
{
bool connectionReset;
foreach (DelayedPacket p in m_delayedPackets)
ActuallySendPacket(p.Data, p.Data.Length, p.Target, out connectionReset);
m_delayedPackets.Clear();
}
catch { }
}
internal bool ActuallySendPacket(byte[] data, int numBytes, IPEndPoint target, out bool connectionReset)
{
connectionReset = false;
try
{
// TODO: refactor this check outta here
if (target.Address == IPAddress.Broadcast)
{
// Some networks do not allow
// a global broadcast so we use the BroadcastAddress from the configuration
// this can be resolved to a local broadcast addresss e.g 192.168.x.255
target.Address = m_configuration.BroadcastAddress;
m_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
}
int bytesSent = m_socket.SendTo(data, 0, numBytes, SocketFlags.None, target);
if (numBytes != bytesSent)
LogWarning("Failed to send the full " + numBytes + "; only " + bytesSent + " bytes sent in packet!");
// LogDebug("Sent " + numBytes + " bytes");
}
catch (SocketException sx)
{
if (sx.SocketErrorCode == SocketError.WouldBlock)
{
// send buffer full?
LogWarning("Socket threw exception; would block - send buffer full? Increase in NetPeerConfiguration");
return false;
}
if (sx.SocketErrorCode == SocketError.ConnectionReset)
{
// connection reset by peer, aka connection forcibly closed aka "ICMP port unreachable"
connectionReset = true;
return false;
}
LogError("Failed to send packet: " + sx);
}
catch (Exception ex)
{
LogError("Failed to send packet: " + ex);
}
finally
{
if (target.Address == IPAddress.Broadcast)
m_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, false);
}
return true;
}
internal bool SendMTUPacket(int numBytes, IPEndPoint target)
{
try
{
m_socket.DontFragment = true;
int bytesSent = m_socket.SendTo(m_sendBuffer, 0, numBytes, SocketFlags.None, target);
if (numBytes != bytesSent)
LogWarning("Failed to send the full " + numBytes + "; only " + bytesSent + " bytes sent in packet!");
m_statistics.PacketSent(numBytes, 1);
}
catch (SocketException sx)
{
if (sx.SocketErrorCode == SocketError.MessageSize)
return false;
if (sx.SocketErrorCode == SocketError.WouldBlock)
{
// send buffer full?
LogWarning("Socket threw exception; would block - send buffer full? Increase in NetPeerConfiguration");
return true;
}
if (sx.SocketErrorCode == SocketError.ConnectionReset)
return true;
LogError("Failed to send packet: (" + sx.SocketErrorCode + ") " + sx);
}
catch (Exception ex)
{
LogError("Failed to send packet: " + ex);
}
finally
{
m_socket.DontFragment = false;
}
return true;
}
#else
internal bool SendMTUPacket(int numBytes, IPEndPoint target)
{
try
{
m_socket.DontFragment = true;
int bytesSent = m_socket.SendTo(m_sendBuffer, 0, numBytes, SocketFlags.None, target);
if (numBytes != bytesSent)
LogWarning("Failed to send the full " + numBytes + "; only " + bytesSent + " bytes sent in packet!");
}
catch (SocketException sx)
{
if (sx.SocketErrorCode == SocketError.MessageSize)
return false;
if (sx.SocketErrorCode == SocketError.WouldBlock)
{
// send buffer full?
LogWarning("Socket threw exception; would block - send buffer full? Increase in NetPeerConfiguration");
return true;
}
if (sx.SocketErrorCode == SocketError.ConnectionReset)
return true;
LogError("Failed to send packet: (" + sx.SocketErrorCode + ") " + sx);
}
catch (Exception ex)
{
LogError("Failed to send packet: " + ex);
}
finally
{
m_socket.DontFragment = false;
}
return true;
}
//
// Release - just send the packet straight away
//
internal void SendPacket(int numBytes, IPEndPoint target, int numMessages, out bool connectionReset)
{
#if USE_RELEASE_STATISTICS
m_statistics.PacketSent(numBytes, numMessages);
#endif
connectionReset = false;
try
{
// TODO: refactor this check outta here
if (target.Address == IPAddress.Broadcast)
m_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
int bytesSent = m_socket.SendTo(m_sendBuffer, 0, numBytes, SocketFlags.None, target);
if (numBytes != bytesSent)
LogWarning("Failed to send the full " + numBytes + "; only " + bytesSent + " bytes sent in packet!");
}
catch (SocketException sx)
{
if (sx.SocketErrorCode == SocketError.WouldBlock)
{
// send buffer full?
LogWarning("Socket threw exception; would block - send buffer full? Increase in NetPeerConfiguration");
return;
}
if (sx.SocketErrorCode == SocketError.ConnectionReset)
{
// connection reset by peer, aka connection forcibly closed aka "ICMP port unreachable"
connectionReset = true;
return;
}
LogError("Failed to send packet: " + sx);
}
catch (Exception ex)
{
LogError("Failed to send packet: " + ex);
}
finally
{
if (target.Address == IPAddress.Broadcast)
m_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, false);
}
return;
}
private void FlushDelayedPackets()
{
}
private void SendCallBack(IAsyncResult res)
{
NetException.Assert(res.IsCompleted == true);
m_socket.EndSendTo(res);
}
#endif
}
}

View File

@@ -1,51 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System.Diagnostics;
namespace Lidgren.Network
{
public partial class NetPeer
{
[Conditional("DEBUG")]
internal void LogVerbose(string message)
{
if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.VerboseDebugMessage))
ReleaseMessage(CreateIncomingMessage(NetIncomingMessageType.VerboseDebugMessage, message));
}
[Conditional("DEBUG")]
internal void LogDebug(string message)
{
if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.DebugMessage))
ReleaseMessage(CreateIncomingMessage(NetIncomingMessageType.DebugMessage, message));
}
internal void LogWarning(string message)
{
if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.WarningMessage))
ReleaseMessage(CreateIncomingMessage(NetIncomingMessageType.WarningMessage, message));
}
internal void LogError(string message)
{
if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.ErrorMessage))
ReleaseMessage(CreateIncomingMessage(NetIncomingMessageType.ErrorMessage, message));
}
}
}

View File

@@ -1,228 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Lidgren.Network
{
public partial class NetPeer
{
private List<byte[]> m_storagePool; // sorted smallest to largest
private NetQueue<NetOutgoingMessage> m_outgoingMessagesPool;
private NetQueue<NetIncomingMessage> m_incomingMessagesPool;
internal int m_storagePoolBytes;
private void InitializePools()
{
if (m_configuration.UseMessageRecycling)
{
m_storagePool = new List<byte[]>(16);
m_outgoingMessagesPool = new NetQueue<NetOutgoingMessage>(4);
m_incomingMessagesPool = new NetQueue<NetIncomingMessage>(4);
}
else
{
m_storagePool = null;
m_outgoingMessagesPool = null;
m_incomingMessagesPool = null;
}
}
internal byte[] GetStorage(int minimumCapacityInBytes)
{
if (m_storagePool == null)
return new byte[minimumCapacityInBytes];
lock (m_storagePool)
{
for (int i = 0; i < m_storagePool.Count; i++)
{
byte[] retval = m_storagePool[i];
if (retval != null && retval.Length >= minimumCapacityInBytes)
{
m_storagePool[i] = null;
m_storagePoolBytes -= retval.Length;
return retval;
}
}
}
m_statistics.m_bytesAllocated += minimumCapacityInBytes;
return new byte[minimumCapacityInBytes];
}
internal void Recycle(byte[] storage)
{
if (m_storagePool == null)
return;
lock (m_storagePool)
{
m_storagePoolBytes += storage.Length;
int cnt = m_storagePool.Count;
for (int i = 0; i < cnt; i++)
{
if (m_storagePool[i] == null)
{
m_storagePool[i] = storage;
return;
}
}
m_storagePool.Add(storage);
}
}
/// <summary>
/// Creates a new message for sending
/// </summary>
public NetOutgoingMessage CreateMessage()
{
return CreateMessage(m_configuration.m_defaultOutgoingMessageCapacity);
}
/// <summary>
/// Creates a new message for sending and writes the provided string to it
/// </summary>
public NetOutgoingMessage CreateMessage(string content)
{
byte[] bytes = Encoding.UTF8.GetBytes(content);
NetOutgoingMessage om = CreateMessage(2 + bytes.Length);
om.WriteVariableUInt32((uint)bytes.Length);
om.Write(bytes);
return om;
}
/// <summary>
/// Creates a new message for sending
/// </summary>
/// <param name="initialCapacity">initial capacity in bytes</param>
public NetOutgoingMessage CreateMessage(int initialCapacity)
{
NetOutgoingMessage retval;
if (m_outgoingMessagesPool == null || !m_outgoingMessagesPool.TryDequeue(out retval))
retval = new NetOutgoingMessage();
byte[] storage = GetStorage(initialCapacity);
retval.m_data = storage;
return retval;
}
internal NetIncomingMessage CreateIncomingMessage(NetIncomingMessageType tp, byte[] useStorageData)
{
NetIncomingMessage retval;
if (m_incomingMessagesPool == null || !m_incomingMessagesPool.TryDequeue(out retval))
retval = new NetIncomingMessage(tp);
else
retval.m_incomingMessageType = tp;
retval.m_data = useStorageData;
return retval;
}
internal NetIncomingMessage CreateIncomingMessage(NetIncomingMessageType tp, int minimumByteSize)
{
NetIncomingMessage retval;
if (m_incomingMessagesPool == null || !m_incomingMessagesPool.TryDequeue(out retval))
retval = new NetIncomingMessage(tp);
else
retval.m_incomingMessageType = tp;
retval.m_data = GetStorage(minimumByteSize);
return retval;
}
/// <summary>
/// Recycles a NetIncomingMessage instance for reuse; taking pressure off the garbage collector
/// </summary>
public void Recycle(NetIncomingMessage msg)
{
if (m_incomingMessagesPool == null)
return;
#if DEBUG
if (m_incomingMessagesPool.Contains(msg))
throw new NetException("Recyling already recycled message! Thread race?");
#endif
byte[] storage = msg.m_data;
msg.m_data = null;
Recycle(storage);
msg.Reset();
m_incomingMessagesPool.Enqueue(msg);
}
/// <summary>
/// Recycles a list of NetIncomingMessage instances for reuse; taking pressure off the garbage collector
/// </summary>
public void Recycle(IEnumerable<NetIncomingMessage> toRecycle)
{
if (m_incomingMessagesPool == null)
return;
// first recycle the storage of each message
if (m_storagePool != null)
{
lock (m_storagePool)
{
foreach (var msg in toRecycle)
{
var storage = msg.m_data;
msg.m_data = null;
m_storagePoolBytes += storage.Length;
int cnt = m_storagePool.Count;
for (int i = 0; i < cnt; i++)
{
if (m_storagePool[i] == null)
{
m_storagePool[i] = storage;
return;
}
}
msg.Reset();
m_storagePool.Add(storage);
}
}
}
// then recycle the message objects
m_incomingMessagesPool.Enqueue(toRecycle);
}
internal void Recycle(NetOutgoingMessage msg)
{
if (m_outgoingMessagesPool == null)
return;
#if DEBUG
if (m_outgoingMessagesPool.Contains(msg))
throw new NetException("Recyling already recycled message! Thread race?");
#endif
byte[] storage = msg.m_data;
msg.m_data = null;
// message fragments cannot be recycled
// TODO: find a way to recycle large message after all fragments has been acknowledged; or? possibly better just to garbage collect them
if (msg.m_fragmentGroup == 0)
Recycle(storage);
msg.Reset();
m_outgoingMessagesPool.Enqueue(msg);
}
/// <summary>
/// Creates an incoming message with the required capacity for releasing to the application
/// </summary>
internal NetIncomingMessage CreateIncomingMessage(NetIncomingMessageType tp, string text)
{
NetIncomingMessage retval;
if (string.IsNullOrEmpty(text))
{
retval = CreateIncomingMessage(tp, 1);
retval.Write(string.Empty);
return retval;
}
int numBytes = System.Text.Encoding.UTF8.GetByteCount(text);
retval = CreateIncomingMessage(tp, numBytes + (numBytes > 127 ? 2 : 1));
retval.Write(text);
return retval;
}
}
}

View File

@@ -1,226 +0,0 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Net;
namespace Lidgren.Network
{
public partial class NetPeer
{
/// <summary>
/// Send a message to a specific connection
/// </summary>
/// <param name="msg">The message to send</param>
/// <param name="recipient">The recipient connection</param>
/// <param name="method">How to deliver the message</param>
public NetSendResult SendMessage(NetOutgoingMessage msg, NetConnection recipient, NetDeliveryMethod method)
{
return SendMessage(msg, recipient, method, 0);
}
/// <summary>
/// Send a message to a specific connection
/// </summary>
/// <param name="msg">The message to send</param>
/// <param name="recipient">The recipient connection</param>
/// <param name="method">How to deliver the message</param>
/// <param name="sequenceChannel">Sequence channel within the delivery method</param>
public NetSendResult SendMessage(NetOutgoingMessage msg, NetConnection recipient, NetDeliveryMethod method, int sequenceChannel)
{
if (msg == null)
throw new ArgumentNullException("msg");
if (recipient == null)
throw new ArgumentNullException("recipient");
if (sequenceChannel >= NetConstants.NetChannelsPerDeliveryMethod)
throw new ArgumentOutOfRangeException("sequenceChannel");
NetException.Assert(
((method != NetDeliveryMethod.Unreliable && method != NetDeliveryMethod.ReliableUnordered) ||
((method == NetDeliveryMethod.Unreliable || method == NetDeliveryMethod.ReliableUnordered) && sequenceChannel == 0)),
"Delivery method " + method + " cannot use sequence channels other than 0!"
);
NetException.Assert(method != NetDeliveryMethod.Unknown, "Bad delivery method!");
if (msg.m_isSent)
throw new NetException("This message has already been sent! Use NetPeer.SendMessage() to send to multiple recipients efficiently");
msg.m_isSent = true;
int len = NetConstants.UnfragmentedMessageHeaderSize + msg.LengthBytes; // headers + length, faster than calling msg.GetEncodedSize
if (len <= recipient.m_currentMTU)
{
Interlocked.Increment(ref msg.m_recyclingCount);
return recipient.EnqueueMessage(msg, method, sequenceChannel);
}
else
{
// message must be fragmented!
if (recipient.m_status != NetConnectionStatus.Connected)
return NetSendResult.FailedNotConnected;
SendFragmentedMessage(msg, new NetConnection[] { recipient }, method, sequenceChannel);
return NetSendResult.Queued; // could be different for each connection; Queued is "most true"
}
}
internal int GetMTU(IList<NetConnection> recipients)
{
int count = recipients.Count;
NetException.Assert(count > 0);
int mtu = int.MaxValue;
for(int i=0;i<count;i++)
{
var conn = recipients[i];
int cmtu = conn.m_currentMTU;
if (cmtu < mtu)
mtu = cmtu;
}
return mtu;
}
/// <summary>
/// Send a message to a list of connections
/// </summary>
/// <param name="msg">The message to send</param>
/// <param name="recipients">The list of recipients to send to</param>
/// <param name="method">How to deliver the message</param>
/// <param name="sequenceChannel">Sequence channel within the delivery method</param>
public void SendMessage(NetOutgoingMessage msg, List<NetConnection> recipients, NetDeliveryMethod method, int sequenceChannel)
{
if (msg == null)
throw new ArgumentNullException("msg");
if (recipients == null)
throw new ArgumentNullException("recipients");
if (recipients.Count < 1)
throw new NetException("recipients must contain at least one item");
if (method == NetDeliveryMethod.Unreliable || method == NetDeliveryMethod.ReliableUnordered)
NetException.Assert(sequenceChannel == 0, "Delivery method " + method + " cannot use sequence channels other than 0!");
if (msg.m_isSent)
throw new NetException("This message has already been sent! Use NetPeer.SendMessage() to send to multiple recipients efficiently");
int mtu = GetMTU(recipients);
msg.m_isSent = true;
int len = msg.GetEncodedSize();
if (len <= mtu)
{
Interlocked.Add(ref msg.m_recyclingCount, recipients.Count);
foreach (NetConnection conn in recipients)
{
if (conn == null)
{
Interlocked.Decrement(ref msg.m_recyclingCount);
continue;
}
NetSendResult res = conn.EnqueueMessage(msg, method, sequenceChannel);
if (res != NetSendResult.Queued && res != NetSendResult.Sent)
Interlocked.Decrement(ref msg.m_recyclingCount);
}
}
else
{
// message must be fragmented!
SendFragmentedMessage(msg, recipients, method, sequenceChannel);
}
return;
}
/// <summary>
/// Send a message to an unconnected host
/// </summary>
public void SendUnconnectedMessage(NetOutgoingMessage msg, string host, int port)
{
if (msg == null)
throw new ArgumentNullException("msg");
if (host == null)
throw new ArgumentNullException("host");
if (msg.m_isSent)
throw new NetException("This message has already been sent! Use NetPeer.SendMessage() to send to multiple recipients efficiently");
if (msg.LengthBytes > m_configuration.MaximumTransmissionUnit)
throw new NetException("Unconnected messages too long! Must be shorter than NetConfiguration.MaximumTransmissionUnit (currently " + m_configuration.MaximumTransmissionUnit + ")");
IPAddress adr = NetUtility.Resolve(host);
if (adr == null)
throw new NetException("Failed to resolve " + host);
msg.m_messageType = NetMessageType.Unconnected;
msg.m_isSent = true;
Interlocked.Increment(ref msg.m_recyclingCount);
m_unsentUnconnectedMessages.Enqueue(new NetTuple<IPEndPoint, NetOutgoingMessage>(new IPEndPoint(adr, port), msg));
}
/// <summary>
/// Send a message to an unconnected host
/// </summary>
public void SendUnconnectedMessage(NetOutgoingMessage msg, IPEndPoint recipient)
{
if (msg == null)
throw new ArgumentNullException("msg");
if (recipient == null)
throw new ArgumentNullException("recipient");
if (msg.m_isSent)
throw new NetException("This message has already been sent! Use NetPeer.SendMessage() to send to multiple recipients efficiently");
if (msg.LengthBytes > m_configuration.MaximumTransmissionUnit)
throw new NetException("Unconnected messages too long! Must be shorter than NetConfiguration.MaximumTransmissionUnit (currently " + m_configuration.MaximumTransmissionUnit + ")");
msg.m_messageType = NetMessageType.Unconnected;
msg.m_isSent = true;
Interlocked.Increment(ref msg.m_recyclingCount);
m_unsentUnconnectedMessages.Enqueue(new NetTuple<IPEndPoint, NetOutgoingMessage>(recipient, msg));
}
/// <summary>
/// Send a message to an unconnected host
/// </summary>
public void SendUnconnectedMessage(NetOutgoingMessage msg, IList<IPEndPoint> recipients)
{
if (msg == null)
throw new ArgumentNullException("msg");
if (recipients == null)
throw new ArgumentNullException("recipients");
if (recipients.Count < 1)
throw new NetException("recipients must contain at least one item");
if (msg.m_isSent)
throw new NetException("This message has already been sent! Use NetPeer.SendMessage() to send to multiple recipients efficiently");
if (msg.LengthBytes > m_configuration.MaximumTransmissionUnit)
throw new NetException("Unconnected messages too long! Must be shorter than NetConfiguration.MaximumTransmissionUnit (currently " + m_configuration.MaximumTransmissionUnit + ")");
msg.m_messageType = NetMessageType.Unconnected;
msg.m_isSent = true;
Interlocked.Add(ref msg.m_recyclingCount, recipients.Count);
foreach(IPEndPoint ep in recipients)
m_unsentUnconnectedMessages.Enqueue(new NetTuple<IPEndPoint, NetOutgoingMessage>(ep, msg));
}
/// <summary>
/// Send a message to this exact same netpeer (loopback)
/// </summary>
public void SendUnconnectedToSelf(NetOutgoingMessage msg)
{
if (msg == null)
throw new ArgumentNullException("msg");
if (msg.m_isSent)
throw new NetException("This message has already been sent! Use NetPeer.SendMessage() to send to multiple recipients efficiently");
msg.m_messageType = NetMessageType.Unconnected;
msg.m_isSent = true;
if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.UnconnectedData) == false)
return; // dropping unconnected message since it's not enabled for receiving
NetIncomingMessage om = CreateIncomingMessage(NetIncomingMessageType.UnconnectedData, msg.LengthBytes);
om.m_isFragment = false;
om.m_receiveTime = NetTime.Now;
om.m_senderConnection = null;
om.m_senderEndPoint = m_socket.LocalEndPoint as IPEndPoint;
om.m_bitLength = msg.LengthBits;
ReleaseMessage(om);
}
}
}

View File

@@ -1,329 +0,0 @@
using System;
using System.Threading;
using System.Collections.Generic;
using System.Net;
namespace Lidgren.Network
{
/// <summary>
/// Represents a local peer capable of holding zero, one or more connections to remote peers
/// </summary>
public partial class NetPeer
{
private static int s_initializedPeersCount;
private int m_listenPort;
private object m_tag;
internal readonly List<NetConnection> m_connections;
private readonly Dictionary<IPEndPoint, NetConnection> m_connectionLookup;
private string m_shutdownReason;
/// <summary>
/// Gets the NetPeerStatus of the NetPeer
/// </summary>
public NetPeerStatus Status { get { return m_status; } }
/// <summary>
/// Signalling event which can be waited on to determine when a message is queued for reading.
/// Note that there is no guarantee that after the event is signaled the blocked thread will
/// find the message in the queue. Other user created threads could be preempted and dequeue
/// the message before the waiting thread wakes up.
/// </summary>
public AutoResetEvent MessageReceivedEvent { get { return m_messageReceivedEvent; } }
/// <summary>
/// Gets a unique identifier for this NetPeer based on Mac address and ip/port. Note! Not available until Start() has been called!
/// </summary>
public long UniqueIdentifier { get { return m_uniqueIdentifier; } }
/// <summary>
/// Gets the port number this NetPeer is listening and sending on, if Start() has been called
/// </summary>
public int Port { get { return m_listenPort; } }
/// <summary>
/// Returns an UPnP object if enabled in the NetPeerConfiguration
/// </summary>
public NetUPnP UPnP { get { return m_upnp; } }
/// <summary>
/// Gets or sets the application defined object containing data about the peer
/// </summary>
public object Tag
{
get { return m_tag; }
set { m_tag = value; }
}
/// <summary>
/// Gets a copy of the list of connections
/// </summary>
public List<NetConnection> Connections
{
get
{
lock (m_connections)
return new List<NetConnection>(m_connections);
}
}
/// <summary>
/// Gets the number of active connections
/// </summary>
public int ConnectionsCount
{
get { return m_connections.Count; }
}
/// <summary>
/// Statistics on this NetPeer since it was initialized
/// </summary>
public NetPeerStatistics Statistics
{
get { return m_statistics; }
}
/// <summary>
/// Gets the configuration used to instanciate this NetPeer
/// </summary>
public NetPeerConfiguration Configuration { get { return m_configuration; } }
/// <summary>
/// NetPeer constructor
/// </summary>
public NetPeer(NetPeerConfiguration config)
{
m_configuration = config;
m_statistics = new NetPeerStatistics(this);
m_releasedIncomingMessages = new NetQueue<NetIncomingMessage>(4);
m_unsentUnconnectedMessages = new NetQueue<NetTuple<IPEndPoint, NetOutgoingMessage>>(2);
m_connections = new List<NetConnection>();
m_connectionLookup = new Dictionary<IPEndPoint, NetConnection>();
m_handshakes = new Dictionary<IPEndPoint, NetConnection>();
m_senderRemote = (EndPoint)new IPEndPoint(IPAddress.Any, 0);
m_status = NetPeerStatus.NotRunning;
m_receivedFragmentGroups = new Dictionary<NetConnection, Dictionary<int, ReceivedFragmentGroup>>();
}
/// <summary>
/// Binds to socket and spawns the networking thread
/// </summary>
public void Start()
{
if (m_status != NetPeerStatus.NotRunning)
{
// already running! Just ignore...
LogWarning("Start() called on already running NetPeer - ignoring.");
return;
}
m_status = NetPeerStatus.Starting;
// fix network thread name
if (m_configuration.NetworkThreadName == "Lidgren network thread")
{
int pc = Interlocked.Increment(ref s_initializedPeersCount);
m_configuration.NetworkThreadName = "Lidgren network thread " + pc.ToString();
}
InitializeNetwork();
// start network thread
m_networkThread = new Thread(new ThreadStart(NetworkLoop));
m_networkThread.Name = m_configuration.NetworkThreadName;
m_networkThread.IsBackground = true;
m_networkThread.Start();
// send upnp discovery
if (m_upnp != null)
m_upnp.Discover(this);
// allow some time for network thread to start up in case they call Connect() or UPnP calls immediately
Thread.Sleep(50);
}
/// <summary>
/// Get the connection, if any, for a certain remote endpoint
/// </summary>
public NetConnection GetConnection(IPEndPoint ep)
{
NetConnection retval;
// this should not pose a threading problem, m_connectionLookup is never added to concurrently
// and TryGetValue will not throw an exception on fail, only yield null, which is acceptable
m_connectionLookup.TryGetValue(ep, out retval);
return retval;
}
/// <summary>
/// Read a pending message from any connection, blocking up to maxMillis if needed
/// </summary>
public NetIncomingMessage WaitMessage(int maxMillis)
{
var msg = ReadMessage();
if (msg != null)
return msg; // no need to wait; we already have a message to deliver
if (m_messageReceivedEvent != null)
m_messageReceivedEvent.WaitOne(maxMillis);
return ReadMessage();
}
/// <summary>
/// Read a pending message from any connection, if any
/// </summary>
public NetIncomingMessage ReadMessage()
{
NetIncomingMessage retval;
if (m_releasedIncomingMessages.TryDequeue(out retval))
{
if (retval.MessageType == NetIncomingMessageType.StatusChanged)
{
NetConnectionStatus status = (NetConnectionStatus)retval.PeekByte();
retval.SenderConnection.m_visibleStatus = status;
}
}
return retval;
}
/// <summary>
/// Read a pending message from any connection, if any
/// </summary>
public int ReadMessages(IList<NetIncomingMessage> addTo)
{
int added = m_releasedIncomingMessages.TryDrain(addTo);
if (added > 0)
{
for (int i = 0; i < added; i++)
{
var index = addTo.Count - added + i;
var nim = addTo[index];
if (nim.MessageType == NetIncomingMessageType.StatusChanged)
{
NetConnectionStatus status = (NetConnectionStatus)nim.PeekByte();
nim.SenderConnection.m_visibleStatus = status;
}
}
}
return added;
}
// send message immediately
internal void SendLibrary(NetOutgoingMessage msg, IPEndPoint recipient)
{
VerifyNetworkThread();
NetException.Assert(msg.m_isSent == false);
bool connReset;
int len = msg.Encode(m_sendBuffer, 0, 0);
SendPacket(len, recipient, 1, out connReset);
}
/// <summary>
/// Create a connection to a remote endpoint
/// </summary>
public NetConnection Connect(string host, int port)
{
return Connect(new IPEndPoint(NetUtility.Resolve(host), port), null);
}
/// <summary>
/// Create a connection to a remote endpoint
/// </summary>
public NetConnection Connect(string host, int port, NetOutgoingMessage hailMessage)
{
return Connect(new IPEndPoint(NetUtility.Resolve(host), port), hailMessage);
}
/// <summary>
/// Create a connection to a remote endpoint
/// </summary>
public NetConnection Connect(IPEndPoint remoteEndPoint)
{
return Connect(remoteEndPoint, null);
}
/// <summary>
/// Create a connection to a remote endpoint
/// </summary>
public virtual NetConnection Connect(IPEndPoint remoteEndPoint, NetOutgoingMessage hailMessage)
{
if (remoteEndPoint == null)
throw new ArgumentNullException("remoteEndPoint");
lock (m_connections)
{
if (m_status == NetPeerStatus.NotRunning)
throw new NetException("Must call Start() first");
if (m_connectionLookup.ContainsKey(remoteEndPoint))
throw new NetException("Already connected to that endpoint!");
NetConnection hs;
if (m_handshakes.TryGetValue(remoteEndPoint, out hs))
{
// already trying to connect to that endpoint; make another try
switch (hs.m_status)
{
case NetConnectionStatus.InitiatedConnect:
// send another connect
hs.m_connectRequested = true;
break;
case NetConnectionStatus.RespondedConnect:
// send another response
hs.SendConnectResponse((float)NetTime.Now, false);
break;
default:
// weird
LogWarning("Weird situation; Connect() already in progress to remote endpoint; but hs status is " + hs.m_status);
break;
}
return hs;
}
NetConnection conn = new NetConnection(this, remoteEndPoint);
conn.m_status = NetConnectionStatus.InitiatedConnect;
conn.m_localHailMessage = hailMessage;
// handle on network thread
conn.m_connectRequested = true;
conn.m_connectionInitiator = true;
m_handshakes.Add(remoteEndPoint, conn);
return conn;
}
}
/// <summary>
/// Send raw bytes; only used for debugging
/// </summary>
#if DEBUG
public void RawSend(byte[] arr, int offset, int length, IPEndPoint destination)
#else
internal void RawSend(byte[] arr, int offset, int length, IPEndPoint destination)
#endif
{
// wrong thread - this miiiight crash with network thread... but what's a boy to do.
Array.Copy(arr, offset, m_sendBuffer, 0, length);
bool unused;
SendPacket(length, destination, 1, out unused);
}
/// <summary>
/// Disconnects all active connections and closes the socket
/// </summary>
public void Shutdown(string bye)
{
// called on user thread
if (m_socket == null)
return; // already shut down
LogDebug("Shutdown requested");
m_shutdownReason = bye;
m_status = NetPeerStatus.ShutdownRequested;
}
}
}

View File

@@ -1,471 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Net;
namespace Lidgren.Network
{
/// <summary>
/// Partly immutable after NetPeer has been initialized
/// </summary>
public sealed class NetPeerConfiguration
{
private const string c_isLockedMessage = "You may not modify the NetPeerConfiguration after it has been used to initialize a NetPeer";
private bool m_isLocked;
private readonly string m_appIdentifier;
private string m_networkThreadName;
private IPAddress m_localAddress;
private IPAddress m_broadcastAddress;
internal bool m_acceptIncomingConnections;
internal int m_maximumConnections;
internal int m_defaultOutgoingMessageCapacity;
internal float m_pingInterval;
internal bool m_useMessageRecycling;
internal float m_connectionTimeout;
internal bool m_enableUPnP;
internal bool m_autoFlushSendQueue;
internal NetIncomingMessageType m_disabledTypes;
internal int m_port;
internal int m_receiveBufferSize;
internal int m_sendBufferSize;
internal float m_resendHandshakeInterval;
internal int m_maximumHandshakeAttempts;
// bad network simulation
internal float m_loss;
internal float m_duplicates;
internal float m_minimumOneWayLatency;
internal float m_randomOneWayLatency;
// MTU
internal int m_maximumTransmissionUnit;
internal bool m_autoExpandMTU;
internal float m_expandMTUFrequency;
internal int m_expandMTUFailAttempts;
/// <summary>
/// NetPeerConfiguration constructor
/// </summary>
public NetPeerConfiguration(string appIdentifier)
{
if (string.IsNullOrEmpty(appIdentifier))
throw new NetException("App identifier must be at least one character long");
m_appIdentifier = appIdentifier.ToString(System.Globalization.CultureInfo.InvariantCulture);
//
// default values
//
m_disabledTypes = NetIncomingMessageType.ConnectionApproval | NetIncomingMessageType.UnconnectedData | NetIncomingMessageType.VerboseDebugMessage | NetIncomingMessageType.ConnectionLatencyUpdated;
m_networkThreadName = "Lidgren network thread";
m_localAddress = IPAddress.Any;
m_broadcastAddress = IPAddress.Broadcast;
var ip = NetUtility.GetBroadcastAddress();
if (ip != null)
{
m_broadcastAddress = ip;
}
m_port = 0;
m_receiveBufferSize = 131071;
m_sendBufferSize = 131071;
m_acceptIncomingConnections = false;
m_maximumConnections = 32;
m_defaultOutgoingMessageCapacity = 16;
m_pingInterval = 4.0f;
m_connectionTimeout = 25.0f;
m_useMessageRecycling = true;
m_resendHandshakeInterval = 3.0f;
m_maximumHandshakeAttempts = 5;
m_autoFlushSendQueue = true;
// Maximum transmission unit
// Ethernet can take 1500 bytes of payload, so lets stay below that.
// The aim is for a max full packet to be 1440 bytes (30 x 48 bytes, lower than 1468)
// -20 bytes IP header
// -8 bytes UDP header
// -4 bytes to be on the safe side and align to 8-byte boundary
// Total 1408 bytes
// Note that lidgren headers (5 bytes) are not included here; since it's part of the "mtu payload"
m_maximumTransmissionUnit = 1408;
m_autoExpandMTU = false;
m_expandMTUFrequency = 2.0f;
m_expandMTUFailAttempts = 5;
m_loss = 0.0f;
m_minimumOneWayLatency = 0.0f;
m_randomOneWayLatency = 0.0f;
m_duplicates = 0.0f;
m_isLocked = false;
}
internal void Lock()
{
m_isLocked = true;
}
/// <summary>
/// Gets the identifier of this application; the library can only connect to matching app identifier peers
/// </summary>
public string AppIdentifier
{
get { return m_appIdentifier; }
}
/// <summary>
/// Enables receiving of the specified type of message
/// </summary>
public void EnableMessageType(NetIncomingMessageType type)
{
m_disabledTypes &= (~type);
}
/// <summary>
/// Disables receiving of the specified type of message
/// </summary>
public void DisableMessageType(NetIncomingMessageType type)
{
m_disabledTypes |= type;
}
/// <summary>
/// Enables or disables receiving of the specified type of message
/// </summary>
public void SetMessageTypeEnabled(NetIncomingMessageType type, bool enabled)
{
if (enabled)
m_disabledTypes &= (~type);
else
m_disabledTypes |= type;
}
/// <summary>
/// Gets if receiving of the specified type of message is enabled
/// </summary>
public bool IsMessageTypeEnabled(NetIncomingMessageType type)
{
return !((m_disabledTypes & type) == type);
}
/// <summary>
/// Gets or sets the name of the library network thread. Cannot be changed once NetPeer is initialized.
/// </summary>
public string NetworkThreadName
{
get { return m_networkThreadName; }
set
{
if (m_isLocked)
throw new NetException("NetworkThreadName may not be set after the NetPeer which uses the configuration has been started");
m_networkThreadName = value;
}
}
/// <summary>
/// Gets or sets the maximum amount of connections this peer can hold. Cannot be changed once NetPeer is initialized.
/// </summary>
public int MaximumConnections
{
get { return m_maximumConnections; }
set
{
if (m_isLocked)
throw new NetException(c_isLockedMessage);
m_maximumConnections = value;
}
}
/// <summary>
/// Gets or sets the maximum amount of bytes to send in a single packet, excluding ip, udp and lidgren headers. Cannot be changed once NetPeer is initialized.
/// </summary>
public int MaximumTransmissionUnit
{
get { return m_maximumTransmissionUnit; }
set
{
if (m_isLocked)
throw new NetException(c_isLockedMessage);
if (value < 1 || value >= ((ushort.MaxValue + 1) / 8))
throw new NetException("MaximumTransmissionUnit must be between 1 and " + (((ushort.MaxValue + 1) / 8) - 1) + " bytes");
m_maximumTransmissionUnit = value;
}
}
/// <summary>
/// Gets or sets the default capacity in bytes when NetPeer.CreateMessage() is called without argument
/// </summary>
public int DefaultOutgoingMessageCapacity
{
get { return m_defaultOutgoingMessageCapacity; }
set { m_defaultOutgoingMessageCapacity = value; }
}
/// <summary>
/// Gets or sets the time between latency calculating pings
/// </summary>
public float PingInterval
{
get { return m_pingInterval; }
set { m_pingInterval = value; }
}
/// <summary>
/// Gets or sets if the library should recycling messages to avoid excessive garbage collection. Cannot be changed once NetPeer is initialized.
/// </summary>
public bool UseMessageRecycling
{
get { return m_useMessageRecycling; }
set
{
if (m_isLocked)
throw new NetException(c_isLockedMessage);
m_useMessageRecycling = value;
}
}
/// <summary>
/// Gets or sets the number of seconds timeout will be postponed on a successful ping/pong
/// </summary>
public float ConnectionTimeout
{
get { return m_connectionTimeout; }
set
{
if (value < m_pingInterval)
throw new NetException("Connection timeout cannot be lower than ping interval!");
m_connectionTimeout = value;
}
}
/// <summary>
/// Enables UPnP support; enabling port forwarding and getting external ip
/// </summary>
public bool EnableUPnP
{
get { return m_enableUPnP; }
set
{
if (m_isLocked)
throw new NetException(c_isLockedMessage);
m_enableUPnP = value;
}
}
/// <summary>
/// Enables or disables automatic flushing of the send queue. If disabled, you must manully call NetPeer.FlushSendQueue() to flush sent messages to network.
/// </summary>
public bool AutoFlushSendQueue
{
get { return m_autoFlushSendQueue; }
set { m_autoFlushSendQueue = value; }
}
/// <summary>
/// Gets or sets the local ip address to bind to. Defaults to IPAddress.Any. Cannot be changed once NetPeer is initialized.
/// </summary>
public IPAddress LocalAddress
{
get { return m_localAddress; }
set
{
if (m_isLocked)
throw new NetException(c_isLockedMessage);
m_localAddress = value;
}
}
/// <summary>
/// Gets or sets the local broadcast address to use when broadcasting
/// </summary>
public IPAddress BroadcastAddress
{
get { return m_broadcastAddress; }
set
{
if (m_isLocked)
throw new NetException(c_isLockedMessage);
m_broadcastAddress = value;
}
}
/// <summary>
/// Gets or sets the local port to bind to. Defaults to 0. Cannot be changed once NetPeer is initialized.
/// </summary>
public int Port
{
get { return m_port; }
set
{
if (m_isLocked)
throw new NetException(c_isLockedMessage);
m_port = value;
}
}
/// <summary>
/// Gets or sets the size in bytes of the receiving buffer. Defaults to 131071 bytes. Cannot be changed once NetPeer is initialized.
/// </summary>
public int ReceiveBufferSize
{
get { return m_receiveBufferSize; }
set
{
if (m_isLocked)
throw new NetException(c_isLockedMessage);
m_receiveBufferSize = value;
}
}
/// <summary>
/// Gets or sets the size in bytes of the sending buffer. Defaults to 131071 bytes. Cannot be changed once NetPeer is initialized.
/// </summary>
public int SendBufferSize
{
get { return m_sendBufferSize; }
set
{
if (m_isLocked)
throw new NetException(c_isLockedMessage);
m_sendBufferSize = value;
}
}
/// <summary>
/// Gets or sets if the NetPeer should accept incoming connections. This is automatically set to true in NetServer and false in NetClient.
/// </summary>
public bool AcceptIncomingConnections
{
get { return m_acceptIncomingConnections; }
set { m_acceptIncomingConnections = value; }
}
/// <summary>
/// Gets or sets the number of seconds between handshake attempts
/// </summary>
public float ResendHandshakeInterval
{
get { return m_resendHandshakeInterval; }
set { m_resendHandshakeInterval = value; }
}
/// <summary>
/// Gets or sets the maximum number of handshake attempts before failing to connect
/// </summary>
public int MaximumHandshakeAttempts
{
get { return m_maximumHandshakeAttempts; }
set
{
if (value < 1)
throw new NetException("MaximumHandshakeAttempts must be at least 1");
m_maximumHandshakeAttempts = value;
}
}
/// <summary>
/// Gets or sets if the NetPeer should send large messages to try to expand the maximum transmission unit size
/// </summary>
public bool AutoExpandMTU
{
get { return m_autoExpandMTU; }
set
{
if (m_isLocked)
throw new NetException(c_isLockedMessage);
m_autoExpandMTU = value;
}
}
/// <summary>
/// Gets or sets how often to send large messages to expand MTU if AutoExpandMTU is enabled
/// </summary>
public float ExpandMTUFrequency
{
get { return m_expandMTUFrequency; }
set { m_expandMTUFrequency = value; }
}
/// <summary>
/// Gets or sets the number of failed expand mtu attempts to perform before setting final MTU
/// </summary>
public int ExpandMTUFailAttempts
{
get { return m_expandMTUFailAttempts; }
set { m_expandMTUFailAttempts = value; }
}
#if DEBUG
/// <summary>
/// Gets or sets the simulated amount of sent packets lost from 0.0f to 1.0f
/// </summary>
public float SimulatedLoss
{
get { return m_loss; }
set { m_loss = value; }
}
/// <summary>
/// Gets or sets the minimum simulated amount of one way latency for sent packets in seconds
/// </summary>
public float SimulatedMinimumLatency
{
get { return m_minimumOneWayLatency; }
set { m_minimumOneWayLatency = value; }
}
/// <summary>
/// Gets or sets the simulated added random amount of one way latency for sent packets in seconds
/// </summary>
public float SimulatedRandomLatency
{
get { return m_randomOneWayLatency; }
set { m_randomOneWayLatency = value; }
}
/// <summary>
/// Gets the average simulated one way latency in seconds
/// </summary>
public float SimulatedAverageLatency
{
get { return m_minimumOneWayLatency + (m_randomOneWayLatency * 0.5f); }
}
/// <summary>
/// Gets or sets the simulated amount of duplicated packets from 0.0f to 1.0f
/// </summary>
public float SimulatedDuplicatesChance
{
get { return m_duplicates; }
set { m_duplicates = value; }
}
#endif
/// <summary>
/// Creates a memberwise shallow clone of this configuration
/// </summary>
public NetPeerConfiguration Clone()
{
NetPeerConfiguration retval = this.MemberwiseClone() as NetPeerConfiguration;
retval.m_isLocked = false;
return retval;
}
}
}

View File

@@ -1,161 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
// Uncomment the line below to get statistics in RELEASE builds
#define USE_RELEASE_STATISTICS
using System;
using System.Text;
using System.Diagnostics;
namespace Lidgren.Network
{
/// <summary>
/// Statistics for a NetPeer instance
/// </summary>
public sealed class NetPeerStatistics
{
private readonly NetPeer m_peer;
internal int m_sentPackets;
internal int m_receivedPackets;
internal int m_sentMessages;
internal int m_receivedMessages;
internal int m_sentBytes;
internal int m_receivedBytes;
internal long m_bytesAllocated;
internal NetPeerStatistics(NetPeer peer)
{
m_peer = peer;
Reset();
}
internal void Reset()
{
m_sentPackets = 0;
m_receivedPackets = 0;
m_sentMessages = 0;
m_receivedMessages = 0;
m_sentBytes = 0;
m_receivedBytes = 0;
m_bytesAllocated = 0;
}
/// <summary>
/// Gets the number of sent packets since the NetPeer was initialized
/// </summary>
public int SentPackets { get { return m_sentPackets; } }
/// <summary>
/// Gets the number of received packets since the NetPeer was initialized
/// </summary>
public int ReceivedPackets { get { return m_receivedPackets; } }
/// <summary>
/// Gets the number of sent messages since the NetPeer was initialized
/// </summary>
public int SentMessages { get { return m_sentMessages; } }
/// <summary>
/// Gets the number of received messages since the NetPeer was initialized
/// </summary>
public int ReceivedMessages { get { return m_receivedMessages; } }
/// <summary>
/// Gets the number of sent bytes since the NetPeer was initialized
/// </summary>
public int SentBytes { get { return m_sentBytes; } }
/// <summary>
/// Gets the number of received bytes since the NetPeer was initialized
/// </summary>
public int ReceivedBytes { get { return m_receivedBytes; } }
/// <summary>
/// Gets the number of bytes allocated (and possibly garbage collected) for message storage
/// </summary>
public long StorageBytesAllocated { get { return m_bytesAllocated; } }
/// <summary>
/// Gets the number of bytes in the recycled pool
/// </summary>
public int BytesInRecyclePool { get { return m_peer.m_storagePoolBytes; } }
#if USE_RELEASE_STATISTICS
internal void PacketSent(int numBytes, int numMessages)
{
m_sentPackets++;
m_sentBytes += numBytes;
m_sentMessages += numMessages;
}
#else
[Conditional("DEBUG")]
internal void PacketSent(int numBytes, int numMessages)
{
m_sentPackets++;
m_sentBytes += numBytes;
m_sentMessages += numMessages;
}
#endif
#if USE_RELEASE_STATISTICS
internal void PacketReceived(int numBytes, int numMessages)
{
m_receivedPackets++;
m_receivedBytes += numBytes;
m_receivedMessages += numMessages;
}
#else
[Conditional("DEBUG")]
internal void PacketReceived(int numBytes, int numMessages)
{
m_receivedPackets++;
m_receivedBytes += numBytes;
m_receivedMessages += numMessages;
}
#endif
/// <summary>
/// Returns a string that represents this object
/// </summary>
public override string ToString()
{
StringBuilder bdr = new StringBuilder();
bdr.AppendLine(m_peer.ConnectionsCount.ToString() + " connections");
#if DEBUG || USE_RELEASE_STATISTICS
bdr.AppendLine("Sent " + m_sentBytes + " bytes in " + m_sentMessages + " messages in " + m_sentPackets + " packets");
bdr.AppendLine("Received " + m_receivedBytes + " bytes in " + m_receivedMessages + " messages in " + m_receivedPackets + " packets");
#else
bdr.AppendLine("Sent (n/a) bytes in (n/a) messages in (n/a) packets");
bdr.AppendLine("Received (n/a) bytes in (n/a) messages in (n/a) packets");
#endif
bdr.AppendLine("Storage allocated " + m_bytesAllocated + " bytes");
bdr.AppendLine("Recycled pool " + m_peer.m_storagePoolBytes + " bytes");
return bdr.ToString();
}
}
}

View File

@@ -1,49 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
namespace Lidgren.Network
{
/// <summary>
/// Status for a NetPeer instance
/// </summary>
public enum NetPeerStatus
{
/// <summary>
/// NetPeer is not running; socket is not bound
/// </summary>
NotRunning = 0,
/// <summary>
/// NetPeer is in the process of starting up
/// </summary>
Starting = 1,
/// <summary>
/// NetPeer is bound to socket and listening for packets
/// </summary>
Running = 2,
/// <summary>
/// Shutdown has been requested and will be executed shortly
/// </summary>
ShutdownRequested = 3,
}
}

View File

@@ -1,283 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Diagnostics;
using System.Collections.Generic;
// @TODO: examine performance characteristics of using SpinLock when using .Net 4.0
namespace Lidgren.Network
{
/// <summary>
/// Thread safe (blocking) expanding queue with TryDequeue() and EnqueueFirst()
/// </summary>
[DebuggerDisplay("Count={Count} Capacity={Capacity}")]
public sealed class NetQueue<T>
{
// Example:
// m_capacity = 8
// m_size = 6
// m_head = 4
//
// [0] item
// [1] item (tail = ((head + size - 1) % capacity)
// [2]
// [3]
// [4] item (head)
// [5] item
// [6] item
// [7] item
//
private T[] m_items;
private readonly object m_lock;
private int m_size;
private int m_head;
/// <summary>
/// Gets the number of items in the queue
/// </summary>
public int Count { get { return m_size; } }
/// <summary>
/// Gets the current capacity for the queue
/// </summary>
public int Capacity { get { return m_items.Length; } }
/// <summary>
/// NetQueue constructor
/// </summary>
public NetQueue(int initialCapacity)
{
m_lock = new object();
m_items = new T[initialCapacity];
}
/// <summary>
/// Adds an item last/tail of the queue
/// </summary>
public void Enqueue(T item)
{
lock (m_lock)
{
if (m_size == m_items.Length)
SetCapacity(m_items.Length + 8);
int slot = (m_head + m_size) % m_items.Length;
m_items[slot] = item;
m_size++;
}
}
/// <summary>
/// Adds an item last/tail of the queue
/// </summary>
public void Enqueue(IEnumerable<T> items)
{
lock (m_lock)
{
foreach (var item in items)
{
if (m_size == m_items.Length)
SetCapacity(m_items.Length + 8); // @TODO move this out of loop
int slot = (m_head + m_size) % m_items.Length;
m_items[slot] = item;
m_size++;
}
}
}
/// <summary>
/// Places an item first, at the head of the queue
/// </summary>
public void EnqueueFirst(T item)
{
lock (m_lock)
{
if (m_size >= m_items.Length)
SetCapacity(m_items.Length + 8);
m_head--;
if (m_head < 0)
m_head = m_items.Length - 1;
m_items[m_head] = item;
m_size++;
}
}
// must be called from within a lock(m_lock) !
private void SetCapacity(int newCapacity)
{
if (m_size == 0)
{
if (m_size == 0)
{
m_items = new T[newCapacity];
m_head = 0;
return;
}
}
T[] newItems = new T[newCapacity];
if (m_head + m_size - 1 < m_items.Length)
{
Array.Copy(m_items, m_head, newItems, 0, m_size);
}
else
{
Array.Copy(m_items, m_head, newItems, 0, m_items.Length - m_head);
Array.Copy(m_items, 0, newItems, m_items.Length - m_head, (m_size - (m_items.Length - m_head)));
}
m_items = newItems;
m_head = 0;
}
/// <summary>
/// Gets an item from the head of the queue, or returns default(T) if empty
/// </summary>
public bool TryDequeue(out T item)
{
if (m_size == 0)
{
item = default(T);
return false;
}
lock (m_lock)
{
if (m_size == 0)
{
item = default(T);
return false;
}
item = m_items[m_head];
m_items[m_head] = default(T);
m_head = (m_head + 1) % m_items.Length;
m_size--;
return true;
}
}
/// <summary>
/// Gets an item from the head of the queue, or returns default(T) if empty
/// </summary>
public int TryDrain(IList<T> addTo)
{
if (m_size == 0)
return 0;
lock (m_lock)
{
int added = m_size;
while (m_size > 0)
{
var item = m_items[m_head];
addTo.Add(item);
m_items[m_head] = default(T);
m_head = (m_head + 1) % m_items.Length;
m_size--;
}
return added;
}
}
/// <summary>
/// Returns default(T) if queue is empty
/// </summary>
public T TryPeek(int offset)
{
if (m_size == 0)
return default(T);
lock (m_lock)
{
if (m_size == 0)
return default(T);
return m_items[(m_head + offset) % m_items.Length];
}
}
/// <summary>
/// Determines whether an item is in the queue
/// </summary>
public bool Contains(T item)
{
lock (m_lock)
{
int ptr = m_head;
for (int i = 0; i < m_size; i++)
{
if (m_items[ptr] == null)
{
if (item == null)
return true;
}
else
{
if (m_items[ptr].Equals(item))
return true;
}
ptr = (ptr + 1) % m_items.Length;
}
}
return false;
}
/// <summary>
/// Copies the queue items to a new array
/// </summary>
public T[] ToArray()
{
lock (m_lock)
{
T[] retval = new T[m_size];
int ptr = m_head;
for (int i = 0; i < m_size; i++)
{
retval[i] = m_items[ptr++];
if (ptr >= m_items.Length)
ptr = 0;
}
return retval;
}
}
/// <summary>
/// Removes all objects from the queue
/// </summary>
public void Clear()
{
lock (m_lock)
{
for (int i = 0; i < m_items.Length; i++)
m_items[i] = default(T);
m_head = 0;
m_size = 0;
}
}
}
}

View File

@@ -1,281 +0,0 @@
using System;
using System.Security.Cryptography;
namespace Lidgren.Network
{
/// <summary>
/// Multiply With Carry random
/// </summary>
public class MWCRandom : NetRandom
{
/// <summary>
/// Get global instance of MWCRandom
/// </summary>
public static new readonly MWCRandom Instance = new MWCRandom();
private uint m_w, m_z;
/// <summary>
/// Constructor with randomized seed
/// </summary>
public MWCRandom()
{
Initialize(NetRandomSeed.GetUInt64());
}
/// <summary>
/// (Re)initialize this instance with provided 32 bit seed
/// </summary>
[CLSCompliant(false)]
public override void Initialize(uint seed)
{
m_w = seed;
m_z = seed * 16777619;
}
/// <summary>
/// (Re)initialize this instance with provided 64 bit seed
/// </summary>
[CLSCompliant(false)]
public void Initialize(ulong seed)
{
m_w = (uint)seed;
m_z = (uint)(seed >> 32);
}
/// <summary>
/// Generates a random value from UInt32.MinValue to UInt32.MaxValue, inclusively
/// </summary>
[CLSCompliant(false)]
public override uint NextUInt32()
{
m_z = 36969 * (m_z & 65535) + (m_z >> 16);
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
return ((m_z << 16) + m_w);
}
}
/// <summary>
/// Xor Shift based random
/// </summary>
public sealed class XorShiftRandom : NetRandom
{
/// <summary>
/// Get global instance of XorShiftRandom
/// </summary>
public static new readonly XorShiftRandom Instance = new XorShiftRandom();
private const uint c_x = 123456789;
private const uint c_y = 362436069;
private const uint c_z = 521288629;
private const uint c_w = 88675123;
private uint m_x, m_y, m_z, m_w;
/// <summary>
/// Constructor with randomized seed
/// </summary>
public XorShiftRandom()
{
Initialize(NetRandomSeed.GetUInt64());
}
/// <summary>
/// Constructor with provided 64 bit seed
/// </summary>
[CLSCompliant(false)]
public XorShiftRandom(ulong seed)
{
Initialize(seed);
}
/// <summary>
/// (Re)initialize this instance with provided 32 bit seed
/// </summary>
[CLSCompliant(false)]
public override void Initialize(uint seed)
{
m_x = (uint)seed;
m_y = c_y;
m_z = c_z;
m_w = c_w;
}
/// <summary>
/// (Re)initialize this instance with provided 64 bit seed
/// </summary>
[CLSCompliant(false)]
public void Initialize(ulong seed)
{
m_x = (uint)seed;
m_y = c_y;
m_z = (uint)(seed << 32);
m_w = c_w;
}
/// <summary>
/// Generates a random value from UInt32.MinValue to UInt32.MaxValue, inclusively
/// </summary>
[CLSCompliant(false)]
public override uint NextUInt32()
{
uint t = (m_x ^ (m_x << 11));
m_x = m_y; m_y = m_z; m_z = m_w;
return (m_w = (m_w ^ (m_w >> 19)) ^ (t ^ (t >> 8)));
}
}
/// <summary>
/// Mersenne Twister based random
/// </summary>
public sealed class MersenneTwisterRandom : NetRandom
{
/// <summary>
/// Get global instance of MersenneTwisterRandom
/// </summary>
public static new readonly MersenneTwisterRandom Instance = new MersenneTwisterRandom();
private const int N = 624;
private const int M = 397;
private const uint MATRIX_A = 0x9908b0dfU;
private const uint UPPER_MASK = 0x80000000U;
private const uint LOWER_MASK = 0x7fffffffU;
private const uint TEMPER1 = 0x9d2c5680U;
private const uint TEMPER2 = 0xefc60000U;
private const int TEMPER3 = 11;
private const int TEMPER4 = 7;
private const int TEMPER5 = 15;
private const int TEMPER6 = 18;
private UInt32[] mt;
private int mti;
private UInt32[] mag01;
private const double c_realUnitInt = 1.0 / ((double)int.MaxValue + 1.0);
/// <summary>
/// Constructor with randomized seed
/// </summary>
public MersenneTwisterRandom()
{
Initialize(NetRandomSeed.GetUInt32());
}
/// <summary>
/// Constructor with provided 32 bit seed
/// </summary>
[CLSCompliant(false)]
public MersenneTwisterRandom(uint seed)
{
Initialize(seed);
}
/// <summary>
/// (Re)initialize this instance with provided 32 bit seed
/// </summary>
[CLSCompliant(false)]
public override void Initialize(uint seed)
{
mt = new UInt32[N];
mti = N + 1;
mag01 = new UInt32[] { 0x0U, MATRIX_A };
mt[0] = seed;
for (int i = 1; i < N; i++)
mt[i] = (UInt32)(1812433253 * (mt[i - 1] ^ (mt[i - 1] >> 30)) + i);
}
/// <summary>
/// Generates a random value from UInt32.MinValue to UInt32.MaxValue, inclusively
/// </summary>
[CLSCompliant(false)]
public override uint NextUInt32()
{
UInt32 y;
if (mti >= N)
{
GenRandAll();
mti = 0;
}
y = mt[mti++];
y ^= (y >> TEMPER3);
y ^= (y << TEMPER4) & TEMPER1;
y ^= (y << TEMPER5) & TEMPER2;
y ^= (y >> TEMPER6);
return y;
}
private void GenRandAll()
{
int kk = 1;
UInt32 y;
UInt32 p;
y = mt[0] & UPPER_MASK;
do
{
p = mt[kk];
mt[kk - 1] = mt[kk + (M - 1)] ^ ((y | (p & LOWER_MASK)) >> 1) ^ mag01[p & 1];
y = p & UPPER_MASK;
} while (++kk < N - M + 1);
do
{
p = mt[kk];
mt[kk - 1] = mt[kk + (M - N - 1)] ^ ((y | (p & LOWER_MASK)) >> 1) ^ mag01[p & 1];
y = p & UPPER_MASK;
} while (++kk < N);
p = mt[0];
mt[N - 1] = mt[M - 1] ^ ((y | (p & LOWER_MASK)) >> 1) ^ mag01[p & 1];
}
}
/// <summary>
/// RNGCryptoServiceProvider based random; very slow but cryptographically safe
/// </summary>
public class CryptoRandom : NetRandom
{
/// <summary>
/// Global instance of CryptoRandom
/// </summary>
public static new readonly CryptoRandom Instance = new CryptoRandom();
private RandomNumberGenerator m_rnd = new RNGCryptoServiceProvider();
/// <summary>
/// Seed in CryptoRandom does not create deterministic sequences
/// </summary>
[CLSCompliant(false)]
public override void Initialize(uint seed)
{
byte[] tmp = new byte[seed % 16];
m_rnd.GetBytes(tmp); // just prime it
}
/// <summary>
/// Generates a random value from UInt32.MinValue to UInt32.MaxValue, inclusively
/// </summary>
[CLSCompliant(false)]
public override uint NextUInt32()
{
var bytes = new byte[4];
m_rnd.GetBytes(bytes);
return (uint)bytes[0] | (((uint)bytes[1]) << 8) | (((uint)bytes[2]) << 16) | (((uint)bytes[3]) << 24);
}
/// <summary>
/// Fill the specified buffer with random values
/// </summary>
public override void NextBytes(byte[] buffer)
{
m_rnd.GetBytes(buffer);
}
/// <summary>
/// Fills all bytes from offset to offset + length in buffer with random values
/// </summary>
public override void NextBytes(byte[] buffer, int offset, int length)
{
var bytes = new byte[length];
m_rnd.GetBytes(bytes);
Array.Copy(bytes, 0, buffer, offset, length);
}
}
}

View File

@@ -1,373 +0,0 @@
using System;
namespace Lidgren.Network
{
/// <summary>
/// A fast random number generator for .NET
/// Colin Green, January 2005
/// </summary>
/// September 4th 2005
/// Added NextBytesUnsafe() - commented out by default.
/// Fixed bug in Reinitialise() - y,z and w variables were not being reset.
///
/// Key points:
/// 1) Based on a simple and fast xor-shift pseudo random number generator (RNG) specified in:
/// Marsaglia, George. (2003). Xorshift RNGs.
/// http://www.jstatsoft.org/v08/i14/xorshift.pdf
///
/// This particular implementation of xorshift has a period of 2^128-1. See the above paper to see
/// how this can be easily extened if you need a longer period. At the time of writing I could find no
/// information on the period of System.Random for comparison.
///
/// 2) Faster than System.Random. Up to 8x faster, depending on which methods are called.
///
/// 3) Direct replacement for System.Random. This class implements all of the methods that System.Random
/// does plus some additional methods. The like named methods are functionally equivalent.
///
/// 4) Allows fast re-initialisation with a seed, unlike System.Random which accepts a seed at construction
/// time which then executes a relatively expensive initialisation routine. This provides a vast speed improvement
/// if you need to reset the pseudo-random number sequence many times, e.g. if you want to re-generate the same
/// sequence many times. An alternative might be to cache random numbers in an array, but that approach is limited
/// by memory capacity and the fact that you may also want a large number of different sequences cached. Each sequence
/// can each be represented by a single seed value (int) when using FastRandom.
///
/// Notes.
/// A further performance improvement can be obtained by declaring local variables as static, thus avoiding
/// re-allocation of variables on each call. However care should be taken if multiple instances of
/// FastRandom are in use or if being used in a multi-threaded environment.
public class NetRandom
{
/// <summary>
/// Gets a global NetRandom instance
/// </summary>
public static readonly NetRandom Instance = new NetRandom();
// The +1 ensures NextDouble doesn't generate 1.0
const double REAL_UNIT_INT = 1.0 / ((double)int.MaxValue + 1.0);
const double REAL_UNIT_UINT = 1.0 / ((double)uint.MaxValue + 1.0);
const uint Y = 842502087, Z = 3579807591, W = 273326509;
private static int s_extraSeed = 42;
uint x, y, z, w;
#region Constructors
/// <summary>
/// Initialises a new instance using time dependent seed.
/// </summary>
public NetRandom()
{
// Initialise using the system tick count.
Reinitialise(GetSeed(this));
}
/// <summary>
/// Initialises a new instance using an int value as seed.
/// This constructor signature is provided to maintain compatibility with
/// System.Random
/// </summary>
public NetRandom(int seed)
{
Reinitialise(seed);
}
/// <summary>
/// Create a semi-random seed based on an object
/// </summary>
public int GetSeed(object forObject)
{
// mix some semi-random properties
int seed = (int)Environment.TickCount;
seed ^= forObject.GetHashCode();
//seed ^= (int)(Stopwatch.GetTimestamp());
//seed ^= (int)(Environment.WorkingSet); // will return 0 on mono
int extraSeed = System.Threading.Interlocked.Increment(ref s_extraSeed);
return seed + extraSeed;
}
#endregion
#region Public Methods [Reinitialisation]
/// <summary>
/// Reinitialises using an int value as a seed.
/// </summary>
/// <param name="seed"></param>
public void Reinitialise(int seed)
{
// The only stipulation stated for the xorshift RNG is that at least one of
// the seeds x,y,z,w is non-zero. We fulfill that requirement by only allowing
// resetting of the x seed
x = (uint)seed;
y = Y;
z = Z;
w = W;
}
#endregion
#region Public Methods [System.Random functionally equivalent methods]
/// <summary>
/// Generates a random int over the range 0 to int.MaxValue-1.
/// MaxValue is not generated in order to remain functionally equivalent to System.Random.Next().
/// This does slightly eat into some of the performance gain over System.Random, but not much.
/// For better performance see:
///
/// Call NextInt() for an int over the range 0 to int.MaxValue.
///
/// Call NextUInt() and cast the result to an int to generate an int over the full Int32 value range
/// including negative values.
/// </summary>
/// <returns></returns>
public int Next()
{
uint t = (x ^ (x << 11));
x = y; y = z; z = w;
w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
// Handle the special case where the value int.MaxValue is generated. This is outside of
// the range of permitted values, so we therefore call Next() to try again.
uint rtn = w & 0x7FFFFFFF;
if (rtn == 0x7FFFFFFF)
return Next();
return (int)rtn;
}
/// <summary>
/// Generates a random int over the range 0 to upperBound-1, and not including upperBound.
/// </summary>
/// <param name="upperBound"></param>
/// <returns></returns>
public int Next(int upperBound)
{
if (upperBound < 0)
throw new ArgumentOutOfRangeException("upperBound", upperBound, "upperBound must be >=0");
uint t = (x ^ (x << 11));
x = y; y = z; z = w;
// The explicit int cast before the first multiplication gives better performance.
// See comments in NextDouble.
return (int)((REAL_UNIT_INT * (int)(0x7FFFFFFF & (w = (w ^ (w >> 19)) ^ (t ^ (t >> 8))))) * upperBound);
}
/// <summary>
/// Generates a random int over the range lowerBound to upperBound-1, and not including upperBound.
/// upperBound must be >= lowerBound. lowerBound may be negative.
/// </summary>
/// <param name="lowerBound"></param>
/// <param name="upperBound"></param>
/// <returns></returns>
public int Next(int lowerBound, int upperBound)
{
if (lowerBound > upperBound)
throw new ArgumentOutOfRangeException("upperBound", upperBound, "upperBound must be >=lowerBound");
uint t = (x ^ (x << 11));
x = y; y = z; z = w;
// The explicit int cast before the first multiplication gives better performance.
// See comments in NextDouble.
int range = upperBound - lowerBound;
if (range < 0)
{ // If range is <0 then an overflow has occured and must resort to using long integer arithmetic instead (slower).
// We also must use all 32 bits of precision, instead of the normal 31, which again is slower.
return lowerBound + (int)((REAL_UNIT_UINT * (double)(w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)))) * (double)((long)upperBound - (long)lowerBound));
}
// 31 bits of precision will suffice if range<=int.MaxValue. This allows us to cast to an int and gain
// a little more performance.
return lowerBound + (int)((REAL_UNIT_INT * (double)(int)(0x7FFFFFFF & (w = (w ^ (w >> 19)) ^ (t ^ (t >> 8))))) * (double)range);
}
/// <summary>
/// Generates a random double. Values returned are from 0.0 up to but not including 1.0.
/// </summary>
/// <returns></returns>
public double NextDouble()
{
uint t = (x ^ (x << 11));
x = y; y = z; z = w;
// Here we can gain a 2x speed improvement by generating a value that can be cast to
// an int instead of the more easily available uint. If we then explicitly cast to an
// int the compiler will then cast the int to a double to perform the multiplication,
// this final cast is a lot faster than casting from a uint to a double. The extra cast
// to an int is very fast (the allocated bits remain the same) and so the overall effect
// of the extra cast is a significant performance improvement.
//
// Also note that the loss of one bit of precision is equivalent to what occurs within
// System.Random.
return (REAL_UNIT_INT * (int)(0x7FFFFFFF & (w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)))));
}
/// <summary>
/// Generates a random single. Values returned are from 0.0 up to but not including 1.0.
/// </summary>
public float NextSingle()
{
return (float)NextDouble();
}
/// <summary>
/// Fills the provided byte array with random bytes.
/// This method is functionally equivalent to System.Random.NextBytes().
/// </summary>
/// <param name="buffer"></param>
public void NextBytes(byte[] buffer)
{
// Fill up the bulk of the buffer in chunks of 4 bytes at a time.
uint x = this.x, y = this.y, z = this.z, w = this.w;
int i = 0;
uint t;
for (int bound = buffer.Length - 3; i < bound; )
{
// Generate 4 bytes.
// Increased performance is achieved by generating 4 random bytes per loop.
// Also note that no mask needs to be applied to zero out the higher order bytes before
// casting because the cast ignores thos bytes. Thanks to Stefan Troschütz for pointing this out.
t = (x ^ (x << 11));
x = y; y = z; z = w;
w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
buffer[i++] = (byte)w;
buffer[i++] = (byte)(w >> 8);
buffer[i++] = (byte)(w >> 16);
buffer[i++] = (byte)(w >> 24);
}
// Fill up any remaining bytes in the buffer.
if (i < buffer.Length)
{
// Generate 4 bytes.
t = (x ^ (x << 11));
x = y; y = z; z = w;
w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
buffer[i++] = (byte)w;
if (i < buffer.Length)
{
buffer[i++] = (byte)(w >> 8);
if (i < buffer.Length)
{
buffer[i++] = (byte)(w >> 16);
if (i < buffer.Length)
{
buffer[i] = (byte)(w >> 24);
}
}
}
}
this.x = x; this.y = y; this.z = z; this.w = w;
}
// /// <summary>
// /// A version of NextBytes that uses a pointer to set 4 bytes of the byte buffer in one operation
// /// thus providing a nice speedup. The loop is also partially unrolled to allow out-of-order-execution,
// /// this results in about a x2 speedup on an AMD Athlon. Thus performance may vary wildly on different CPUs
// /// depending on the number of execution units available.
// ///
// /// Another significant speedup is obtained by setting the 4 bytes by indexing pDWord (e.g. pDWord[i++]=w)
// /// instead of adjusting it dereferencing it (e.g. *pDWord++=w).
// ///
// /// Note that this routine requires the unsafe compilation flag to be specified and so is commented out by default.
// /// </summary>
// /// <param name="buffer"></param>
// public unsafe void NextBytesUnsafe(byte[] buffer)
// {
// if(buffer.Length % 8 != 0)
// throw new ArgumentException("Buffer length must be divisible by 8", "buffer");
//
// uint x=this.x, y=this.y, z=this.z, w=this.w;
//
// fixed(byte* pByte0 = buffer)
// {
// uint* pDWord = (uint*)pByte0;
// for(int i=0, len=buffer.Length>>2; i < len; i+=2)
// {
// uint t=(x^(x<<11));
// x=y; y=z; z=w;
// pDWord[i] = w = (w^(w>>19))^(t^(t>>8));
//
// t=(x^(x<<11));
// x=y; y=z; z=w;
// pDWord[i+1] = w = (w^(w>>19))^(t^(t>>8));
// }
// }
//
// this.x=x; this.y=y; this.z=z; this.w=w;
// }
#endregion
#region Public Methods [Methods not present on System.Random]
/// <summary>
/// Generates a uint. Values returned are over the full range of a uint,
/// uint.MinValue to uint.MaxValue, inclusive.
///
/// This is the fastest method for generating a single random number because the underlying
/// random number generator algorithm generates 32 random bits that can be cast directly to
/// a uint.
/// </summary>
[CLSCompliant(false)]
public uint NextUInt()
{
uint t = (x ^ (x << 11));
x = y; y = z; z = w;
return (w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)));
}
/// <summary>
/// Generates a random int over the range 0 to int.MaxValue, inclusive.
/// This method differs from Next() only in that the range is 0 to int.MaxValue
/// and not 0 to int.MaxValue-1.
///
/// The slight difference in range means this method is slightly faster than Next()
/// but is not functionally equivalent to System.Random.Next().
/// </summary>
/// <returns></returns>
public int NextInt()
{
uint t = (x ^ (x << 11));
x = y; y = z; z = w;
return (int)(0x7FFFFFFF & (w = (w ^ (w >> 19)) ^ (t ^ (t >> 8))));
}
// Buffer 32 bits in bitBuffer, return 1 at a time, keep track of how many have been returned
// with bitBufferIdx.
uint bitBuffer;
uint bitMask = 1;
/// <summary>
/// Generates a single random bit.
/// This method's performance is improved by generating 32 bits in one operation and storing them
/// ready for future calls.
/// </summary>
/// <returns></returns>
public bool NextBool()
{
if (bitMask == 1)
{
// Generate 32 more bits.
uint t = (x ^ (x << 11));
x = y; y = z; z = w;
bitBuffer = w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
// Reset the bitMask that tells us which bit to read next.
bitMask = 0x80000000;
return (bitBuffer & bitMask) == 0;
}
return (bitBuffer & (bitMask >>= 1)) == 0;
}
#endregion
}
}

View File

@@ -1,45 +0,0 @@
using System;
using System.Threading;
namespace Lidgren.Network
{
/// <summary>
/// Class for generating random seeds
/// </summary>
public static class NetRandomSeed
{
private static int m_seedIncrement = -1640531527;
/// <summary>
/// Generates a 32 bit random seed
/// </summary>
[CLSCompliant(false)]
public static uint GetUInt32()
{
ulong seed = GetUInt64();
uint low = (uint)seed;
uint high = (uint)(seed >> 32);
return low ^ high;
}
/// <summary>
/// Generates a 64 bit random seed
/// </summary>
[CLSCompliant(false)]
public static ulong GetUInt64()
{
var guidBytes = Guid.NewGuid().ToByteArray();
ulong seed =
((ulong)guidBytes[0] << (8 * 0)) |
((ulong)guidBytes[1] << (8 * 1)) |
((ulong)guidBytes[2] << (8 * 2)) |
((ulong)guidBytes[3] << (8 * 3)) |
((ulong)guidBytes[4] << (8 * 4)) |
((ulong)guidBytes[5] << (8 * 5)) |
((ulong)guidBytes[6] << (8 * 6)) |
((ulong)guidBytes[7] << (8 * 7));
return seed ^ NetUtility.GetPlatformSeed(m_seedIncrement);
}
}
}

View File

@@ -1,18 +0,0 @@
using System;
namespace Lidgren.Network
{
internal abstract class NetReceiverChannelBase
{
internal NetPeer m_peer;
internal NetConnection m_connection;
public NetReceiverChannelBase(NetConnection connection)
{
m_connection = connection;
m_peer = connection.m_peer;
}
internal abstract void ReceiveMessage(NetIncomingMessage msg);
}
}

View File

@@ -1,87 +0,0 @@
using System;
namespace Lidgren.Network
{
internal sealed class NetReliableOrderedReceiver : NetReceiverChannelBase
{
private int m_windowStart;
private int m_windowSize;
private NetBitVector m_earlyReceived;
internal NetIncomingMessage[] m_withheldMessages;
public NetReliableOrderedReceiver(NetConnection connection, int windowSize)
: base(connection)
{
m_windowSize = windowSize;
m_withheldMessages = new NetIncomingMessage[windowSize];
m_earlyReceived = new NetBitVector(windowSize);
}
private void AdvanceWindow()
{
m_earlyReceived.Set(m_windowStart % m_windowSize, false);
m_windowStart = (m_windowStart + 1) % NetConstants.NumSequenceNumbers;
}
internal override void ReceiveMessage(NetIncomingMessage message)
{
int relate = NetUtility.RelativeSequenceNumber(message.m_sequenceNumber, m_windowStart);
// ack no matter what
m_connection.QueueAck(message.m_receivedMessageType, message.m_sequenceNumber);
if (relate == 0)
{
// Log("Received message #" + message.SequenceNumber + " right on time");
//
// excellent, right on time
//
//m_peer.LogVerbose("Received RIGHT-ON-TIME " + message);
AdvanceWindow();
m_peer.ReleaseMessage(message);
// release withheld messages
int nextSeqNr = (message.m_sequenceNumber + 1) % NetConstants.NumSequenceNumbers;
while (m_earlyReceived[nextSeqNr % m_windowSize])
{
message = m_withheldMessages[nextSeqNr % m_windowSize];
NetException.Assert(message != null);
// remove it from withheld messages
m_withheldMessages[nextSeqNr % m_windowSize] = null;
m_peer.LogVerbose("Releasing withheld message #" + message);
m_peer.ReleaseMessage(message);
AdvanceWindow();
nextSeqNr++;
}
return;
}
if (relate < 0)
{
m_peer.LogVerbose("Received message #" + message.m_sequenceNumber + " DROPPING DUPLICATE");
// duplicate
return;
}
// relate > 0 = early message
if (relate > m_windowSize)
{
// too early message!
m_peer.LogDebug("Received " + message + " TOO EARLY! Expected " + m_windowStart);
return;
}
m_earlyReceived.Set(message.m_sequenceNumber % m_windowSize, true);
m_peer.LogVerbose("Received " + message + " WITHHOLDING, waiting for " + m_windowStart);
m_withheldMessages[message.m_sequenceNumber % m_windowSize] = message;
}
}
}

View File

@@ -1,258 +0,0 @@
using System;
using System.Threading;
namespace Lidgren.Network
{
/// <summary>
/// Sender part of Selective repeat ARQ for a particular NetChannel
/// </summary>
internal sealed class NetReliableSenderChannel : NetSenderChannelBase
{
private NetConnection m_connection;
private int m_windowStart;
private int m_windowSize;
private int m_sendStart;
private NetBitVector m_receivedAcks;
internal NetStoredReliableMessage[] m_storedMessages;
internal float m_resendDelay;
internal override int WindowSize { get { return m_windowSize; } }
internal NetReliableSenderChannel(NetConnection connection, int windowSize)
{
m_connection = connection;
m_windowSize = windowSize;
m_windowStart = 0;
m_sendStart = 0;
m_receivedAcks = new NetBitVector(NetConstants.NumSequenceNumbers);
m_storedMessages = new NetStoredReliableMessage[m_windowSize];
m_queuedSends = new NetQueue<NetOutgoingMessage>(8);
m_resendDelay = m_connection.GetResendDelay();
}
internal override int GetAllowedSends()
{
int retval = m_windowSize - ((m_sendStart + NetConstants.NumSequenceNumbers) - m_windowStart) % NetConstants.NumSequenceNumbers;
NetException.Assert(retval >= 0 && retval <= m_windowSize);
return retval;
}
internal override void Reset()
{
m_receivedAcks.Clear();
for (int i = 0; i < m_storedMessages.Length; i++)
m_storedMessages[i].Reset();
m_queuedSends.Clear();
m_windowStart = 0;
m_sendStart = 0;
}
internal override NetSendResult Enqueue(NetOutgoingMessage message)
{
m_queuedSends.Enqueue(message);
int queueLen = m_queuedSends.Count;
int left = m_windowSize - ((m_sendStart + NetConstants.NumSequenceNumbers) - m_windowStart) % NetConstants.NumSequenceNumbers;
if (queueLen <= left)
return NetSendResult.Sent;
return NetSendResult.Queued;
}
// call this regularely
internal override void SendQueuedMessages(float now)
{
//
// resends
//
for (int i = 0; i < m_storedMessages.Length; i++)
{
NetOutgoingMessage om = m_storedMessages[i].Message;
if (om == null)
continue;
float t = m_storedMessages[i].LastSent;
if (t > 0 && (now - t) > m_resendDelay)
{
// deduce sequence number
int startSlot = m_windowStart % m_windowSize;
int seqNr = m_windowStart;
while (startSlot != i)
{
startSlot--;
if (startSlot < 0)
startSlot = m_windowSize - 1;
seqNr--;
}
//m_connection.m_peer.LogVerbose("Resending due to delay #" + seqNr + " " + om.ToString());
m_connection.m_statistics.MessageResent(MessageResendReason.Delay);
m_connection.QueueSendMessage(om, seqNr);
m_storedMessages[i].LastSent = now;
m_storedMessages[i].NumSent++;
}
}
int num = GetAllowedSends();
if (num < 1)
return;
// queued sends
while (m_queuedSends.Count > 0 && num > 0)
{
NetOutgoingMessage om;
if (m_queuedSends.TryDequeue(out om))
ExecuteSend(now, om);
num--;
NetException.Assert(num == GetAllowedSends());
}
}
private void ExecuteSend(float now, NetOutgoingMessage message)
{
int seqNr = m_sendStart;
m_sendStart = (m_sendStart + 1) % NetConstants.NumSequenceNumbers;
m_connection.QueueSendMessage(message, seqNr);
int storeIndex = seqNr % m_windowSize;
NetException.Assert(m_storedMessages[storeIndex].Message == null);
m_storedMessages[storeIndex].NumSent++;
m_storedMessages[storeIndex].Message = message;
m_storedMessages[storeIndex].LastSent = now;
return;
}
private void DestoreMessage(int storeIndex)
{
NetOutgoingMessage storedMessage = m_storedMessages[storeIndex].Message;
#if DEBUG
if (storedMessage == null)
throw new NetException("m_storedMessages[" + storeIndex + "].Message is null; sent " + m_storedMessages[storeIndex].NumSent + " times, last time " + (NetTime.Now - m_storedMessages[storeIndex].LastSent) + " seconds ago");
#else
if (storedMessage != null)
{
#endif
Interlocked.Decrement(ref storedMessage.m_recyclingCount);
if (storedMessage.m_recyclingCount <= 0)
m_connection.m_peer.Recycle(storedMessage);
#if !DEBUG
}
#endif
m_storedMessages[storeIndex] = new NetStoredReliableMessage();
}
// remoteWindowStart is remote expected sequence number; everything below this has arrived properly
// seqNr is the actual nr received
internal override void ReceiveAcknowledge(float now, int seqNr)
{
// late (dupe), on time or early ack?
int relate = NetUtility.RelativeSequenceNumber(seqNr, m_windowStart);
if (relate < 0)
{
//m_connection.m_peer.LogDebug("Received late/dupe ack for #" + seqNr);
return; // late/duplicate ack
}
if (relate == 0)
{
//m_connection.m_peer.LogDebug("Received right-on-time ack for #" + seqNr);
// ack arrived right on time
NetException.Assert(seqNr == m_windowStart);
m_receivedAcks[m_windowStart] = false;
DestoreMessage(m_windowStart % m_windowSize);
m_windowStart = (m_windowStart + 1) % NetConstants.NumSequenceNumbers;
// advance window if we already have early acks
while (m_receivedAcks.Get(m_windowStart))
{
//m_connection.m_peer.LogDebug("Using early ack for #" + m_windowStart + "...");
m_receivedAcks[m_windowStart] = false;
DestoreMessage(m_windowStart % m_windowSize);
NetException.Assert(m_storedMessages[m_windowStart % m_windowSize].Message == null); // should already be destored
m_windowStart = (m_windowStart + 1) % NetConstants.NumSequenceNumbers;
//m_connection.m_peer.LogDebug("Advancing window to #" + m_windowStart);
}
return;
}
//
// early ack... (if it has been sent!)
//
// If it has been sent either the m_windowStart message was lost
// ... or the ack for that message was lost
//
//m_connection.m_peer.LogDebug("Received early ack for #" + seqNr);
int sendRelate = NetUtility.RelativeSequenceNumber(seqNr, m_sendStart);
if (sendRelate <= 0)
{
// yes, we've sent this message - it's an early (but valid) ack
if (m_receivedAcks[seqNr])
{
// we've already destored/been acked for this message
}
else
{
m_receivedAcks[seqNr] = true;
}
}
else if (sendRelate > 0)
{
// uh... we haven't sent this message yet? Weird, dupe or error...
NetException.Assert(false, "Got ack for message not yet sent?");
return;
}
// Ok, lets resend all missing acks
int rnr = seqNr;
do
{
rnr--;
if (rnr < 0)
rnr = NetConstants.NumSequenceNumbers - 1;
if (m_receivedAcks[rnr])
{
// m_connection.m_peer.LogDebug("Not resending #" + rnr + " (since we got ack)");
}
else
{
int slot = rnr % m_windowSize;
NetException.Assert(m_storedMessages[slot].Message != null);
if (m_storedMessages[slot].NumSent == 1)
{
// just sent once; resend immediately since we found gap in ack sequence
NetOutgoingMessage rmsg = m_storedMessages[slot].Message;
//m_connection.m_peer.LogVerbose("Resending #" + rnr + " (" + rmsg + ")");
if (now - m_storedMessages[slot].LastSent < (m_resendDelay * 0.35f))
{
// already resent recently
}
else
{
m_storedMessages[slot].LastSent = now;
m_storedMessages[slot].NumSent++;
m_connection.m_statistics.MessageResent(MessageResendReason.HoleInSequence);
m_connection.QueueSendMessage(rmsg, rnr);
}
}
}
} while (rnr != m_windowStart);
}
}
}

View File

@@ -1,63 +0,0 @@
using System;
namespace Lidgren.Network
{
internal sealed class NetReliableSequencedReceiver : NetReceiverChannelBase
{
private int m_windowStart;
private int m_windowSize;
public NetReliableSequencedReceiver(NetConnection connection, int windowSize)
: base(connection)
{
m_windowSize = windowSize;
}
private void AdvanceWindow()
{
m_windowStart = (m_windowStart + 1) % NetConstants.NumSequenceNumbers;
}
internal override void ReceiveMessage(NetIncomingMessage message)
{
int nr = message.m_sequenceNumber;
int relate = NetUtility.RelativeSequenceNumber(nr, m_windowStart);
// ack no matter what
m_connection.QueueAck(message.m_receivedMessageType, nr);
if (relate == 0)
{
// Log("Received message #" + message.SequenceNumber + " right on time");
//
// excellent, right on time
//
AdvanceWindow();
m_peer.ReleaseMessage(message);
return;
}
if (relate < 0)
{
m_peer.LogVerbose("Received message #" + message.m_sequenceNumber + " DROPPING LATE or DUPE");
return;
}
// relate > 0 = early message
if (relate > m_windowSize)
{
// too early message!
m_peer.LogDebug("Received " + message + " TOO EARLY! Expected " + m_windowStart);
return;
}
// ok
m_windowStart = (m_windowStart + relate) % NetConstants.NumSequenceNumbers;
m_peer.ReleaseMessage(message);
return;
}
}
}

View File

@@ -1,87 +0,0 @@
using System;
namespace Lidgren.Network
{
internal sealed class NetReliableUnorderedReceiver : NetReceiverChannelBase
{
private int m_windowStart;
private int m_windowSize;
private NetBitVector m_earlyReceived;
public NetReliableUnorderedReceiver(NetConnection connection, int windowSize)
: base(connection)
{
m_windowSize = windowSize;
m_earlyReceived = new NetBitVector(windowSize);
}
private void AdvanceWindow()
{
m_earlyReceived.Set(m_windowStart % m_windowSize, false);
m_windowStart = (m_windowStart + 1) % NetConstants.NumSequenceNumbers;
}
internal override void ReceiveMessage(NetIncomingMessage message)
{
int relate = NetUtility.RelativeSequenceNumber(message.m_sequenceNumber, m_windowStart);
// ack no matter what
m_connection.QueueAck(message.m_receivedMessageType, message.m_sequenceNumber);
if (relate == 0)
{
// Log("Received message #" + message.SequenceNumber + " right on time");
//
// excellent, right on time
//
//m_peer.LogVerbose("Received RIGHT-ON-TIME " + message);
AdvanceWindow();
m_peer.ReleaseMessage(message);
// release withheld messages
int nextSeqNr = (message.m_sequenceNumber + 1) % NetConstants.NumSequenceNumbers;
while (m_earlyReceived[nextSeqNr % m_windowSize])
{
//message = m_withheldMessages[nextSeqNr % m_windowSize];
//NetException.Assert(message != null);
// remove it from withheld messages
//m_withheldMessages[nextSeqNr % m_windowSize] = null;
//m_peer.LogVerbose("Releasing withheld message #" + message);
//m_peer.ReleaseMessage(message);
AdvanceWindow();
nextSeqNr++;
}
return;
}
if (relate < 0)
{
// duplicate
m_peer.LogVerbose("Received message #" + message.m_sequenceNumber + " DROPPING DUPLICATE");
return;
}
// relate > 0 = early message
if (relate > m_windowSize)
{
// too early message!
m_peer.LogDebug("Received " + message + " TOO EARLY! Expected " + m_windowStart);
return;
}
m_earlyReceived.Set(message.m_sequenceNumber % m_windowSize, true);
//m_peer.LogVerbose("Received " + message + " WITHHOLDING, waiting for " + m_windowStart);
//m_withheldMessages[message.m_sequenceNumber % m_windowSize] = message;
m_peer.ReleaseMessage(message);
}
}
}

View File

@@ -1,204 +0,0 @@
#define USE_SHA256
using System;
using System.Security.Cryptography;
using System.Text;
namespace Lidgren.Network
{
/// <summary>
/// Helper methods for implementing SRP authentication
/// </summary>
public static class NetSRP
{
private static readonly NetBigInteger N = new NetBigInteger("0115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3", 16);
private static readonly NetBigInteger g = NetBigInteger.Two;
private static readonly NetBigInteger k = ComputeMultiplier();
private static HashAlgorithm GetHashAlgorithm()
{
#if USE_SHA256
// this does not seem to work as of yet
return SHA256.Create();
#else
return SHA1.Create();
#endif
}
/// <summary>
/// Compute multiplier (k)
/// </summary>
private static NetBigInteger ComputeMultiplier()
{
string one = NetUtility.ToHexString(N.ToByteArrayUnsigned());
string two = NetUtility.ToHexString(g.ToByteArrayUnsigned());
string ccstr = one + two.PadLeft(one.Length, '0');
byte[] cc = NetUtility.ToByteArray(ccstr);
var sha = GetHashAlgorithm();
var ccHashed = sha.ComputeHash(cc);
return new NetBigInteger(NetUtility.ToHexString(ccHashed), 16);
}
/// <summary>
/// Create 16 bytes of random salt
/// </summary>
public static byte[] CreateRandomSalt()
{
byte[] retval = new byte[16];
NetRandom.Instance.NextBytes(retval);
return retval;
}
/// <summary>
/// Create 32 bytes of random ephemeral value
/// </summary>
public static byte[] CreateRandomEphemeral()
{
byte[] retval = new byte[32];
NetRandom.Instance.NextBytes(retval);
return retval;
}
/// <summary>
/// Computer private key (x)
/// </summary>
public static byte[] ComputePrivateKey(string username, string password, byte[] salt)
{
var sha = GetHashAlgorithm();
byte[] tmp = Encoding.UTF8.GetBytes(username + ":" + password);
byte[] innerHash = sha.ComputeHash(tmp);
byte[] total = new byte[innerHash.Length + salt.Length];
Buffer.BlockCopy(salt, 0, total, 0, salt.Length);
Buffer.BlockCopy(innerHash, 0, total, salt.Length, innerHash.Length);
// x ie. H(salt || H(username || ":" || password))
return new NetBigInteger(NetUtility.ToHexString(sha.ComputeHash(total)), 16).ToByteArrayUnsigned();
}
/// <summary>
/// Creates a verifier that the server can later use to authenticate users later on (v)
/// </summary>
public static byte[] ComputeServerVerifier(byte[] privateKey)
{
NetBigInteger x = new NetBigInteger(NetUtility.ToHexString(privateKey), 16);
// Verifier (v) = g^x (mod N)
var serverVerifier = g.ModPow(x, N);
return serverVerifier.ToByteArrayUnsigned();
}
/// <summary>
/// SHA hash data
/// </summary>
public static byte[] Hash(byte[] data)
{
var sha = GetHashAlgorithm();
return sha.ComputeHash(data);
}
/// <summary>
/// Compute client public ephemeral value (A)
/// </summary>
public static byte[] ComputeClientEphemeral(byte[] clientPrivateEphemeral) // a
{
// A= g^a (mod N)
NetBigInteger a = new NetBigInteger(NetUtility.ToHexString(clientPrivateEphemeral), 16);
NetBigInteger retval = g.ModPow(a, N);
return retval.ToByteArrayUnsigned();
}
/// <summary>
/// Compute server ephemeral value (B)
/// </summary>
public static byte[] ComputeServerEphemeral(byte[] serverPrivateEphemeral, byte[] verifier) // b
{
var b = new NetBigInteger(NetUtility.ToHexString(serverPrivateEphemeral), 16);
var v = new NetBigInteger(NetUtility.ToHexString(verifier), 16);
// B = kv + g^b (mod N)
var bb = g.ModPow(b, N);
var kv = v.Multiply(k);
var B = (kv.Add(bb)).Mod(N);
return B.ToByteArrayUnsigned();
}
/// <summary>
/// Compute intermediate value (u)
/// </summary>
public static byte[] ComputeU(byte[] clientPublicEphemeral, byte[] serverPublicEphemeral)
{
// u = SHA-1(A || B)
string one = NetUtility.ToHexString(clientPublicEphemeral);
string two = NetUtility.ToHexString(serverPublicEphemeral);
int len = 66; // Math.Max(one.Length, two.Length);
string ccstr = one.PadLeft(len, '0') + two.PadLeft(len, '0');
byte[] cc = NetUtility.ToByteArray(ccstr);
var sha = GetHashAlgorithm();
var ccHashed = sha.ComputeHash(cc);
return new NetBigInteger(NetUtility.ToHexString(ccHashed), 16).ToByteArrayUnsigned();
}
/// <summary>
/// Computes the server session value
/// </summary>
public static byte[] ComputeServerSessionValue(byte[] clientPublicEphemeral, byte[] verifier, byte[] udata, byte[] serverPrivateEphemeral)
{
// S = (Av^u) ^ b (mod N)
var A = new NetBigInteger(NetUtility.ToHexString(clientPublicEphemeral), 16);
var v = new NetBigInteger(NetUtility.ToHexString(verifier), 16);
var u = new NetBigInteger(NetUtility.ToHexString(udata), 16);
var b = new NetBigInteger(NetUtility.ToHexString(serverPrivateEphemeral), 16);
NetBigInteger retval = v.ModPow(u, N).Multiply(A).Mod(N).ModPow(b, N).Mod(N);
return retval.ToByteArrayUnsigned();
}
/// <summary>
/// Computes the client session value
/// </summary>
public static byte[] ComputeClientSessionValue(byte[] serverPublicEphemeral, byte[] xdata, byte[] udata, byte[] clientPrivateEphemeral)
{
// (B - kg^x) ^ (a + ux) (mod N)
var B = new NetBigInteger(NetUtility.ToHexString(serverPublicEphemeral), 16);
var x = new NetBigInteger(NetUtility.ToHexString(xdata), 16);
var u = new NetBigInteger(NetUtility.ToHexString(udata), 16);
var a = new NetBigInteger(NetUtility.ToHexString(clientPrivateEphemeral), 16);
var bx = g.ModPow(x, N);
var btmp = B.Add(N.Multiply(k)).Subtract(bx.Multiply(k)).Mod(N);
return btmp.ModPow(x.Multiply(u).Add(a), N).ToByteArrayUnsigned();
}
/// <summary>
/// Create XTEA symmetrical encryption object from sessionValue
/// </summary>
public static NetXtea CreateEncryption(byte[] sessionValue)
{
var sha = GetHashAlgorithm();
var hash = sha.ComputeHash(sessionValue);
var key = new byte[16];
for(int i=0;i<16;i++)
{
key[i] = hash[i];
for (int j = 1; j < hash.Length / 16; j++)
key[i] ^= hash[i + (j * 16)];
}
return new NetXtea(key);
}
}
}

View File

@@ -1,30 +0,0 @@
using System;
namespace Lidgren.Network
{
/// <summary>
/// Result of a SendMessage call
/// </summary>
public enum NetSendResult
{
/// <summary>
/// Message failed to enqueue because there is no connection
/// </summary>
FailedNotConnected = 0,
/// <summary>
/// Message was immediately sent
/// </summary>
Sent = 1,
/// <summary>
/// Message was queued for delivery
/// </summary>
Queued = 2,
/// <summary>
/// Message was dropped immediately since too many message were queued
/// </summary>
Dropped = 3
}
}

View File

@@ -1,19 +0,0 @@
using System;
namespace Lidgren.Network
{
internal abstract class NetSenderChannelBase
{
// access this directly to queue things in this channel
internal NetQueue<NetOutgoingMessage> m_queuedSends;
internal abstract int WindowSize { get; }
internal abstract int GetAllowedSends();
internal abstract NetSendResult Enqueue(NetOutgoingMessage message);
internal abstract void SendQueuedMessages(float now);
internal abstract void Reset();
internal abstract void ReceiveAcknowledge(float now, int sequenceNumber);
}
}

View File

@@ -1,70 +0,0 @@
using System;
using System.Collections.Generic;
namespace Lidgren.Network
{
/// <summary>
/// Specialized version of NetPeer used for "server" peers
/// </summary>
public class NetServer : NetPeer
{
/// <summary>
/// NetServer constructor
/// </summary>
public NetServer(NetPeerConfiguration config)
: base(config)
{
config.AcceptIncomingConnections = true;
}
/// <summary>
/// Send a message to all connections
/// </summary>
/// <param name="msg">The message to send</param>
/// <param name="method">How to deliver the message</param>
public void SendToAll(NetOutgoingMessage msg, NetDeliveryMethod method)
{
var all = this.Connections;
if (all.Count <= 0)
return;
SendMessage(msg, all, method, 0);
}
/// <summary>
/// Send a message to all connections except one
/// </summary>
/// <param name="msg">The message to send</param>
/// <param name="method">How to deliver the message</param>
/// <param name="except">Don't send to this particular connection</param>
/// <param name="sequenceChannel">Which sequence channel to use for the message</param>
public void SendToAll(NetOutgoingMessage msg, NetConnection except, NetDeliveryMethod method, int sequenceChannel)
{
var all = this.Connections;
if (all.Count <= 0)
return;
if (except == null)
{
SendMessage(msg, all, method, sequenceChannel);
return;
}
List<NetConnection> recipients = new List<NetConnection>(all.Count - 1);
foreach (var conn in all)
if (conn != except)
recipients.Add(conn);
if (recipients.Count > 0)
SendMessage(msg, recipients, method, sequenceChannel);
}
/// <summary>
/// Returns a string that represents this object
/// </summary>
public override string ToString()
{
return "[NetServer " + ConnectionsCount + " connections]";
}
}
}

View File

@@ -1,18 +0,0 @@
using System;
namespace Lidgren.Network
{
internal struct NetStoredReliableMessage
{
public int NumSent;
public float LastSent;
public NetOutgoingMessage Message;
public void Reset()
{
NumSent = 0;
LastSent = 0;
Message = null;
}
}
}

View File

@@ -1,61 +0,0 @@
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#define IS_STOPWATCH_AVAILABLE
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
namespace Lidgren.Network
{
/// <summary>
/// Time service
/// </summary>
public static class NetTime
{
#if IS_STOPWATCH_AVAILABLE
private static readonly long s_timeInitialized = Stopwatch.GetTimestamp();
private static readonly double s_dInvFreq = 1.0 / (double)Stopwatch.Frequency;
/// <summary>
/// Get number of seconds since the application started
/// </summary>
public static double Now { get { return (double)(Stopwatch.GetTimestamp() - s_timeInitialized) * s_dInvFreq; } }
#else
private static readonly uint s_timeInitialized = (uint)Environment.TickCount;
/// <summary>
/// Get number of seconds since the application started
/// </summary>
public static double Now { get { return (double)((uint)Environment.TickCount - s_timeInitialized) / 1000.0; } }
#endif
/// <summary>
/// Given seconds it will output a human friendly readable string (milliseconds if less than 60 seconds)
/// </summary>
public static string ToReadable(double seconds)
{
if (seconds > 60)
return TimeSpan.FromSeconds(seconds).ToString();
return (seconds * 1000.0).ToString("N2") + " ms";
}
}
}

View File

@@ -1,19 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Lidgren.Network
{
// replace with BCL 4.0 Tuple<> when appropriate
internal struct NetTuple<A, B>
{
public A Item1;
public B Item2;
public NetTuple(A item1, B item2)
{
Item1 = item1;
Item2 = item2;
}
}
}

Some files were not shown because too many files have changed in this diff Show More