GithubHelp home page GithubHelp logo

stargate-rewritten / stargate-bukkit Goto Github PK

View Code? Open in Web Editor NEW

This project forked from pseudoknight/stargate-bukkit

28.0 4.0 14.0 5.15 MB

The original, and still the best, survival-friendly portal plugin.

Home Page: https://sgrewritten.org/paper

License: GNU Lesser General Public License v3.0

Java 100.00%
minecraft-plugins spigot-plugins spigot bukkit bukkit-plugins transportation teleportation portals thedgtl dinnerbone strummeh grum core stargate-bukkit stargate-rewritten

stargate-bukkit's Introduction

Support Discord Link

Stargate-Bukkit

Supporting MC 1.18+ in the Bukkit Ecosystem

Warning

THIS IS AN DEVELOPMENT BUILD FROM THE NIGHTLY CHANNEL!

FOR: Stargate developers and contributors.
ENJOY: Access to cutting edge features still under active development.
EXPECT: Crashes, unstable test builds, bugs, incomplete integrations, possible data corruption.

THIS BUILD IS NOT SUITABLE FOR USE ON PRODUCTION SERVERS OF ANY SORT
Use at your own risk, and remember to make backups!

Stargate Banner

Description

The original, and still the best, transportation solution for the Bukkit ecosystem!
A Minecraft Spigot/Paper plugin facilitating player interactions through interconnection.

๐Ÿ–ฅ๏ธWebsite
โฌ‡Downloads
๐Ÿ“‘Documentation
๐Ÿ—ฃSupport

Features

Immersive User-Oriented Capable
Stargate's interface is integrated within gameplay; players can create, use, and destroy portals without any commands! All of StarGate's features are designed to allow for non-admin users to create and manage their own portal networks in a balanced and risk free manner. By default, StarGate boasts a comprehensive network system, dozens of portal types (flags), and highly configurable behaviours.
Configurable Expandable Customizable
Stargate has a comprehensive and intuitive config, highly granular permissions, and multi-language support! The StarGate community has developed an ecosystem of add-ons, which collectively add integration and design-philosophy expansions to the plugin. Stargate supports numerous customizations; from sign formatting to gate designs, all user-facing details can be modified!

Context and Credits

The continuation of Minecraft's first portal plugin, Stargate, by Sturmeh and Dinnerbone.
Guided by the original philosophy and rewritten from the ground up for modern versions of MC.
With inspiration from Drakia's port and it's subsequent revivals (notably SGRevived and SG10).

โ™ฅ๏ธ Credits

stargate-bukkit's People

Contributors

cmarcoo avatar drakiaxyz avatar epicknarvik97 avatar frostalf avatar ghost-chu avatar littlebigbug avatar pheotis avatar pseudoknight avatar stefanbossbaly avatar thorinwasher avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

stargate-bukkit's Issues

Add support for vanilla sign colouring mechanics.

Traditionally, sign colouring has been handled by external plugins (usually essentials) inserting the ยง symbol into a sign's data.
Thus far, SG has handled coloured gate names as distinct strings;

&1gate
&2gate
network
a
&2gate
&1gate
network
a

In modern versions of the game, it has become possible to change a sign's colour (and luminosity) via vanilla mechanics.
These include right-clicking with dye or with glow squid ink.

Currently, such interactions are cancelled by stargate.
It may be a good idea to support them directly.

Support for button variants

Currently, it is impossible to specify a material for a given portals' button.
This has been brought up as a potential feature both upstream (PseudoKnight#7) and on our discord.

There are two ways this could be implemented:
1 Adding a customization option to .gate designs as was done upstream (2628553)
2 Allowing players to supply their own buttons when building the gate, as is done with signs.

  • Note that, as buttons are supplied automatically, code modification would be needed to prevent the button from being replaced with STONE_BUTTON

I personally prefer option number 2 as it is more customizable for players, less overhead for admins, and slightly more intuitive.

`B` The Backwards Flag

This flag makes it so that, when exiting a portal, the player will always teleport to the side FACING AWAY FROM THE ACTIVATOR

`P` The Private Flag

This flag makes it so that applicable gates are locked such that only their owner (or individuals with applicable perms) can open them.

Configuration for Closed Economies

It might be a good idea to add a config option to facilitate closed economies.

Instead of deleting portal creation fees and transport surcharges, it should be possible for them to go to an account specified in the config.

A partial implementation can be found in this fork

Error after using a networked gate

What I remember, I did this:

  • Create two networked portals
  • For one of the portals (can't remember if it was the first or second one) chose the other as destination
  • Walk into the iris / portal entrance

After I entered the portal iris, an error got thrown. When I redid this with the same portals, nothing happened, neither could I reproduce it if I made new portals / tried to replicate the exact way of events.

Stack trace

[16:59:23] [Server thread/ERROR]: Could not pass event PlayerMoveEvent to Stargate v0.11.0.3
org.bukkit.event.EventException: null
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:310) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:589) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:576) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
at net.minecraft.server.network.PlayerConnection.a(PlayerConnection.java:1252) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
at net.minecraft.network.protocol.game.PacketPlayInFlying.a(SourceFile:114) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
at net.minecraft.network.protocol.game.PacketPlayInFlying$PacketPlayInPositionLook.a(SourceFile:16) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
at net.minecraft.network.protocol.PlayerConnectionUtils.lambda$0(PlayerConnectionUtils.java:30) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
at net.minecraft.server.TickTask.run(SourceFile:18) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
at net.minecraft.util.thread.IAsyncTaskHandler.executeTask(SourceFile:151) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
at net.minecraft.util.thread.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
at net.minecraft.util.thread.IAsyncTaskHandler.executeNext(SourceFile:125) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
at net.minecraft.server.MinecraftServer.bg(MinecraftServer.java:1125) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
at net.minecraft.server.MinecraftServer.executeNext(MinecraftServer.java:1118) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
at net.minecraft.util.thread.IAsyncTaskHandler.awaitTasks(SourceFile:134) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
at net.minecraft.server.MinecraftServer.sleepForTick(MinecraftServer.java:1102) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
at net.minecraft.server.MinecraftServer.x(MinecraftServer.java:1031) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
at net.minecraft.server.MinecraftServer.lambda$0(MinecraftServer.java:307) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
at java.lang.Thread.run(Thread.java:831) [?:?]
Caused by: java.lang.NullPointerException: Cannot invoke "net.TheDgtl.Stargate.portal.Network$Portal.getExit()" because "desti" is null
at net.TheDgtl.Stargate.listeners.MoveEventListener.onPlayerMove(MoveEventListener.java:69) ~[?:?]
at jdk.internal.reflect.GeneratedMethodAccessor10.invoke(Unknown Source) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:567) ~[?:?]
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.17.jar:3170-Spigot-a483d2c-ec116f6]
... 18 more

Improve Bstats Integration

Currently, bstats reports minimal information.
Reporting more data would be helpful in informing the rewrite.

Possible subjects could include:

  • Number of gates on the server.
  • What options (flags) are in use.
  • If bungee portals are in use.
  • Number of gate designs (.gate) files.
  • Number of underwater portals on the server.
  • Whether economy support is enabled.
  • Selected language.
  • Default gate network.

Underwater networked portals skip directly to complete state.

Networked and random portals do not work underwater.

Sign selection for networked portals leads to invalid destination error.
Random portals activate, but do not detect player entry.

Background

A portal without a destination specified is a networked portal. A networked portal with a the r flag is a random portal. A portal with a closing-block specified as water is an underwater portal.

Description.

If a networked (or by extension, random) portal is created underwater, it will not be usable; selecting a destination and activating the portal will appear successful, but the portal will never activate.

Repro steps

  1. Make two or three networked and/or random underwater portals, for example,
Test1

TestNet

Test2

TestNet

Test3

TestNet
r
  1. Select a destination from one of the portals (not applicable for a random portal), and activate it.
  2. The issue will appear.

Summary of Investigation

Thank you to the user @Thorinwasher for this observation:

It would appear that, in this specific circumstance, the activation event is being called twice.

When the activation mechanism (in this case, dead_tube_coral_wall_fan) is used, the gate opens.
When a player enters the portal, it is treated as a separate occurrence of the activation event; ultimately, the gate closes.
When the activation mechanism is used with the gate already being active, the gate closes.

In this case, the activation occurs, the gate opens, then occurs again, and therefore, closes the gate.

This appears to be related to line 935 of stargate.java.

Permissions

Ensure that each and every option below has a granular configuration option.

By default, that means:

   - stargate.use.<network> | Use all portals on specified network.

   - stargate.create | Create portals in all scopes.
   - stargate.create.personal | Create portals on "Username" Network
   - stargate.create.<network naem> | Create portals on a specifically named network.

>>>Every flag supported by the plugin should have its own debug node!*
   - stargate.flag.h
   - stargate.flag.a
   - stargate.flag.p
   - stargate.flag.{...}

- stargate.destroy.???? (same as stargate.create, only the ability to break portals in the specified scope).

>>> Override the config'd costs associated with each of these actions.
- stargate.free.use
- stargate.free.create
- stargate.free.destroy

- stargate.admin.private | bypass the P flag
- stargate.admin.hidden | bypass the H flag

Always-On Portal Null Pointer

Background

A portal with either the A flag or the R flag is a type of always-on gate.

Description

Something about the code refactor broke the functioning of always-on gates and their sub-types.

Trace

java.lang.NullPointerException: null
	at java.util.Objects.requireNonNull(Objects.java:221) ~[?:?]
	at net.TheDgtl.Stargate.event.StargateOpenEvent.<init>(StargateOpenEvent.java:45) ~[?:?]
	at net.TheDgtl.Stargate.Portal.open(Portal.java:395) ~[?:?]
	at net.TheDgtl.Stargate.Portal.open(Portal.java:390) ~[?:?]
	at net.TheDgtl.Stargate.Portal.createPortal(Portal.java:1234) ~[?:?]
	at net.TheDgtl.Stargate.listeners.BlockEventsListener.onSignChange(BlockEventsListener.java:32) ~[?:?]
	at com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor191.execute(Unknown Source) ~[?:?]
	at org.bukkit.plugin.EventExecutor.lambda$create$1(EventExecutor.java:69) ~[patched_1.16.4.jar:git-Paper-401]
	at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:80) ~[patched_1.16.4.jar:git-Paper-401]
	at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[patched_1.16.4.jar:git-Paper-401]
	at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:607) ~[patched_1.16.4.jar:git-Paper-401]
	at net.minecraft.server.v1_16_R3.PlayerConnection.a(PlayerConnection.java:2813) ~[patched_1.16.4.jar:git-Paper-401]
	at net.minecraft.server.v1_16_R3.PlayerConnection.lambda$a$18(PlayerConnection.java:2766) ~[patched_1.16.4.jar:git-Paper-401]
	at net.minecraft.server.v1_16_R3.PlayerConnection.lambda$a$1(PlayerConnection.java:324) ~[patched_1.16.4.jar:git-Paper-401]
	at net.minecraft.server.v1_16_R3.PlayerConnection.lambda$a$3(PlayerConnection.java:338) ~[patched_1.16.4.jar:git-Paper-401]
	at net.minecraft.server.v1_16_R3.TickTask.run(SourceFile:18) ~[patched_1.16.4.jar:git-Paper-401]
	at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeTask(IAsyncTaskHandler.java:136) ~[patched_1.16.4.jar:git-Paper-401]
	at net.minecraft.server.v1_16_R3.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) ~[patched_1.16.4.jar:git-Paper-401]
	at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeNext(IAsyncTaskHandler.java:109) ~[patched_1.16.4.jar:git-Paper-401]
	at net.minecraft.server.v1_16_R3.MinecraftServer.bb(MinecraftServer.java:1128) ~[patched_1.16.4.jar:git-Paper-401]
	at net.minecraft.server.v1_16_R3.MinecraftServer.executeNext(MinecraftServer.java:1121) ~[patched_1.16.4.jar:git-Paper-401]
	at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.awaitTasks(IAsyncTaskHandler.java:119) ~[patched_1.16.4.jar:git-Paper-401]
	at net.minecraft.server.v1_16_R3.MinecraftServer.sleepForTick(MinecraftServer.java:1082) ~[patched_1.16.4.jar:git-Paper-401]
	at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:996) ~[patched_1.16.4.jar:git-Paper-401]
	at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$a$0(MinecraftServer.java:173) ~[patched_1.16.4.jar:git-Paper-401]
	at java.lang.Thread.run(Thread.java:834) [?:?]

Repro steps

  1. Make a fixed AO portal on a network.
Test1
Test2
TestNet
A
  1. Make a fixed AO portal on the same network.
Test2
Test1
TestNet
A

The issue has been reproduced.

`A` The Always-On Flag

This flag makes it so that FIXED PORTALS will always be activated.

It does not work with NON-FIXED PORTALS.

Retcon for config

The previous config was terrible, and although it was fixed in #54, it will still cause confusion for many users.
Now that the configVersion flag has been introduced, adding a retcon for config comments is needed.

`S` The Force-Show flag.

Certain portal exits, including random gates, should not show by default on a network scroll.

This flag should override that.

Could not pass event SignChangeEvent to Stargate v0.10.4.0

Whenever I try to make a stargate it is unable to complete it. It will create a button but that's it.
I am running on CraftBukkit version 2991-Spigot-018b9a0-f3f3094 (MC: 1.16.5) (Implementing API version 1.16.5-R0.1-SNAPSHOT)
I am running Stargate v. 0.10.4.0
I am not using bungee.
I am on Windows 10 Pro.
The plugins I am running are LuckPerms, Stargate, MySQL, Vault, WorldEdit, Essentials, EssentialsProtect, LogBlock, EssentialsGeoIP, EssentialsAntiBuild, EssentialsSpawn, WorldGuard, ChestShop, and mcMMO
My config and gates folder are both default.
config.yml:

Stargate Configuration File v. 0.10.4.0

Main Stargate config

portal-folder: plugins/Stargate/portals/
gate-folder: plugins/Stargate/gates/
default-gate-network: central
destroyexplosion: false
maxgates: 0
lang: en
destMemory: false
ignoreEntrance: false
handleVehicles: true
sortLists: false
protectEntrance: false
signColor: BLACK
useeconomy: false
createcost: 0
destroycost: 0
usecost: 0
toowner: false
chargefreedestination: true
freegatesgreen: false
debug: false
permdebug: false
enableBungee: false
verifyPortals: false

nethergate.gate:
portal-open=NETHER_PORTAL
portal-closed=AIR
toowner=false
X=OBSIDIAN
-=OBSIDIAN

XX
X..X
-..-
X*.X
XX

Error:
[11:26:56 ERROR]: Could not pass event SignChangeEvent to Stargate v0.10.4.0
org.bukkit.event.EventException: null
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:319) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:589) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:576) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
at net.minecraft.server.v1_16_R3.PlayerConnection.a(PlayerConnection.java:2526) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
at net.minecraft.server.v1_16_R3.PlayerConnection.lambda$19(PlayerConnection.java:2489) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
at net.minecraft.server.v1_16_R3.PlayerConnection.lambda$2(PlayerConnection.java:293) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
at net.minecraft.server.v1_16_R3.PlayerConnection.lambda$4(PlayerConnection.java:307) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
at net.minecraft.server.v1_16_R3.TickTask.run(SourceFile:18) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeTask(SourceFile:144) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
at net.minecraft.server.v1_16_R3.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeNext(SourceFile:118) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
at net.minecraft.server.v1_16_R3.MinecraftServer.bb(MinecraftServer.java:942) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
at net.minecraft.server.v1_16_R3.MinecraftServer.executeNext(MinecraftServer.java:935) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.awaitTasks(SourceFile:127) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
at net.minecraft.server.v1_16_R3.MinecraftServer.sleepForTick(MinecraftServer.java:919) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:851) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$0(MinecraftServer.java:164) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_281]
Caused by: java.lang.NullPointerException
at net.TheDgtl.Stargate.LangLoader.getString(LangLoader.java:77) ~[?:?]
at net.TheDgtl.Stargate.Stargate.getString(Stargate.java:296) ~[?:?]
at net.TheDgtl.Stargate.Portal.getSignLines(Portal.java:650) ~[?:?]
at net.TheDgtl.Stargate.Portal.drawSign(Portal.java:811) ~[?:?]
at net.TheDgtl.Stargate.Portal.createPortal(Portal.java:1228) ~[?:?]
at net.TheDgtl.Stargate.listeners.BlockEventsListener.onSignChange(BlockEventsListener.java:32) ~[?:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_281]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_281]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_281]
at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_281]
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:315) ~[spigot-1.16.5.jar:2991-Spigot-018b9a0-f3f3094]
... 18 more

Thank you for your time!

Networked (no desti) portals can not see fixed portals on scroll.

Background

A portal with a set destination is a fixed portal. A portal without one is a networked portal.

Description.

If a networked portal is created on a network that already contains a fixed portal, the networked portal will not be able to access it. This is most apparent via the scrolling mechanism w/ the sign -- it functions normally, but does not list any fixed portals.

Observations

This is stable behaviour, and thus, not an issue, but is nonetheless sub-optimal.

Given that a fixed portal can be made to target an already created (and separately directed) fixed portal, being able to do the same thing with a networked portal seems like a logical extension.

Repro steps

One of the easiest ways to demonstrate the full scope of this issue is as follows:

  1. Make a fixed portal
Test1
Test2
TestNet

  1. Connect it to another fixed portal
Test2
Test1
TestNet

  1. Make a networked portal
Test3

TestNet

  1. Make another networked portal.
Test4

TestNet

  1. Make another networked portal.
Test5

TestNet

  1. Make another fixed portal.
Test6
Test1
TestNet

  1. Right click on one of the networked portals' signs; keep right clicking to scroll through the destinations.
  2. Test1, Test2, and Test6 will not be available, but tests three through five will be.

ChestShop Incompatibility

Background

A gate has a name, a destination, a network, and flags.

Description

If a gate is named after a number;
If its destination is named after a number;
if the player has a numeric username;
and if the gate has flags.

Chest shop will think that you are making a shop.
This will result in the portal being created, and the sign being removed thereafter.
The portal will still exist in stargate's database, pending a restart.

Trace

Shown when creating an Always On Portal named 10

[11:30:09 INFO]: [Stargate] [Stargate::onSignChange] Initialized stargate: 10
[11:30:09 WARN]: [Stargate] [Stargate] Sign block is not a Sign object
[11:30:09 INFO]: [Stargate] [Stargate::Portal::drawSign] Block: AIR @ Location{world=CraftWorld{name=lclo},x=-262.0,y=3.0,z=316.0,pitch=0.0,yaw=0.0}

Fails and produces [Shop] Player not found!

When attempting to create a new always-on portal on the same spot, it fails, with no in-game error message.
Instead fails to console with:

[11:36:31 INFO]: [Stargate] [Stargate::createPortal] idParent belongs to existing gate

Repro steps

Place a sign anywhere in the world as follows:

1
2
3
a

Save and load gates

Store gates in a database, be able to load them with all of their settings proper gatedesigns, and so on

Gates does not work in spawn regions

There is a singular portal in my world that ceases to function whenever a server operator exists regardless of permissions set. This occurs if ANY op is set regardless of who & whether or not they are online.

Disabling op immediately fixes the gate for everyone. Granting stargate.* to everyone does nothing.

Nothing in the server logs with both debug options enabled indicates anything is wrong, has normal outputs saying user's have the permissions needed. Nothing denies it functioning

Things tried:

  • I've tried replacing the gate with default layout nether.gate & issue persists.
  • Different names do nothing.
  • Moving the gate back 3 blocks doesn't work.

Original layout of the problem gate:
image

This is the config I have that exhibits this issue:
image

Implement Rudimentary Networking

If not provided, players creating gates should be directed to use the lowest-level network they have perms to use.

Personal (Username) Network > Designated Central Network > Networks they have perms to use, listed alphabetically.

Default Inclusion of the Underwater Gate Example.

Apparently, when we added support for underwater portals, we forgot to include the example .gate design.
This should generate along side nether.gate upon the plugin's initial startup.

File water.gate:

portal-open=KELP_PLANT
portal-closed=WATER
toowner=false
X=SEA_LANTERN
-=SEA_LANTERN

XXXX
X..X
-..-
X.*X
XXXX

Backwards Gate Duplication

Background

A gate with the B flag is a backwards gate -- you enter it in reverse.

Description

Two back to back backwards gates, spaced one block apart, register as the same gate, and do not produce an error message.

Trace

[11:18:49 INFO]: [Stargate] [Stargate::createPortal] h = false a = false p = false f = false b = true s = false n = false r = false u = false
[11:18:49 INFO]: [Stargate] [Stargate::manualDebug] Point 2: minecraft:dead_tube_coral_wall_fan[facing=north,waterlogged=true]
[11:18:49 INFO]: [Stargate] [Stargate::register] Network dbb not in lookupNamesNet, adding
[11:18:49 INFO]: [Stargate] [Stargate::register] Network dbb not in allPortalsNet, adding
[11:18:49 INFO]: [Stargate] [Stargate::onSignChange] Initialized stargate: 1
[11:18:57 INFO]: [Stargate] [Stargate::createPortal] h = false a = false p = false f = false b = true s = false n = false r = false u = false
[11:18:57 INFO]: [Stargate] [Stargate::manualDebug] Point 2: minecraft:dead_tube_coral_wall_fan[facing=south,waterlogged=true]
[11:18:57 INFO]: [Stargate] [Stargate::onSignChange] Initialized stargate: 2
[11:19:17 INFO]: [Stargate] [Stargate::createPortal] h = false a = false p = false f = false b = true s = false n = false r = false u = false
[11:19:17 INFO]: [Stargate] [Stargate::manualDebug] Point 2: minecraft:dead_tube_coral_wall_fan[facing=west,waterlogged=true]
[11:19:17 INFO]: [Stargate] [Stargate::register] Network dba not in lookupNamesNet, adding
[11:19:17 INFO]: [Stargate] [Stargate::register] Network dba not in allPortalsNet, adding
[11:19:17 INFO]: [Stargate] [Stargate::onSignChange] Initialized stargate: 5
[11:19:26 INFO]: [Stargate] [Stargate::createPortal] h = false a = false p = false f = false b = true s = false n = false r = false u = false
[11:19:26 INFO]: [Stargate] [Stargate::manualDebug] Point 2: minecraft:dead_tube_coral_wall_fan[facing=east,waterlogged=true]
[11:19:26 INFO]: [Stargate] [Stargate::onSignChange] Initialized stargate: 6
[11:19:47 INFO]: [Stargate] [Stargate::createPortal] idParent belongs to existing gate
[11:19:58 INFO]: [Stargate] [Stargate::Unregister] Unregistering gate 1
[11:19:58 WARN]: [Stargate] [Stargate] Sign block is not a Sign object
[11:19:58 INFO]: [Stargate] [Stargate::Portal::drawSign] Block: WATER @ Location{world=CraftWorld{name=lclo},x=-254.0,y=3.0,z=310.0,pitch=0.0,yaw=0.0}
[11:20:07 INFO]: [Stargate] [Stargate::createPortal] h = false a = false p = false f = false b = true s = false n = false r = false u = false
[11:20:07 INFO]: [Stargate] [Stargate::manualDebug] Point 2: minecraft:dead_tube_coral_wall_fan[facing=west,waterlogged=true]

Repro steps

Unknown. Possibly something to do with backwards gates positioned as follows (orthogonal view)

 [] []
<[] []>
 [] []
 [] []

Backwards Compatibility

Background

We are currently using the 1.17 API.
As 1.17 has not been fully phased in by the community yet, it would be a good idea to support 1.16 as well.

Description

When a user runs the plugin on 1.16, they are met with an IPE.
We should probably add backwards compatibility to avoid this (at least to 1.16).

Trace

[08:50:38] [Server thread/ERROR]: Could not load 'plugins\Stargate-0.10.7.0.jar' in folder 'plugins'
org.bukkit.plugin.InvalidPluginException: Unsupported API version 1.17
	at org.bukkit.craftbukkit.v1_16_R3.util.CraftMagicNumbers.checkSupported(CraftMagicNumbers.java:361) ~[patched_1.16.5.jar:git-Paper-779]
	at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:149) ~[patched_1.16.5.jar:git-Paper-779]
	at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:414) ~[patched_1.16.5.jar:git-Paper-779]
	at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:322) ~[patched_1.16.5.jar:git-Paper-779]
	at org.bukkit.craftbukkit.v1_16_R3.CraftServer.loadPlugins(CraftServer.java:393) ~[patched_1.16.5.jar:git-Paper-779]
	at net.minecraft.server.v1_16_R3.DedicatedServer.init(DedicatedServer.java:269) ~[patched_1.16.5.jar:git-Paper-779]
	at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:1069) ~[patched_1.16.5.jar:git-Paper-779]
	at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$a$0(MinecraftServer.java:291) ~[patched_1.16.5.jar:git-Paper-779]
	at java.lang.Thread.run(Thread.java:831) [?:?]

Repro Steps

  1. Start a 1.16 server with a fresh install of the latest stargate release (10.7).

Stargate has now disabled itself due to the IPE.

More intuitive config file

The current config.yml is poorly explained, improperly formatted, and extremely intuitive.

We can handle the intuition in the rewrite, but for now, we can at least clean up the formatting and commenting.

Subpermissions for stargate.use

Currently, stargate.use allows players to activate and enter stargates.

It has been suggested that these could be split into:
stargate.use.enter Ability to enter an active stargate (i.e. always on or active by another player)
stargate.use.activateAbility to activate a stargate (i.e. making an always-on sign or using the activator).

For backwards compatibility, stargate.use will continue to be a general node that grants both of the above subnodes.

Implement Networked Portals

If a portal is created, and it doesn't have a specified destination, it should function as a networked gate.

gate 1

Network (can be blank)

Networked gates should have the option to scroll through, and select, available destinations.

Update to 1.17

Ensure that all features are working now that the 1.17 API has been released.
Possible changes that might break stuff are as follows: (ticked if harmless)

  • Copper changes states unless waxed
  • Glowing signs exist... not sure how those will work with portals.
  • Y axis can now reach values of N; can be:
    • positive
    • negative
  • Slabs is now a block type.
  • We now need to use java 16

Backup language issue.

If an invalid language is set in the config, it will resort to the backup language.
Currently, that is broken, and will cause problems.

`H` The Hidden Flag

This flag makes it so that any applicable gate will not appear when scrolling through a NETWORKED PORTAL's UI.

Inconsistent compilation bug

This get thrown at server ini:

[20:54:08 ERROR]: Error occurred while enabling Stargate v0.10.5.2 (Is it up to date?)
java.lang.NoClassDefFoundError: java/lang/constant/Constable
at net.TheDgtl.Stargate.Stargate.loadAllPortals(Stargate.java:246) ~[?:?]
at net.TheDgtl.Stargate.Stargate.onEnable(Stargate.java:165) ~[?:?]
at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:263) ~[patched_1.16.5.jar:git-Paper-468]
at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:380) ~[patched_1.16.5.jar:git-Paper-468]
at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:483) ~[patched_1.16.5.jar:git-Paper-468]
at org.bukkit.craftbukkit.v1_16_R3.CraftServer.enablePlugin(CraftServer.java:500) ~[patched_1.16.5.jar:git-Paper-468]
at org.bukkit.craftbukkit.v1_16_R3.CraftServer.enablePlugins(CraftServer.java:414) ~[patched_1.16.5.jar:git-Paper-468]
at net.minecraft.server.v1_16_R3.MinecraftServer.loadWorld(MinecraftServer.java:465) ~[patched_1.16.5.jar:git-Paper-468]
at net.minecraft.server.v1_16_R3.DedicatedServer.init(DedicatedServer.java:239) ~[patched_1.16.5.jar:git-Paper-468]
at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:936) ~[patched_1.16.5.jar:git-Paper-468] at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$a$0(MinecraftServer.java:174) ~[patched_1.16.5.jar:git-Paper-468]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_281]
Caused by: java.lang.ClassNotFoundException: java.lang.constant.Constable
at java.net.URLClassLoader.findClass(Unknown Source) ~[?:1.8.0_281]
at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:182) ~[patched_1.16.5.jar:git-Paper-468]
at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:111) ~[patched_1.16.5.jar:git-Paper-468]
at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_281]
at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_281]
... 12 more


How to recreate (might only be a thing from my setup): Compile the plugin, check if it works, if not, recompile it (redo this untill you get an error). Cleaning the target folder has always solved this issue for me, but that might be affirmative bias

No-one is really affected by this except for developers, as the plugin file works completely fine once it has been compiled properly. (extremely low priority)

Weird iterator error

Scrolling through a networked gate too fast can throw this error in a constant loop:

[18:08:48] [Server thread/WARN]: [Stargate] Task #2 for Stargate v0.11.0.3 generated an exception
java.util.ConcurrentModificationException: null
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013) ~[?:?]
at java.util.ArrayList$Itr.remove(ArrayList.java:981) ~[?:?]
at net.TheDgtl.Stargate.SyncronousPopulator.run(SyncronousPopulator.java:22) ~[?:?]
at org.bukkit.craftbukkit.v1_17_R1.scheduler.CraftTask.run(CraftTask.java:81) ~[spigot-1.17.jar:3162-Spigot-f773da8-b121d3b]
at org.bukkit.craftbukkit.v1_17_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:400) ~[spigot-1.17.jar:3162-Spigot-f773da8-b121d3b]
at net.minecraft.server.MinecraftServer.b(MinecraftServer.java:1252) ~[spigot-1.17.jar:3162-Spigot-f773da8-b121d3b]
at net.minecraft.server.dedicated.DedicatedServer.b(DedicatedServer.java:436) ~[spigot-1.17.jar:3162-Spigot-f773da8-b121d3b]
at net.minecraft.server.MinecraftServer.a(MinecraftServer.java:1200) ~[spigot-1.17.jar:3162-Spigot-f773da8-b121d3b]
at net.minecraft.server.MinecraftServer.x(MinecraftServer.java:1027) ~[spigot-1.17.jar:3162-Spigot-f773da8-b121d3b]
at net.minecraft.server.MinecraftServer.lambda$0(MinecraftServer.java:307) ~[spigot-1.17.jar:3162-Spigot-f773da8-b121d3b]
at java.lang.Thread.run(Thread.java:831) [?:?]

Cave air issue.

If you attempt to make a portal within block.minecraft.cave_air, it will not be recognized.

Permission Stem Problem

Background

By default, all stargate perms are stargate.node as specified in readme.md

Description

Currently, the stargate prefix of a perm has been removed.
Whereas the perm to create a personal portal should be stargate.create.personal, it has instead become create.personal

Trace

image

Discussion

This issue appears to have been introduced in 10.3.2

Implement Fixed Portals

If a portal is created as follows

gate 1
gate 2
Network (can be blank)

It should result in a fixed portal being created.

Implement Gate Detection

A method should be created to allow gate types to be implemented. Currently, this is done through .gate files.

Schematic support may also be beneficial.

Mobs deleted when entering a portal

When entering any normal (not underwater) portal, mobs appear to be deleted.
An exception to this is mobs in minecarts, which arrive at their destination as intended.

### Implement Activator Management

Activators should automatically be added to gates, as a function of their state.

  • Underwater Portals (Wall Coral)
  • Normal Portals (Buttons)

May also be possible to implement upstream's activator customization feature.

Directional Bug.

Background

A portal with a closing-block specified as water is an underwater portal. A portal with either the A flag or the R flag is a type of always-on.

Description

Underwater portals, upon first creation will fail at construction and print a stack trace.
An air block attempts to get placed in front of the portal -- not a coral.

Any portal that is facing south will not experience the above.
This is because, by default, MC's dead_tube_coral_wall_fan faces south.

If one attempts to create a portal on the exact same spot a failed portal has already been made, it will work.
This persists across server restarts.

This issue impacts ALL variants and types of portals EXCEPT anything considered Always-On.
This includes the A flag and the R flag.

In no situation will this problem impact and above-ground portal.
This problem will begin to occur the first server restart after a fresh install of SG.

Trace

java.lang.ClassCastException: class org.bukkit.craftbukkit.v1_16_R3.block.data.CraftBlockData cannot be cast to class org.bukkit.block.data.Directional (org.bukkit.craftbukkit.v1_16_R3.block.data.CraftBlockData and org.bukkit.block.data.Directional are in unnamed module of loader 'app')
        at net.TheDgtl.Stargate.Portal.createPortal(Portal.java:1212) ~[?:?]
        at net.TheDgtl.Stargate.Stargate$bListener.onSignChange(Stargate.java:999) ~[?:?]
        at com.destroystokyo.paper.event.executor.MethodHandleEventExecutor.execute(MethodHandleEventExecutor.java:37) ~[patched_1.16.4.jar:git-Paper-337]
        at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:80) ~[patched_1.16.4.jar:git-Paper-337]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[patched_1.16.4.jar:git-Paper-337]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:607) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.PlayerConnection.a(PlayerConnection.java:2803) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.PlayerConnection.lambda$a$16(PlayerConnection.java:2756) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.PlayerConnection.lambda$a$1(PlayerConnection.java:324) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.PlayerConnection.lambda$a$3(PlayerConnection.java:338) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.TickTask.run(SourceFile:18) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeTask(IAsyncTaskHandler.java:136) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeNext(IAsyncTaskHandler.java:109) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.MinecraftServer.bb(MinecraftServer.java:1133) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.MinecraftServer.executeNext(MinecraftServer.java:1126) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.awaitTasks(IAsyncTaskHandler.java:119) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.MinecraftServer.sleepForTick(MinecraftServer.java:1087) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:1001) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$a$0(MinecraftServer.java:178) ~[patched_1.16.4.jar:git-Paper-337]
        at java.lang.Thread.run(Thread.java:834) [?:?]

Repro steps

Unknown

verifyPortals is broken.

Background

When the verifyPortals config option is set to true, StarGate experiences weird behaviours while operating and while loading.

Description

When a user connects an existing gate (by creating its destination portal), the gate functions, although does not update the sign.
When a user restarts the server, all existing stargates are unverified.

Demonstration

image

[09:13:34] [Server thread/INFO]: [Stargate] Stargate v.0.10.7.0 is enabled.
[09:13:34] [Server thread/INFO]: [Stargate] [Stargate] Loaded 76 gate layouts
[09:13:35] [Server thread/INFO]: [Stargate] [loadAllGates] Control Block Type == SMOOTH_STONE_SLAB
[09:13:35] [Server thread/INFO]: [Stargate] [loadAllGates] Control Block Type == SMOOTH_STONE_SLAB
[09:13:35] [Server thread/INFO]: [Stargate] [Unregister] Unregistering gate test10
[09:13:35] [Server thread/INFO]: [Stargate] [Stargate] Destroying stargate at Portal [id=-235,6,-163, network=bugreport name=test10, type=Lapis1.gate]
[09:13:35] [Server thread/INFO]: [Stargate] [loadAllGates] Control Block Type == SMOOTH_STONE_SLAB
[09:13:35] [Server thread/INFO]: [Stargate] [loadAllGates] Control Block Type == SMOOTH_STONE_SLAB
[09:13:35] [Server thread/INFO]: [Stargate] [Unregister] Unregistering gate test11
[09:13:35] [Server thread/INFO]: [Stargate] [Stargate] Destroying stargate at Portal [id=-239,6,-163, network=bugreport name=test11, type=Lapis1.gate]
[09:13:35] [Server thread/INFO]: [Stargate] [Stargate] {test} Loaded 0 stargates with 0 set as always-on
[09:13:35] [Server thread/INFO]: [Stargate] [Stargate] {test_nether} No stargates for world 

Repro Steps

  1. Start a server with a fresh install of stargate.
  2. Set verifyPortals to true in config.yml
  3. Make a fixed gate.
  4. Make its destination gate.

The entrance gate now incorrectly shows as being disconnected.

  1. Restart the sever.

Both of your gates have been wrongly unregistered and are now deleted.

`R` Random Gates

Any gate with no fixed exit and the R flag should choose an eligible portal at random.

Currently, R portals are always A portals, although that may not be needed.

Deleting a default gate from the plugin's gates folder results in an IllegalArgumentException

Background

When stargate is first run, it copies the three default gates from its resources folder into the installation's gates folder.
That folder is editable by users.

Description

When a user deletes a default gate file and restarts the server, the plugin fails to load (instead printing an IAE).

Trace

[09:44:22] [Server thread/INFO]: [Stargate] Enabling Stargate v0.10.7.3
[09:44:22] [Server thread/INFO]: [Stargate] Stargate v.0.10.7.3 is enabled.
[09:44:22] [Server thread/ERROR]: Error occurred while enabling Stargate v0.10.7.3 (Is it up to date?)
java.lang.IllegalArgumentException: The embedded resource 'gates/nether.gate' cannot be found in plugins\Stargate-0.10.7.3.jar
	at org.bukkit.plugin.java.JavaPlugin.saveResource(JavaPlugin.java:192) ~[patched_1.17.jar:git-Paper-69]
	at net.TheDgtl.Stargate.Stargate.saveDefaultGates(Stargate.java:280) ~[?:?]
	at net.TheDgtl.Stargate.Stargate.onEnable(Stargate.java:163) ~[?:?]
	at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:263) ~[patched_1.17.jar:git-Paper-69]
	at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:370) ~[patched_1.17.jar:git-Paper-69]
	at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:500) ~[patched_1.17.jar:git-Paper-69]
	at org.bukkit.craftbukkit.v1_17_R1.CraftServer.enablePlugin(CraftServer.java:518) ~[patched_1.17.jar:git-Paper-69]
	at org.bukkit.craftbukkit.v1_17_R1.CraftServer.enablePlugins(CraftServer.java:432) ~[patched_1.17.jar:git-Paper-69]
	at net.minecraft.server.MinecraftServer.loadWorld(MinecraftServer.java:643) ~[patched_1.17.jar:git-Paper-69]
	at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:304) ~[patched_1.17.jar:git-Paper-69]
	at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1118) ~[patched_1.17.jar:git-Paper-69]
	at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:320) ~[patched_1.17.jar:git-Paper-69]
	at java.lang.Thread.run(Thread.java:831) [?:?]
[09:44:22] [Server thread/INFO]: [Stargate] Disabling Stargate v0.10.7.3

Repro Steps

  1. Start a server with a fresh install of stargate.
  2. Make a default gate.
  3. Stop the server
  4. Delete that default gate's .gate file from plugins/stargate/gates.
  5. Restart the server.
    Stargate has now disabled itself due to the IAE.

Note that this was tested with verifyPortals: false.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.