Git Product home page Git Product logo

survivalgames's Introduction

SurvivalGames

Build Status Discord

SurvivalGames is a Sponge Plugin which lets you play the classic Minecraft Survival Games game mode on your Sponge Server! You can run multiple survival games at once, and each game is customizable. Config files for survival games can be saved and loaded from file.

This plugin was created for the Sponge Summer Plugin Competition 2016.

Demo

NOTE: Players participating in the demo must be operators.

NOTE: Command blocks must be enabled to use all the features.

Installing the plugin on your server gives you instant access to survival games. just run /ssg demo to have the demo worlds and config files automatically downloaded. I'm still working out bugs, so please run it on a fresh server. Run these commands to get the server running:

  • /ssg demo
  • Wait for all steps to be completed
  • For each player: /ssg add player demo <player> or for yourself: /ssg join demo
  • /ssg start demo

Commands

Everything which can be set via a config can also be adjusted through commands. The root command is /ssg. Other commands include:

  • /ssg create <game> Creates a new survival game
  • /ssg delete <game> Deletes a survival game
  • /ssg load <game> <file> Loads a survival game from a config file
  • /ssg save <game> <file> Saves a survival game to a config file
  • /ssg set <game> <property> <value> Sets a p\config value of a survival game
  • /ssg print <game> <property> Prints the current value of a config property
  • /ssg add <game> <list-propery> <value> Adds a value to a list property. Examples include spawn points and players.
  • /ssg remove <game> <list-property> <value> Removes a value from a list property.

Permissions

Each command has its own permission, based on the structure of the command in the command tree. For example, to run /ssg add player, you need the permission "ssg.add.player".

Config

Each survival game config has the following options:

  • World name
  • A vector for the center of the map
  • Spawn locations
  • Boundaries for the game (World borders are created from this)
  • An exit world and vector, for teleporting players who have perished in the games.
  • Loot for spawning items in chests
  • Mob spawners

Mob Spawners

You can configure a certain region to spawn mobs when a survival game is running. This is done via the /ssg add mob-spawn-area <game> <x> <y> <z> <x> <y> <z> <EntityType> <EntitysPerMinute>

Events

SurvivalGames has its own events which are fired when game-related things happen. Not only can other players use these events, but SurvivalGames also can fire command blocks with the command /ssg event [EventName]. This allows for mapmakers to do some really custom stuff!

For example, If a command block is set with the command /ssg event MobSpawnedEvent, then whenever a MobSpawnedEvent occurs, the command block is executed. It is then turned into a redstone torch for 5 seconds, so surrounding blocks can be powered. (This is a temporary workaround)

Java Docs

You can view the Javadocs here: http://mattysweeps.github.io/SurvivalGames/docs/index.html I recommend you just look at the source code ;)

Contributing

Don't forget to add the git hooks:

cp scripts/pre-commit .git/hooks

survivalgames's People

Contributors

dove-bren avatar mattysweeps avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

survivalgames's Issues

Add more events

Add events like SurvivalGameStartedEvent and DeathMatch event and similar

Disappearing Blocks

Here's an amusing one for you. I'm investigating this plugin as part of a new server that I'm building - intended to service (mostly vanilla) 1.12.2 clients. I set up the plugin (along with LuckPerms so users aren't opped - otherwise the demo map spams the chat), and noticed some pretty weird behaviour in the demo.

For clients with Forge installed: Everything works as expected. Aside from the spawn protection, which I assume is why the README states that users should be opped when testing the demo - everything seems to work just fine.

For vanilla clients - without Forge: When joining a game, users are kicked for flying. If the server is configured to allow flight, users are unable to right-click blocks. The blocks disappear instead. The server does not appear to validate their movement either - they are free to move through any blocks they've vanished, although the server will register that they're inside the block and apply damage accordingly.


Server info

Sponge: SpongeForge 1.12.2-2825-7.1.6 (current recommended build)
Forge: 2825 (as recommended for this SpongeForge build)
SurvivalGames: 1.2.0 (from Ore)


Any ideas?

Deathmatch is broken

  • it redoes player state
  • the post countdown event fires again for it, which isn't ideal
  • player spawns get changed to where they were before the deathmatch
  • player's sometimes experience super lag when killed in the deathmatch.

Player inventories are not wiped/restored

I tested this out: it seems a player's inventory is not temporarily swapped with an empty one for games.

Players should always start with a clean (or pre-set) inventory.

error using ready command

whenever I try the command ready, I get an error and this log!

[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: java.util.concurrent.CompletionException: java.lang.RuntimeException: Error while switching states: World name is not set.
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at java.util.concurrent.CompletableFuture.encodeThrowable(Unknown Source)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at java.util.concurrent.CompletableFuture.completeThrowable(Unknown Source)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at java.util.concurrent.CompletableFuture$AsyncRun.run(Unknown Source)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at org.spongepowered.api.scheduler.Task$Builder.lambda$execute$0(Task.java:139)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at org.spongepowered.common.scheduler.SchedulerBase.lambda$startTask$0(SchedulerBase.java:192)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at org.spongepowered.common.scheduler.SyncScheduler.executeTaskRunnable(SyncScheduler.java:74)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at org.spongepowered.common.scheduler.SchedulerBase.startTask(SchedulerBase.java:183)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at org.spongepowered.common.scheduler.SchedulerBase.processTask(SchedulerBase.java:169)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at java.util.concurrent.ConcurrentHashMap$ValuesView.forEach(Unknown Source)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at org.spongepowered.common.scheduler.SchedulerBase.runTick(SchedulerBase.java:112)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at org.spongepowered.common.scheduler.SyncScheduler.tick(SyncScheduler.java:47)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at org.spongepowered.common.scheduler.SpongeScheduler.tickSyncScheduler(SpongeScheduler.java:189)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at org.spongepowered.mod.SpongeMod.onTick(SpongeMod.java:403)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_17_SpongeMod_onTick_ServerTickEvent.invoke(.dynamic)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:746)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:696)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at net.minecraftforge.fml.common.FMLCommonHandler.onPreServerTick(FMLCommonHandler.java:279)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:657)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:526)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at java.lang.Thread.run(Unknown Source)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: Caused by: java.lang.RuntimeException: Error while switching states: World name is not set.
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: at io.github.m0pt0pmatt.survivalgames.command.executor.state.AbstractStateCommand.lambda$executeCommand$1(AbstractStateCommand.java:100)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: at io.github.m0pt0pmatt.survivalgames.thread.DotProgressable.run(DotProgressable.java:47)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: ... 19 more
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: Caused by: java.lang.IllegalArgumentException: World name is not set.
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: at io.github.m0pt0pmatt.survivalgames.game.SurvivalGameStateManager.lambda$checkConfig$0(SurvivalGameStateManager.java:140)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: at java.util.Optional.orElseThrow(Unknown Source)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: at io.github.m0pt0pmatt.survivalgames.game.SurvivalGameStateManager.checkConfig(SurvivalGameStateManager.java:140)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: at io.github.m0pt0pmatt.survivalgames.game.SurvivalGameStateManager.ready(SurvivalGameStateManager.java:84)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: at io.github.m0pt0pmatt.survivalgames.command.executor.state.ReadySurvivalGameCommand.doWork(ReadySurvivalGameCommand.java:48)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: at io.github.m0pt0pmatt.survivalgames.command.executor.state.AbstractStateCommand.lambda$executeCommand$1(AbstractStateCommand.java:98)
[13:30:45] [pool-3-thread-34/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: ... 20 more

/ssg set blocks shouldn't be necessary

The /ssg set blocks command is tedious. Instead, config files should also store the block data, either in the same config file or maybe a second one (to split the map config from the survival game config)

Add further documentation on how to /ssg load. It's not functioning correctly.

The Wiki doesn't give an example on how to use '/ssg load world-name file-path.' I'm having trouble loading with the command.

I receive this error. (Which tells me nothing)

User
[01:46:45] [pool-2-thread-4/INFO] [minecraft/DedicatedServer]: Loading: .
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]: org.spongepowered.api.data.persistence.InvalidDataException: Could not deserialize something correctly, likely due to bad type data.
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at org.spongepowered.api.data.persistence.AbstractDataBuilder.build(AbstractDataBuilder.java:89)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at org.spongepowered.common.data.SpongeDataManager.lambda$deserialize$0(SpongeDataManager.java:188)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at java.util.Optional.flatMap(Unknown Source)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at org.spongepowered.common.data.SpongeDataManager.deserialize(SpongeDataManager.java:188)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at org.spongepowered.common.config.DataSerializableTypeSerializer.deserialize(DataSerializableTypeSerializer.java:66)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at org.spongepowered.common.config.DataSerializableTypeSerializer.deserialize(DataSerializableTypeSerializer.java:45)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at ninja.leaping.configurate.objectmapping.serialize.AbstractListChildSerializer.deserialize(AbstractListChildSerializer.java:43)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at ninja.leaping.configurate.objectmapping.ObjectMapper$FieldData.deserializeFrom(ObjectMapper.java:140)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at ninja.leaping.configurate.objectmapping.ObjectMapper$BoundInstance.populate(ObjectMapper.java:201)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at ninja.leaping.configurate.objectmapping.serialize.AnnotatedObjectSerializer.deserialize(AnnotatedObjectSerializer.java:34)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at ninja.leaping.configurate.objectmapping.ObjectMapper$FieldData.deserializeFrom(ObjectMapper.java:140)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at ninja.leaping.configurate.objectmapping.ObjectMapper$BoundInstance.populate(ObjectMapper.java:201)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand.lambda$executeCommand$0(LoadConfigCommand.java:90)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at io.github.m0pt0pmatt.survivalgames.thread.DotProgressable.run(DotProgressable.java:47)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at java.util.concurrent.CompletableFuture$AsyncRun.run(Unknown Source)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at org.spongepowered.api.scheduler.Task$Builder.lambda$execute$0(Task.java:139)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at org.spongepowered.common.scheduler.SchedulerBase.lambda$startTask$0(SchedulerBase.java:197)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at java.util.concurrent.FutureTask.run(Unknown Source)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand:lambda$executeCommand$0:95]:
at java.lang.Thread.run(Unknown Source)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: Caused by: java.util.NoSuchElementException: No value present
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: at java.util.Optional.get(Unknown Source)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: at org.spongepowered.common.data.builder.item.SpongeItemStackSnapshotBuilder.buildContent(SpongeItemStackSnapshotBuilder.java:61)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: at org.spongepowered.api.data.persistence.AbstractDataBuilder.build(AbstractDataBuilder.java:87)
[01:46:45] [pool-2-thread-5/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: ... 21 more
[01:46:46] [pool-2-thread-4/INFO] [minecraft/DedicatedServer]: Loading: ..
[01:46:46] [pool-2-thread-4/INFO] [minecraft/DedicatedServer]: Error running command. Check the server logs for more details
[01:46:46] [pool-2-thread-4/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: java.util.concurrent.CompletionException: java.lang.RuntimeException: org.spongepowered.api.command.CommandException: An error occurred when loading
[01:46:46] [pool-2-thread-4/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at java.util.concurrent.CompletableFuture.encodeThrowable(Unknown Source)
[01:46:46] [pool-2-thread-4/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at java.util.concurrent.CompletableFuture.completeThrowable(Unknown Source)
[01:46:46] [pool-2-thread-4/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at java.util.concurrent.CompletableFuture$AsyncRun.run(Unknown Source)
[01:46:46] [pool-2-thread-4/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at org.spongepowered.api.scheduler.Task$Builder.lambda$execute$0(Task.java:139)
[01:46:46] [pool-2-thread-4/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at org.spongepowered.common.scheduler.SchedulerBase.lambda$startTask$0(SchedulerBase.java:197)
[01:46:46] [pool-2-thread-4/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
[01:46:46] [pool-2-thread-4/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at java.util.concurrent.FutureTask.run(Unknown Source)
[01:46:46] [pool-2-thread-4/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
[01:46:46] [pool-2-thread-4/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
[01:46:46] [pool-2-thread-4/INFO] [STDERR]: [java.util.Optional:ifPresent:-1]: at java.lang.Thread.run(Unknown Source)
[01:46:46] [pool-2-thread-4/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: Caused by: java.lang.RuntimeException: org.spongepowered.api.command.CommandException: An error occurred when loading
[01:46:46] [pool-2-thread-4/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: at io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand.lambda$executeCommand$0(LoadConfigCommand.java:101)
[01:46:46] [pool-2-thread-4/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: at io.github.m0pt0pmatt.survivalgames.thread.DotProgressable.run(DotProgressable.java:47)
[01:46:46] [pool-2-thread-4/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: ... 8 more
[01:46:46] [pool-2-thread-4/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: Caused by: org.spongepowered.api.command.CommandException: An error occurred when loading
[01:46:46] [pool-2-thread-4/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]: at io.github.m0pt0pmatt.survivalgames.command.executor.LoadConfigCommand.lambda$executeCommand$0(LoadConfigCommand.java:96)
[01:46:46] [pool-2-thread-4/INFO] [STDERR]: [java.lang.Throwable:printStackTrace:-1]

Demo command completely overwrites the server's world

The demo command loads the demo world over the existing server worlds. This means it's not safe to use the demo command on anything but a test server: a huge detriment to the plugin.

Furthermore, it expects the server's level name to be world.

And it also requires an /fml confirm command to load the outdated map.

Instead of loading a world, a possible solution would be to use a WorldEdit schematic, or to use Sponge native block serialization methods.

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.