hazebyte / cratereloaded Goto Github PK
View Code? Open in Web Editor NEWIssue tracker for the Bukkit plugin, CrateReloaded
Issue tracker for the Bukkit plugin, CrateReloaded
As mob eggs no longer have separate IDs in minecraft 1.9, an alternative way to display them in the reward rotation is needed. Same with potions and enchanted books, as they also no longer have separate IDs. Perhaps even support for specific player heads?
Title Formatting for MenuCrate is broken. (Colors)
I mean, it works 100% but uh,
http://pastebin.com/raw/dN8yjqgQ
Just kinda annoying ;D
Roulette Crate is in need of an update. If you have any ideas, list them below.
Hi, I just connect to my server and I see that I have 17 TPS...
Check here: http://timings.aikar.co/?url=15016613
MysteryCrate take too much ressource for playerinteractevent.
Any way to fix this because a part of my server laggs come from your plugin :( I know it is weird, but it happens without reason or error...
Thank you and maybe a fix fast for this problem.
Have a nice day/night
Usage: Prevent users from spamming crates.
Currently crate messages do not output / save to the console log. Instead they are clientside messages only. Shouldn't some of the crate messages output to console / server log, such as when a user receives and uses a crate key?
So Virtual Crates, where you define in the config where you want the crate to be in a gui with a size of the gui, you will set the crate on a block as ./cr setvirtualcrate this will set a virtual crate when you punch the items it will come up as the same menu one will be where you can open the keys and another where you can see the items in the keys (Left click and right click on the crate)
Config:
VirtualCrates:
Default_Item: Stained_Pane_Glass (This will be if no item is found on the crates)
ItemShowTitle: "&cClick to see whats inside a crate" (This will be the title of the gui on punch of the crate)
ItemTitle: "&cClick to enter a crate" (This will be the title of the gui on right click)
Rows: 3
Crates:
Vote:
Slot: 9
Item: Diamond (This will be the item of the crate)
Name: "&aVote Crate"
Lore:
- "&7Amount&8 &e%amount%"
Command:
/Crate givevkey name crate amount
/Crate giveallvkey name crate amount
Alias: V, Virtual
They're isn't a very long command list in game, and then you have to search for it online, please add an in game command list for convenience.
Suggested this before via spigot message, however I think this is the more correct place to suggest it.
I personally use keys (as do many other servers) mainly as a purchase from my store via real money.
This cuts off a lot of people from getting access to being able to use keys, and for my setup giving entire keys out to players for completing tasks in-game would be a bit overpowered (unless the "task" in question was extremely difficult).
However giving out a "Key Fragment" that could be used to later craft keys when you have gained multiple fragments would work great
So my suggestion is really just making keys craftable, the recipes could be custom.
This will allow for servers to let players gain keys slowly overtime instead of all at once, which makes it easier to give the fragments for less intensive challenges.
Also as many servers have multiple tiers to there crate keys (common -> rare). This could allow for configuration of combining multiple less valuable keys, for a more valuable one giving the players the opportunity to use there less common keys right away, or save up until they can craft a more valuable one!
No clue how this would work in the coding or the config, but hopefully it's possible!
Players are given a crate instead of a key.
Default Minecraft Commands
Breaks Parsing
- 'cmd:(/give %player% potion 3 0 {CustomPotionEffects:[{Id:8, Amplifier:1, Duration:2500}]}), chance:(15), display:(potion 1 &a3_LeapPotions! &f%chance%), broadcast:(%prefix%3 Leap Potions)'
execute %player% ~ ~ ~ Zombie ~0 ~1 ~0 {HandItems:[{id:diamond_axe},{id:diamond_sword}],ArmorItems:[{},{},{},{id:diamond_helmet}]}
give %player% potion 3 0 {CustomPotionEffects:[{Id:8, Amplifier:1, Duration:2500}], display:{Name:"Leap Potion", Lore:["Have Fun!!"]}}
edit: Added more Strings
In order to prevent duplication in creative mode, CrateReloaded will be adding a creative control.
This will limit the player to perform move, click, and check actions on keys when inside creative gamemode.
Current implementation: Simple Method
Block: Player will not be able to move keys or crates.
Use: Players will be able to use Crates/Keys by right clicking
Hi, is it possible to add a slime, creeper, skeleton, villager or anything else to allow player to righ-click it to use their keys for example.
For the moment, we used chest/blocks, but it can be very nice to see npc or mob support ;)
Thank you
Spirals, texts, countdowns, explosions like hypixel or other big servers.
Config option to display item %chance% as a percentage instead of a fraction? For example, 100/1000 displaying as 10%.
to-do: Something awesome :)
display:(175 1 &a$500 &8&lVery_Commmon%line%&7Money)'
It just does not give a lore, could we add empty lines please like you can on an item?
Thanks
CrateReloaded 1.3.70
PaperSpigot dev 706
ProtocolLib dev 273
PermissionsEx 1.23.5-SNAPSHOT
Using a crate that has onetime permission checks in the reward completely breaks the server. When you try to open the crate, it displays nothing but an empty chest window. In chat, it outputs Message not found: crate.reward.none
a couple dozen times before it eventually stops. In console, this error occurs and the OutOfBoundException continues to spam non-stop until the server is restarted.
[23:04:52] [Server thread/ERROR]: Could not pass event PlayerInteractEvent to CrateReloaded v1.3.70
org.bukkit.event.EventException
at org.bukkit.plugin.EventExecutor$1.execute(EventExecutor.java:46) ~[patched_1.9.2.jar:git-Paper-706]
at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:78) ~[patched_1.9.2.jar:git-Paper-706]
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[patched_1.9.2.jar:git-Paper-706]
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:517) [patched_1.9.2.jar:git-Paper-706]
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:502) [patched_1.9.2.jar:git-Paper-706]
at org.bukkit.craftbukkit.v1_9_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:231) [patched_1.9.2.jar:git-Paper-706]
at net.minecraft.server.v1_9_R1.PlayerInteractManager.a(PlayerInteractManager.java:482) [patched_1.9.2.jar:git-Paper-706]
at net.minecraft.server.v1_9_R1.PlayerConnection.a(PlayerConnection.java:889) [patched_1.9.2.jar:git-Paper-706]
at net.minecraft.server.v1_9_R1.PacketPlayInUseItem.a(SourceFile:55) [patched_1.9.2.jar:git-Paper-706]
at net.minecraft.server.v1_9_R1.PacketPlayInUseItem.a(SourceFile:11) [patched_1.9.2.jar:git-Paper-706]
at net.minecraft.server.v1_9_R1.PlayerConnectionUtils$1.run(SourceFile:13) [patched_1.9.2.jar:git-Paper-706]
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_92]
at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_92]
at net.minecraft.server.v1_9_R1.SystemUtils.a(SourceFile:45) [patched_1.9.2.jar:git-Paper-706]
at net.minecraft.server.v1_9_R1.MinecraftServer.D(MinecraftServer.java:811) [patched_1.9.2.jar:git-Paper-706]
at net.minecraft.server.v1_9_R1.DedicatedServer.D(DedicatedServer.java:404) [patched_1.9.2.jar:git-Paper-706]
at net.minecraft.server.v1_9_R1.MinecraftServer.C(MinecraftServer.java:721) [patched_1.9.2.jar:git-Paper-706]
at net.minecraft.server.v1_9_R1.MinecraftServer.run(MinecraftServer.java:620) [patched_1.9.2.jar:git-Paper-706]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_92]
Caused by: java.lang.NullPointerException
at cratereloaded.L.e(AnimationMenu.java:110) ~[?:?]
at cratereloaded.N.az(CSGO.java:104) ~[?:?]
at cratereloaded.N.a(CSGO.java:32) ~[?:?]
at cratereloaded.ak.k(AnimationCrate.java:99) ~[?:?]
at cratereloaded.ak.a(AnimationCrate.java:62) ~[?:?]
at cratereloaded.aH.c(PlayerInteractListener.java:139) ~[?:?]
at cratereloaded.aH.a(PlayerInteractListener.java:57) ~[?:?]
at com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor344.execute(Unknown Source) ~[?:?]
at org.bukkit.plugin.EventExecutor$1.execute(EventExecutor.java:44) ~[patched_1.9.2.jar:git-Paper-706]
... 18 more
[23:04:52] [Craft Scheduler Thread - 2/WARN]: Exception in thread "Craft Scheduler Thread - 2"
[23:04:52] [Craft Scheduler Thread - 2/WARN]: org.apache.commons.lang.UnhandledException: Plugin CrateReloaded v1.3.70 generated an exception while executing task 171
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:57)
at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at cratereloaded.N.aA(CSGO.java:124)
at cratereloaded.O.run(CSGO.java:73)
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftTask.run(CraftTask.java:58)
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:53)
... 4 more
[23:04:52] [Craft Scheduler Thread - 3/WARN]: Exception in thread "Craft Scheduler Thread - 3"
[23:04:52] [Craft Scheduler Thread - 3/WARN]: org.apache.commons.lang.UnhandledException: Plugin CrateReloaded v1.3.70 generated an exception while executing task 171
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:57)
at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at cratereloaded.N.aA(CSGO.java:124)
at cratereloaded.O.run(CSGO.java:73)
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftTask.run(CraftTask.java:58)
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:53)
... 4 more
[23:04:52] [Craft Scheduler Thread - 5/WARN]: Exception in thread "Craft Scheduler Thread - 5"
[23:04:52] [Craft Scheduler Thread - 5/WARN]: org.apache.commons.lang.UnhandledException: Plugin CrateReloaded v1.3.70 generated an exception while executing task 171
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:57)
at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at cratereloaded.N.aA(CSGO.java:124)
at cratereloaded.O.run(CSGO.java:73)
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftTask.run(CraftTask.java:58)
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:53)
... 4 more
[23:04:52] [Craft Scheduler Thread - 6/WARN]: Exception in thread "Craft Scheduler Thread - 6"
[23:04:52] [Craft Scheduler Thread - 6/WARN]: org.apache.commons.lang.UnhandledException: Plugin CrateReloaded v1.3.70 generated an exception while executing task 171
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:57)
at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at cratereloaded.N.aA(CSGO.java:124)
at cratereloaded.O.run(CSGO.java:73)
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftTask.run(CraftTask.java:58)
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:53)
... 4 more
[23:04:52] [Craft Scheduler Thread - 7/WARN]: Exception in thread "Craft Scheduler Thread - 7"
[23:04:52] [Craft Scheduler Thread - 7/WARN]: org.apache.commons.lang.UnhandledException: Plugin CrateReloaded v1.3.70 generated an exception while executing task 171
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:57)
at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at cratereloaded.N.aA(CSGO.java:124)
at cratereloaded.O.run(CSGO.java:73)
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftTask.run(CraftTask.java:58)
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:53)
... 4 more
[23:04:52] [Craft Scheduler Thread - 8/WARN]: Exception in thread "Craft Scheduler Thread - 8"
[23:04:52] [Craft Scheduler Thread - 8/WARN]: org.apache.commons.lang.UnhandledException: Plugin CrateReloaded v1.3.70 generated an exception while executing task 171
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:57)
at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at cratereloaded.N.aA(CSGO.java:124)
at cratereloaded.O.run(CSGO.java:73)
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftTask.run(CraftTask.java:58)
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:53)
... 4 more
[23:04:52] [Craft Scheduler Thread - 9/WARN]: Exception in thread "Craft Scheduler Thread - 9"
[23:04:52] [Craft Scheduler Thread - 9/WARN]: org.apache.commons.lang.UnhandledException: Plugin CrateReloaded v1.3.70 generated an exception while executing task 171
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:57)
at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at cratereloaded.N.aA(CSGO.java:124)
at cratereloaded.O.run(CSGO.java:73)
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftTask.run(CraftTask.java:58)
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:53)
... 4 more
Test crate config.
TestCrate:
type: CSGOKEYCRATE
displayName: '&9Test Crate'
holographic:
- '&9Test Crate'
preview:
enabled: false
buy:
enabled: false
cost: 0
message:
onOpen: ''
broadcast: ''
key:
item: 'Tripwire_Hook'
enchantment: '300:1'
name: '&fTest &6Key!'
lore:
- '&7Use on the chest at spawn!'
effect:
onOpenEffects: 'firework, ENTITY_GENERIC_DRINK'
dormantEffects: 'instantspell'
dormantRoulette: 'UI_BUTTON_CLICK'
onRouletteEnd: 'ENTITY_BAT_TAKEOFF'
reward:
minimumRewards: 1
maximumRewards: 1
rewards:
rewards:
- 'cmd:(/pex user %player% add libsdisguises.disguise.bat.nooptions), onetime:(libsdisguises.disguise.bat.nooptions), chance:(1), broadcast:(%prefix%A permanent bat disguise unlock!), display:(383:65 1 &aA_Bat_Disguise! &f%chance% 300:1)'
- 'cmd:(/pex user %player% add echopet.pet.type.spider), cmd:(/pex user %player% add echopet.pet.type.spider.*), onetime:(echopet.pet.type.spider), chance:(1), broadcast:(%prefix%A permanent pet spider unlock!), display:(383:55 1 &aA_Pet_Spider! &f%chance% 300:1)'
- 'cmd:(/pex user %player% add trailgui.trails.hearts), cmd:(/pex user %player% add trailgui.inventory.hearts), onetime:(trailgui.trails.hearts), chance:(1), broadcast:(%prefix%A permanent hearts trail unlock!), display:(38 1 &aA_Hearts_Trail! &f%chance% 300:1)'
creative-control: true
display:
chanceFormat: '#.#'
usage:
cooldown: 1
csgo:
length: 7
topPrizeDisplay: 'REDSTONE_TORCH_ON 1 &6Prize!'
botPrizeDisplay: 'REDSTONE_TORCH_ON 1 &6Prize!'
Removing the onetime feature from the rewards, the crate can spin just fine without any problems.
Instead of only showing chances rounded, add variblae to show it with 1 or two decimals.
(Need because some of my items are set to like 0.5 chances and it shows them as 0%)
Ability to control chance of giving multiple rewards. I would like to have come variable with which I could control what are the odds of player getting more than one reward.
The CS:GO Animation fix - It would be alot better if you could have say if i have a item at 1% in the crate, when you go through the animation it will only be 1% of showing the item instead of showing it loads of times.
%player% - Player Name
%money% - Money Amount -
%itemname% - Item's display name.
%crateuuid% - Crate UUID
Have an option for having keys stored in virtual GUI instead of as items in game. When they open the chest in game it'll check if they have the proper keys in there profile.
People have been requesting virtual chests as well but for my needs I'd prefer to keep the option for a physical chest to be used with virtual key.
I have my worlds inventories separated and my idea is that I could have a player given 5 Keys and they can use them in "world A" on a crate chest and then the rest in "world B" on a different crate chest. Making the player choose were they want to spend the rewards.
Virtual Roulette Keys..
The crate layout starts out as a screen of black glass panes, no keys. You can add a key to whichever slot you like, allowing for many key arrangements and several different amounts of keys per crate. You can also change the background item, default black stained glass pane. Each key item can be a different item, name, lore, and even have the enchanted effect.
When i leave a , in the config it breaks the display
Hello,
I have found two bugs with /cr buy command.
First, that you write /cr buy FoodKey 1 , it doesn't give key but Error crate.
Second, that you write /cr buy FoodKey 1, it gives you 1 key crate for 500$, but when you type /cr buy FoodKey 5, it gives you 5 key crates and again for 500$...
After spending a lot of time working with this plugin I'd really love to see a more clean crate config setup.
Here's what I propose in order for this to happen.
In the crates.yml you can split of different crate files into folders.
Example: This example is taken from DeluxeMenus and it'd be great for this plugin to do something like it.
crate_menus:
donorCrates:
file: donorCrates.yml
normalCrates:
file: normalCrates.yml
So that would create two crate config files which allows us the ability to make the crates config more compact and cleaner.
But than we'd also be able to link it off into it's own folder like so.
crate_menus:
normalCrates:
file: survivalCrates/normalCrates.yml
donorCrates:
file: survivalCrates/donorCrates.yml
I think having this ability would really allow for a clean crate config and would make it easier when creating lots and lots of crates.
Thanks :)
Permission rewards checks if user has x perm node before giving reward. That way you're able to add rewards such as ranks, pets, trails without having the downside of getting same reward again.
CrateReloaded 1.3.70 broke the 'crate.key.wrongkey' language output. It no longer outputs in chat that you are missing the key if you try to click a crate without a key.
If possible make the variable %cratename% to work on all messages. example:
crate.player.keyrecieved=%prefix%You have received a %cratename% key
Now this dont work i use last version.
Allow the placement of several crate keys per a single location.
CrateReloaded was built in August 2014 for Bukkit 1.7.10. Since then, I have learned quite a bit about the Bukkit API, and several parts of the plugin can be improved with the new knowledge that I have now. Additionally, if we were to update to Bukkit 1.8, we could use several new features like Holographics and Armorstands without dependencies.
With that being said, I would like to rework the plugin in 1.8 to accommodate the new features of Minecraft.
Current Plans:
Modularization
Command Tab Completition
update: Rip... time gets the best of you.
Just so foolish players don't screw up once in awhile, could a config field be added to prevent players with full inventories for opening key crates? Something like...
required-open-invy-slots: 2
Hi for an update can you add the ability to have menu crates be a chest thing and have the keys be virtual just like how TheArchon does it so there only has to be one crate and you have your different crates inside of it
Thanks
-term
Detect which version the server is running. Disable it for versions lower than what is supported.
Remove features that aren't supported in 1.7
1.8 Features
PM button near footer links to wrong profile.
CrateReloaded 1.3.70
PaperSpigot dev 706
ProtocolLib dev 273
PermissionsEx 1.23.5-SNAPSHOT
With creative-control enabled and a key in your offhand (MC 1.9), it does not take a key immediately as soon as you open a CSGO crate. Instead, it takes from the stack once the rotation is finished or when you exit the window. Whereas if the keys were in your hotbar, it immediately takes the key.
My players have been having problems opening crates on the Free version. When they normal click they say it doesn't work. Although some players were able to do it when they shift clicked. According to my players it said "You have opened a crate". If you need any other information just ask.
Where: Broadcast and onOpen tags.
What: %player%
Variable is not replaced.
Allow user to specify decimal places.
http://crate.hazebyte.com/guide/pro/user/user-guide/crate/#tags
The option to make it so if you get something in that crate you can never get it again in THAT crate or in all crates or within a certain amount of time or until something for example.
Support for multiple permission checks.
Removal of Vault Dependency.
Change to Soft-Depend (Optional).
Feature: Add Holographic Displays on top of your crate.
Purpose: Allow server owners to simply set a crate without any other configurations ingame.
Dependency: HolographicDisplays
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.