Code Monkey home page Code Monkey logo

chickenapi's Introduction

ChickenAPI

CircleCI Codacy Badge forthebadge

Discord

Description

ChickenAPI is an API, as Bukkit is for Minecraft, but for Nostale. We do want to provide an interoperable API for developers that would like to create some custom content for Nostale Private Servers without having to install their own piece of code into the server source directly

Documentation

PluginSystem EventSystem EntitySystem

How to contribute

Pull requests are accepted however, we are still in a development phasis to make ChickenAPI production ready.

Contributors

  • BlowaXD
  • Elendan
  • Kraken
  • SylEze
  • DarkyZ
  • Eastrall
  • Steve-Nzr
  • Godness-Cookie

Special Thanks : OpenNos contributors, that amount of work helped us to develop ChickenAPI with a lot of informations

chickenapi's People

Contributors

antoinecrb avatar blowaxd avatar clavss avatar codacy-badger avatar godnesscookie 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

chickenapi's Issues

Add documentation to ChickenAPI

Is your feature request related to a problem? Please describe.
We don't have any good documentation yet, we should be able to have one, developer friendly and which is easy to understand to let developers contribute to it :)

Describe the solution you'd like
Docsify might be used for our documentation

Describe alternatives you've considered
VuePress could be good idea too

Feature : Inventory

Inventory is a crucial part of Nostale.

We are actually missing some things :
Item (base item template)
ItemInstances (base item template + custom generated stats / rarity / upgrade)

InventoryComponent (contains ItemInstances at some defined places :)
Wears -> Array of ItemInstances (16 slots)
Equips -> Array of ItemInstances (48 slots)
ETC -> Array of ItemInstances (48 slots)
MAIN -> Array of ItemInstances (48 slots)
SP -> List of ItemInstances
Costumes -> List of ItemInstances

InventorySystem :

  • Move Item
  • Add Item
  • Remove Item
    Sort Inventory (some sorting filters ?)

Client packet exchangelist

ExchangeListPacket

Packet Usage

Used for trade and display of items

Packet Header

Exc_list

Packet Content

{CharacterId} {Gold} 0

Few examples

exc_list 1 54 60

PACKET : RemovePacket - remove

PacketName

remove

Packet Usage

This packet is sent when removing equipment from the character

Packet Header

remove

Packet Content

{EquipSlot} {MateId}

Few examples

remove 0 0 - Removing the sword
remove 9 0 - Removing the mask

Packet : MlObj Packet - mlobj

PacketName

Mlobj

Packet Usage

This packet is sent when you Add/Remove Objects like Warehouse/Minigames to your miniland.

Packet Header

mlobj

Packet Content

{(deleted)} {ItemInstance.Slot} {MapX} {MapY} {ItemInstance.Item.Width} {ItemInstance.Item.Height} {0} {ItemInstance.DurabilityPoint} {0} {(ItemInstance.Item.IsWarehouse)}

Few examples

mlobj 1 1 31 3 4 2 0 7 0 1 - Add Small Warehouse to miniland
mlobj 0 1 31 3 4 2 0 7 0 1 - Remove Small Warehouse from miniland
mlobj 1 0 31 3 4 2 0 10 0 1 - Add Medium Warehouse to miniland
mlobj 1 3 17 23 5 3 0 6000 0 0 - Add Lv 3 Minigame (Stone) to Map X:17 Y:23

Class

        [PacketHeader("mlobj")]
        public class MlobjPacket: PacketBase
        {
            public MlobjPacket()
            {
                Slot = Item.Instance.Slot;
                Width = ItemInstance.Item.Width;
                Height = ItemInstance.Item.Height;
                DurabilityPoint = ItemInstance.DurabilityPoint;
                IsWarehouse = ItemInstance.Item.IsWarehouse;

            }


            [PacketIndex(0)]
            public bool deleted { get; set; }

            [PacketIndex(1)]
            public short Slot { get; set; }

            [PacketIndex(2)]
            public short MapX { get; set; }

            [PacketIndex(3)]
            public short MapY { get; set; }

            [PacketIndex(4)]
            public short Width { get; set; }

            [PacketIndex(5)]
            public short Height { get; set; }

            [PacketIndex(6)]
            public byte Unknown { get; set; } // looks like always 0

            [PacketIndex(7)]
            public short DurabilityPoint { get; set; }

            [PacketIndex(8)]
            public byte Unknown2 { get; set; } // looks like always 0

            [PacketIndex(9)]
            public bool IsWarehouse { get; set; }

        }

Review ECS performances

In many scenarios related to Nostale directly, an entity uses :
VisualType Type of the Entity
Id : This id depends on VisualType, Character and Monster can have the same Ids since their VisualType are different.

Enhancements : AlgorithmService

Algorithm Service that should contains all datas for :

LevelXp(level)
JobLevelXp(level)
HeroLevelXp(level)

Stats(characterClass, level)

PACKET : DropPacket - drop

PacketName

drop

Packet Usage

This packet is sent when you/Mate or NPC/Monster drop an Item.

Packet Header

drop

Packet Content

{ItemVNum} {DropId} {MapX} {MapY} {Amount} {IsQuestitem} {0} {-1}

Few examples

drop 349 100003 49 154 1 0 -1 - Player droping 1 Plexon on position X:49 Y:154
drop 1046 100012 52 157 189 0 0 -1 - Monster droping 189 Gold on position X:52 Y:157
drop 2004 100013 53 155 1 1 0 -1 - Monster droping 1 Seed as a questitem ob position X:53 Y:155

Monster / Npc Entities

Monster & Npc entities should be added in ChickenAPI (IMonsterEntity / INpcEntity are probably useless)

Review packet handling

I think that ChickenAPI should provide a basic packet implementation within it and then raising events through an global event handler that will just broke that event so plugins might add their own handling after that basic handling.

I would like to discuss about that, if anyone got some ideas.

We will have the main evented game logic, however, let's find a cool way to handle that.

Packet : UseSkillPacket - u_s

PacketName

UseSkillPacket

Packet Usage

This packet is sent when you use a skill

Packet Header

u_s

Packet Content

u_s {SkillNumber} {TargetType} {TargetID}

TargetType :

  • 1 is player
  • 2 is player's familiar
  • 3 is monster
    (maybe more)

Few examples

Targeting monsters (PVE)

u_s 0 3 1867
u_s 0 3 1869
u_s 3 3 1867
u_s 8 3 1869

Targeting players (PVP)

u_s 0 2 2082333 a player's familiar
u_s 0 2 1958345

u_s 0 1 27662 a player
u_s 0 1 61195

Targeting self

u_s 14 1 1017
u_s 6 1 1017
u_s 5 1 1017

Note on self target:
This includes AOE skills that are an area around the player, which are either buffs, debuffs or attack skills.

PACKET : ncifPacket - ncif

PacketName

ncifPacket

Packet Usage

This packet is sent, when you mark someone.

Packet Header

ncif

Packet Content

Sent

ncif {number} {charID}

number:
1 - it's player
2 - it's NPC
3 - it's monster

charID: char, NPC, monster ID

It's sent every second.

Few examples

ncif 1 1234567 - I mark a player
ncif 2 2006 - I mark a NPC
ncif 3 6236 - I mark a monster

PACKET : RmvobjPacket - rmvobj

PacketName

RmvobjPacket

Packet Usage

This packet is sent when you remove an object from your miniland

Packet Header

rmvobj

Packet Content

{slot}

Few examples

rmvobj 3 Remove the object on slot 3
rmvobj 2 Remove the object on slot 2 - nothing special

Review : Plugin System

Plugin System has to be reviewed

Plugins has two types of loading :
PreContainerBuild
PostContainerBuild

There should be specific plugins exceptions to handle correctly depending on the exception
PluginLoadException : Thrown if there was an error during plugin load
PluginBadConfigException : thrown if the plugin has a bad configuration
PluginIOAccessException : thrown if the plugin couldn't access to its data

PluginConfigDirectory : own the config & the data related to plugins, a subdirectory has to be created for each plugin
PluginConfigFile : own the plugin configuration

PACKET : MviPacket - mvi

PacketName

Mvi

Packet Usage

This packet is sent when moving items in your inventory

Packet Header

mvi

Packet Content

{InventoryType} {InventorySlot} {Amout} {DestinationSlot}

Few examples

mvi 0 0 1 1 - Moving an Item from Equiment Inventory Slot 1 to Slot 2
mvi 1 6 100 7 - Moving a stackof 100 items from Main Inventory Slot 7 to 8

PACKET : ExchangeListPacket - exc_list

PacketName

exc_list

Packet Usage

This packet is sent when exchanging Items/Gold with someone. It will send the list of items in the 'trade-window' after pressing register.

Packet Header

exc_list

Packet Content

A. {gold} {bank} {inventoryType} {slot} {amount} - send by the person who puts items in the trade window
B. 1 {characterID} {gold} {bank} {0.inventorytype.ItemVNum.amout} - recived by the exchange partner, when the Item is NOT equipment
C. 1 {characterID} {gold} {bank} {0.inventorytype.ItemVNum.rare.upgrade} - recived by the exchange partner when the item IS equipment

Few examples

A. exc_list 0 0 2 0 1 - registering the Item from Inventorytype 2 and slot 0
B. exc_list 1 1 0 -1 0.2.2024.23 - registering 23 Cookies
C. exc_list 1 1 0 -1 0.0.349.7.10 - registering a Plexon R7+10

exc_list 1 1 -1 - Sent at the start of a trade, displays an empty tradewindow

Provide Inventory Interface

An inventory, as usual, should be able to :

  • Add ItemInstance
  • Remove ItemInstance
  • Update ItemInstance
  • Get ItemInstance By Item Id
  • Get ItemInstance By ItemInstance Id
  • Sort By SortingRule

Feature : ItemInstances

ItemInstances properties :

  • Id (Guid)
  • Amount
  • BoundCharacterId (nullable)
  • CharacterId
  • Design (raidboxes, wings...)
  • DurabilityPoints (Miniland games)
  • ItemValidity (time before item gets destroyed, like tarots, betting amulets...)
  • ItemDto
  • Rare
  • Upgrade
  • Slot (place in inventory)
  • InventoryType (Eq, principal, etc...)
  • Ammo (For crossbows bows remaining ammunition)
  • CloseDefence
  • Concentrate
  • CriticalDodge (Used with bcards probably)
  • CriticalLuckRate
  • CriticalRate
  • DamageMaximum
  • DamageMinimum
  • DarkResistance
  • LightResistance
  • WaterResistance
  • FireResistance
  • DefenceDodge
  • DistanceDefence
  • DistanceDefenceDodge
  • MagicDefence
  • ElementRates (fairies only ?)
  • HitRate
  • IsFixed
  • SpExperience
  • LevelExperience
  • JobLevelExperience
  • HeroLevelExperience
  • SpDefence
  • SpHp
  • SpElement
  • SpAttack
  • SpLevel
  • SpStoneUpgrade
  • AttackStoneUpgrade
  • DefenceStoneUpgrade
  • HpStoneUpgrade
  • ElementStoneUpgrade
  • WaterResistanceStoneUpgrade
  • FireResistanceStoneUpgrade
  • LightResistanceStoneUpgrade
  • DarkResistanceStoneUpgrade
  • HolderVnum
  • BazaarItemId
  • ShellRarity

Add Map Object & MapLayer

We should add Maps to ChickenAPI.

As far as I know

A map contains :

  • Npcs (static npcs)
  • Portals (static portals)

An instance of a map contains :

  • Npcs (npcs that are able to interact with the player through combat / movement...)
  • Monsters
  • Players
    • PlayerInShop
    • Player
  • Drops
  • Portals
  • Effects

PACKET : BiPacket - b_i

PacketName

b_i

Packet Usage

This packet is sent when you want to delte an item.

Packet Header

b_i

Packet Content

{InventoryType} {InventorySlot}

Few examples

b_i 2 3 - deleting an Item from Inventory Type 3 Slot 4
b_i 1 3 - deleting an Item from Inventory Type 2 Slot 4

PACKET : AddobjPacket - addobj

PacketName

addobj

Packet Usage

This packet is sent when you add an object to your miniland

Packet Header

addobj

Packet Content

{itemslot} {MapX} {MapY}

Few examples

addobj 1 22 8 - adds the smallest warehouse to the map position X:31 Y:3 -> default position cant change x:22 y:8 is the the position where you click on the miniland map
addobj 0 14 7 - adds the big warehouse to the map position x:31 Y:3 - see above
addobj 3 21 22 - adds Lv3 Minigame (Stone thingy, dont know english name) to the map position X:21 Y:22

Review Multilanguage Service

On my side, I'm using a Redis Database to store my keys depending on their RegionType

I don't know if it's the best way to handle :
Game Messages (server -> player)
Game Datas (player<>server)

PACKET : EffPacket - eff

PacketName

eff

Packet Usage

This packet is sent when character/objects(NPC)/monster display any kind of effect.

Packet Header

eff

Packet Content

{EffectType} {CharacterId} {EffectId}

Few examples

eff 1 1 6
eff 1 1 198 - Levelup effekt on character (198 is a white-star spark)

eff 1 1 6000 - eating a cookie -> eating Effect above character

eff 2 43 3002 - Object with the ID 43 is sparkling
eff 2 2 855 - LOD Door Effect (Door has the ID 2)

eff 3 66 4689 - LOD Skeleton with the ID 66 when casting a skill (Not the skill effect)
https://gyazo.com/2c5dd80054b699ea9398ca6499a03991

Feature : Visibility for entities

Is your feature request related to a problem? Please describe.
We should provide something that would permit to get an Entity visibility or to set it

Describe the solution you'd like
Based on what we know, we should approach two things :

VisibilitySystem
should be a notifiable system (as on Nostale, the visibility is based on events)

VisibilityComponent
should contain a boolean to set its own visibility

I'd suggest we also add some more options to that component for :

  • A filter that will permit to Entity to be visible or not based on that filter (Family, Super Powers...)

Additional context
All infos i've got so far :

in packet is triggered :
Entity enters the map
Entity spawns (monsters/npcs)
Entity has super powers that permit to set its own visibility (GM)

out packet is triggered when :
Entity exit the map
Entity is killed / despawn
Entity has super powers that permit him to become invisibile (GM)

Scenarions to investigate :
Invisibility on skill (as @friends111 said, it should cast a su packet)

PACKET : IvnPacket - ivn

PacketName

ivn

Packet Usage

This packet is sent AFTER moving items in your inventory. It is updating the visual part of the inventory.
The Packet for moving items is mvi #43

Packet Header

ivn

Packet Content

{InventoryType} {InventorySlot} {ItemVNum} {Rare} {Upgrade} {0}

Few examples

mvi 0 0 1 1
ivn 0 1.349.7.10.0- Move 1 Plexon 7+10 from Inv 1 slot 1 to 2
ivn 0 0.-1.0.0.0 - not replacing anything

mvi 0 0 1 1
ivn 0 1.349.7.10.0 - Move 1 Plexon 7+10 from Inv 1 slot 1 to 2
ivn 0 0.350.6.8.0 - replacing a Lv88 Sword 6+8

mvi 1 0 100 1
ivn 1 1.1039.100.0- Move 100 Tools for Swordsman from Inv 2 slot 1 to 2
ivn 1 0.-1.0.0.0 - not replacing anything

mvi 2 6 9 7
ivn 2 7.2024.9.0 - Move 9 Cookies from Inv 3 slot 7 to 8
ivn 2 6.2099.1.0 - Replacing 1 Red Fruit

Packet : RestPacket - rest

PacketName

RestPacket

Packet Usage

This packet is sent when your character rests (Pressing the C key while out of combat).
This packet is received when a character rests.

Packet Header

rest

Packet Content

Sent

rest {Unknown1} {Unknown2} {PlayerID}

Both unknown values are always set to 1.

Received

rest {Unknown1} {PlayerID} {Unknown2}

Unknown1 is always set to 1.
Unknown2 is always set to 0.

Few examples

Sent
rest 1 1 1017

Received
rest 1 1017 0

PACKET : GetPacket - get

PacketName

get

Packet Usage

This packet is sent when picking up a item.

Packet Header

get

Packet Content

{1} {CharacterID} {DropID} {0}

Few examples

get 1 1 100061 0 - picking up a item on the character with CharacterID1
get 1 2 100062 0 - picking up a stack of 10 items on the character with CharacterID2

PACKET : npc_reqPacket

PacketName

npc_req

Packet Usage

This packet is sent when we interact with NPC

Packet Header

npc_req

Packet Content

Sent to server:
npc_req {Unkown} {NPC_ID}
Unkown always is 2

Sent by server:
npc_req {Unkown} {NPC_ID} {TypeOfShop}
Unkown always is 2
TypeOfShop - it's displayed dialogue with the NPC

Few examples

Sent to server:
npc_req 2 9049
npc_req 2 2044

Sent by server:
npc_req 2 9049 514 - it's Lilith dialogue
npc_req 2 9048 513 - it's Sarakael dialogue
npc_req 2 2004 9714 - it's Graham dialogue in NosVille
npc_req 2 2056 462 - it's Salim dialogue in NosVille (Family Manager)

PACKET : WearPacket - wear

PacketName

wear

Packet Usage

This packet is sent when equipping items. Only sent when equipping directly from InventoryType 1.

Packet Header

wear

Packet Content

{InventorySlot} {WearType}

Few examples

wear 0 0 - Equiping Plexon from Inventory Slot 1 -> Visible
wear 0 1 - Equiping Plexon from Inventory Slot 1 -> Invisible (Not sure where the Item is, it does NOT affect the stats like this)
wear 8 0 - Equiping Plexon from Inventory Slot 9 -> Visible

Packet : GetPacket - get

PacketName

GetPacket

Packet Usage

This packet is sent when your character tries to pick up an item. (Request)
This packet is received when your character successfully picks up an item.

Packet Header

get

Packet Content

Sent

get {Unknown1} {PlayerID} {ItemID}

Unknown1 is always set to 1.

Received

get {Unknown1} {PlayerID} {ItemID} {Unknown2}

Unknown1 is always set to 1.
Unknown2 is always set to 2.

Few examples

Sent

get 1 1017 11175435
get 1 1017 11175430

Received

get 1 1017 11175435 0
get 1 1017 11175434 0
get 1 1017 11175424 0

cancel 1 11175430 Canceled request

Packet : PetSkiPacket - petski

PetSkiPacket

Packet Usage

This packet is sent when a

Packet Header

petski

Packet Content

{petSkill.Vnum}

Few examples

petski -1
petski 500
petski 815

PACKET : PairyPacket - pairy

PacketName

pairy

Packet Usage

This packet is sent when equipping or removing a fairy.

Packet Header

pairy

Packet Content

{1} {CharacterId} {FairyMoveType} {ElementType} {FairyLevel} {ItemMorph}

Few examples

pairy 1 1 4 3 30 0 - equip 30% normal lightelement Fairy
pairy 1 1 0 0 0 0 - remove fairy
pairy 1 1 4 1 50 40 - equip 50%+ Nosmall fireelement Fairy

Review : IEntity / IPlayerEntity / IContext / ISession

I think that an IEntity need to be instanciated in the game to be added in the server.

As long as a player has passed the character selection screen, ISession should not be used anymore and we should use IPlayerEntity instead to properly define that the ISession is instanciated into the game.

IContext should be related to IMapLayer or some sort of IEntity container, except that they all have, as their top parents, an IServer

ISession has too much unneeded data, some are required only during a little moment of the game session.

PACKET : ScPacket - sc

PacketName

sc

Packet Usage

This packet is sent when changing Character stats like equiping a sword/armor/resistance or transforming into a SP

Packet Header

sc

Packet Content

{Type} {MainWeaponUpgrade} {MinHit} {MaxHit} {HitRate} {CriticalHitRate} {CriticalHitMultiplier} {Type2} {SecondaryWeaponUpgrade} {SecondaryMinHit} {SecondaryMaxHit} {SecondaryHitRate} {SecondaryCriticalHitRate} {SecondaryCriticalHitMultiplier} {ArmorUpgrade} {Defence} {DefenceRate} {DistanceDefence} {DistanceDefenceRate} {MagicalDefence} {FireResistance} {WaterResistance} {LightResistance} {DarkResistance}

Few examples

sc 0 8 683 745 553 11 160 1 0 112 112 224 0 0 0 107 113 109 112 54 0 0 0 0 - equip ->Plexon 7+8

sc 0 8 683 745 553 11 160 1 0 112 112 224 0 0 8 434 497 400 497 296 0 0 0 0 - equip -> Cai 7+8 and Plexon 7+8
sc 0 8 683 745 553 11 160 1 0 112 112 224 0 0 8 439 498 409 497 296 4 13 0 0- equip -> 7+8 + Plexon 7+8 + Warrior SP 99+15 (no points allocated)

Bow Example divided:

  • Equip -> Lv85 Bow only
    Main: sc 1 8 756 874 431 10 160
    Secondary: 0 0 200 200 220 0 0 0
    Armor: 105 142 109 102 102
    Resist: 0 0 0 0

  • Equip -> Lv85 Bow and Lv 85 Dagger
    Main: sc 1 8 756 874 431 10 160
    Secondary: 0 8 632 658 657 15 330 0
    Armor: 105 142 109 102 102
    Resist: 0 0 0 0

PACKET : EqPacket - eq

PacketName

eq

Packet Usage

This packet is sent when changing the character appearance or entering a map.

Packet Header

eq

Packet Content

{CharacterId} {VisualType} {Gender} {HairStyle} {HairColor} {Class} {Hat}.{Armor}.{MainWeapon}.{SecondaryWeapon}.{Mask}.{Fairy}.{CostumeSuit}.{CostumeHat}.{WeaponSkin} {WeaponUpgrade} {WeaponRare} {ArmorUpgrade} {ArmorRare}

Few examples

eq 1 2 0 0 9 1 -1.-1.349.-1.-1.-1.-1.-1.-1 87 00 - Visible GM Male Swordsman with 7+8 Plexon and nothing more
eq 1 2 0 0 9 1 -1.409.349.-1.-1.4129.-1.-1.-1 87 87 - Visible GM Male Swordsman with 7+8 Plexon, Cai 7+8 and a Big Fire Fairy
eq 1 6 0 0 9 1 -1.409.349.-1.-1.4129.-1.-1.-1 - same as above, but invisible

PACKET: msgPacket - msg

PacketName

msgPacket

Packet Usage

This packet is sent, when you get message from server

Packet Header

msg

Packet Content

Received

msg {typeOfMessage} {message}

typeOfMessage:
0 - show when someone got married, raids etc.
1 - show in the bottom right corner
2 - show when GM send message
3 - show under the black bar
4 - {typeOfMessage0}
5 - nothing appears
6 - {typeOfMessage0} + {typeOfMessage1}
7 - {typeOfMessage0}
8 - {typeOfMessage0}
9 - {typeOfMessage1}
10 - {typeOfMessage0}
11+ - that same {typeOfMessage0}

Few examples

msg 0 Hello world!
msg 1 It's test message.
msg 2 Hey, I'm GM!

PACKET : PutPacket - put

PacketName

put

Packet Usage

This packet is sent when dropping an item from your inventory on the ground.

Packet Header

put

Packet Content

{InventoryType} {InventorySlot} {Amount}

Few examples

put 1 2 1 - dropping 1 Smallpotion InventoryType 2 Slot 2 on the ground
put 2 0 10 - dropping 10 cookies InventoryType 3 Slot 1 on the ground
put 0 0 1 - dropping 1 Plexon InventoryType 1 Slot 1 on the ground

Document ChickenAPI Plugins

Someone that would like to develop its plugin for ChickenAPI should be able to do it fastly.

In order to guide newcomers, we should write a simple documented page that explain how to write a basic plugin.

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.