Coder Social home page Coder Social logo

aresrpg's Introduction

AresRPG

fully in javascript powered by lsd Contributions welcome License Chat

AresRPG is a non-modded MMORPG Minecraft Server for minecraft 1.16

A bit of history

AresRPG first came up to the world in 2013 under the name EclozionMMORPG from the idea of @StoneBloodTV and @Sceat, later on the team splitted due to an internal lack of organization and AresRPG as you know it flew on its own.

Fully written in Java by @DarkPingoo and @Sceat, the project released a test version called the tutorial, quite successful and enjoyed by the community it kept going, the team grew bigger with @DeltaEvo, @unixfox and many more that you can still find in the community these days.

The v1

The gameplay was quite simple, find mobs and kill them, buy the stuff rince and repeat.

4 classes were available:

  • Barbarian
  • Archer
  • Vampire
  • Mage

There was duels, exchanges, spells, skill points, teleportation stone, boss fights team loot, etc..

The world was working though a floor system, when you complete a floor you go to the next one. This version made AresRPG quite famous

The v2

The V2 is (and will stay) an unreleased version of AresRPG, the goal of this version was to have a procedural open-world instead of a floor system and more classes than the v1, with an overall gameplay upgrade.

Requirements

  • NodeJS >= 19
  • npm

Install

$ git clone https://github.com/aresrpg/aresrpg
$ cd aresrpg
$ git submodule update --init
$ npm install

If you have access to AresRPG's proprietary data, you can run

git -C data remote add -f private [email protected]:aresrpg/data-closed.git
git -C data checkout private/master

For mac M1 users you may have problems while installing node-canvas

arch -arm64 brew install pkg-config cairo pango libpng jpeg giflib librsvg

Usage

$ npm start

# Start with packet logging
$ DEBUG="minecraft-protocol*" npm start

# Start with debug server
$ DEBUG_SERVER="true" npm start

Enable data persistence

Aresrpg is using redis with the rejson module to persist player's state

$ docker-compose up
$ USE_PERSISTENT_STORAGE="true" npm start

Test

npm test

The reporter doesn't support errors yet so to have a detailed version of you stacktrace just run node --test

Contributing

AresRPG is an open-source project, which means that anyone is welcome to participate in the design of the server and in particular its code.

AresRPG is written entirely in JavaScript, and you will need a significant level of experience to really help the server. Although we welcome all contributions, it is important to know that the senior developers of the project will invest time in reviewing your code, make sure to come up with clean, readable, and functional code before submitting a Pull Request.

The commit history should also be clean in an understandable way. Issues, code, documentations and any type of text should be written in English only

where to start

Start by forking the repo and run it locally, then try to modify or implement simple little things to learn about the state system and how to observe packets/actions.

Once you feel ready, go to the issues and open your first PR.

License

MIT

aresrpg's People

Contributors

arkobalt avatar deltaevo avatar dependabot-preview[bot] avatar dependabot[bot] avatar gretorm avatar imgbotapp avatar loucass003 avatar mathis-paul-62 avatar sauronox avatar sceat avatar sohkey avatar thewolfofdawn avatar tomf0x avatar toufoumaster avatar vahelnir avatar zekirax 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  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  avatar

aresrpg's Issues

Player Health

Add health points to player
Add fall damage (distance from last position with onGround)

Cancel Player Interactions with the World

We should cancel block breaking by either setting the player in adventure mode or by setting a packet to cancel the action

Currently the player is set to adventure mode but it still can interact with buttons or trapdors

Implement a Spell

Depends on #15 #13

  • When the player right click on something launch the spell => a particle effect
  • Damage the mob that the spell will hit

NPC Dialog

Implement message when you interact on the npc

Old Java Code
/* 752 */         if (npcName.equals("§aCitoyen de Thebes")) {
/* 753 */           Random random1 = new Random();
/* 754 */           int i = random1.nextInt(6);
/* 755 */           switch (i) {
/*     */             case 1:
/* 757 */               p.sendMessage("§a Citoyen §7: §fC'est incroyable ce beau temps !");
/*     */               break;
/*     */             case 2:
/* 760 */               p.sendMessage("§a Citoyen §7: §fC'est toi " + p.getName() + " ? je pensais que tu étais plus grand !");
/*     */               break;
/*     */             case 3:
/* 763 */               p.sendMessage("§a Citoyen §7: §fFais attention à ne pas t'aventurer dans les catacombes, c'est dangereux !");
/*     */               break;
/*     */             case 4:
/* 766 */               p.sendMessage("§a Citoyen §7: §fJe n'ai pas le temps de te parler, va t'en ou j'apelle la garde !");
/*     */               break;
/*     */             case 5:
/* 769 */               p.sendMessage("§a Citoyen §7: §fEncore toi ?");
/*     */               break;
/*     */             case 6:
/* 772 */               p.sendMessage("§a Citoyen §7: §fUn jour les dragons reviendront et ce sera la fin de notre monde !");
/*     */               break;
/*     */             default:
/* 775 */               p.sendMessage("§a Citoyen §7: §fLaisse moi !");
/*     */               break;
/*     */           } 
/*     */         } 
/* 779 */         if (npcName.equals("§aMoine")) {
/* 780 */           Random random1 = new Random();
/* 781 */           int i = random1.nextInt(10);
/* 782 */           switch (i) {
/*     */             case 1:
/* 784 */               p.sendMessage("§a Moine §7: §fA Bien le bonjour étranger !");
/*     */               break;
/*     */             case 2:
/* 787 */               p.sendMessage("§a Moine §7: §fLe père Niflard n'est pas rentré de sa ceuillette de choux..");
/*     */               break;
/*     */             case 3:
/* 790 */               p.sendMessage("§a Moine §7: §fAmen");
/*     */               break;
/*     */             case 4:
/* 793 */               p.sendMessage("§a Moine §7: §fA quelques lieues d'içi se trouve un gouffre terrible remplit d'Arakne.");
/*     */               break;
/*     */             case 5:
/* 796 */               p.sendMessage("§a Moine §7: §fJe doit aller à la messe !");
/*     */               break;
/*     */             case 6:
/* 799 */               p.sendMessage("§a Moine §7: §fUn jour les dragons reviendront et ce sera la fin de notre monde !");
/*     */               break;
/*     */             case 7:
/* 802 */               p.sendMessage("§a Moine §7: §fDiantre ! que tu est vilain..");
/*     */               break;
/*     */             case 8:
/* 805 */               p.sendMessage("§a Moine §7: §fOh !");
/*     */               break;
/*     */             case 9:
/* 808 */               p.sendMessage("§a Moine §7: §fUne bonne cervoise et c'est repartit !");
/*     */               break;
/*     */             default:
/* 811 */               p.sendMessage("§a Moine §7: §fHum ?");
/*     */               break;
/*     */           } 
/*     */         } 
/* 815 */         if (npcName.equals("§aCitoyen de Ségeste")) {
/* 816 */           Random random1 = new Random();
/* 817 */           int i = random1.nextInt(10);
/* 818 */           switch (i) {
/*     */             case 1:
/* 820 */               p.sendMessage("§a Citoyen §7: §fA Ségeste nous aimons la pêche et les belles villageoises !");
/*     */               break;
/*     */             case 2:
/* 823 */               p.sendMessage("§a Citoyen §7: §fTeh c'est le petit " + p.getName() + " ! on m'avait dit que tu étais moche mais je ne pensais pas à ce point !");
/*     */               break;
/*     */             case 3:
/* 826 */               p.sendMessage("§a Citoyen §7: §fOn raconte que le puit de Ségeste est ensorcelé.. sans doute une vielle légende");
/*     */               break;
/*     */             case 4:
/* 829 */               p.sendMessage("§a Citoyen §7: §fNe m'adresse pas la parole petit ! nous n'avons pas les mêmes valeurs.");
/*     */               break;
/*     */             case 5:
/* 832 */               p.sendMessage("§a Citoyen §7: §fEncore toi ?");
/*     */               break;
/*     */             case 6:
/* 835 */               p.sendMessage("§a Citoyen §7: §fUn jour les dragons reviendront et ce sera la fin de notre monde !");
/*     */               break;
/*     */             case 7:
/* 838 */               p.sendMessage("§a Citoyen §7: §fAAAAAAAAAAAAAAH !!!! Oups pardon je t'avais prit pour un infécté..");
/*     */               break;
/*     */             case 8:
/* 841 */               p.sendMessage("§a Citoyen §7: §fCe maudit Craken a encore provoqué une inondation...");
/*     */               break;
/*     */             case 9:
/* 844 */               p.sendMessage("§a Citoyen §7: §fUne bonne bière et c'est repartit !");
/*     */               break;
/*     */             default:
/* 847 */               p.sendMessage("§a Citoyen §7: §fLaisse moi !");
/*     */               break;
/*     */           } 
/*     */         } 
/* 851 */         if (npcName.equals("§aCitoyen de Nùmen")) {
/* 852 */           Random random1 = new Random();
/* 853 */           int i = random1.nextInt(6);
/* 854 */           switch (i) {
/*     */             case 1:
/* 856 */               p.sendMessage("§a Citoyen §7: §fO man dôr túliel le ?");
/*     */               return;
/*     */             case 2:
/* 859 */               p.sendMessage("§a Citoyen §7: §fMan anírach cerin an le ?");
/*     */               return;
/*     */             case 3:
/* 862 */               p.sendMessage("§a Citoyen §7: §fGwanno ereb nin !");
/*     */               return;
/*     */             case 4:
/* 865 */               p.sendMessage("§a Citoyen §7: §fNo dhínen !");
/*     */               return;
/*     */             case 5:
/* 868 */               p.sendMessage("§a Citoyen §7: §fGarich i dhôl goll o Orch");
/*     */               return;
/*     */             case 6:
/* 871 */               p.sendMessage("§a Citoyen §7: §fNai Aragog meditha le!");
/*     */               return;
/*     */           } 
/* 874 */           p.sendMessage("§a Citoyen §7: §fHeca, firimar !");
/*     */         }

Implement the SpellBook

Depends on #16 #14

  • Add the SpellBook Item that have a list of spells
  • When the player shift + scoll on the spellbook change the active spell
  • When the player click on the spellbook launch a spell

Send a Barrier to turn screen red to indicate low life

Old code

/*    */   public static void setLowHealthWarn(Player p, boolean warning) {
/* 52 */     int dist = 1000;
/* 53 */     if (warning) {
/* 54 */       p.playSound(p.getLocation(), "heart", 1.0F, 1.0F);
/* 55 */       PacketContainer border = AresGame.protocolManager.createPacket(PacketType.Play.Server.WORLD_BORDER);
/* 56 */       border.getWorldBorderActions().write(0, EnumWrappers.WorldBorderAction.INITIALIZE);
/* 57 */       border.getIntegers().write(0, Integer.valueOf(29999984)).write(1, Integer.valueOf(1)).write(2, Integer.valueOf(dist));
/* 58 */       border.getLongs().write(0, Long.valueOf(0L));
/* 59 */       border.getDoubles().write(0, Double.valueOf(p.getLocation().getX())).write(1, Double.valueOf(p.getLocation().getZ())).write(2, Double.valueOf(1000.0D)).write(3, Double.valueOf(1000.0D));
/*    */       try {
/* 61 */         AresGame.protocolManager.sendServerPacket(p, border);
/* 62 */       } catch (InvocationTargetException e) {
/* 63 */         throw new RuntimeException("Cannot send packet " + border, e);
/*    */       } 
/*    */     } else {
/* 66 */       PacketContainer border = AresGame.protocolManager.createPacket(PacketType.Play.Server.WORLD_BORDER);
/* 67 */       border.getWorldBorderActions().write(0, EnumWrappers.WorldBorderAction.INITIALIZE);
/* 68 */       border.getIntegers().write(0, Integer.valueOf(29999984)).write(1, Integer.valueOf(1)).write(2, Integer.valueOf(dist));
/* 69 */       border.getLongs().write(0, Long.valueOf(0L));
/* 70 */       border.getDoubles().write(0, Double.valueOf(p.getLocation().getX())).write(1, Double.valueOf(p.getLocation().getZ())).write(2, Double.valueOf(10000.0D)).write(3, Double.valueOf(10000.0D));
/*    */       try {
/* 72 */         AresGame.protocolManager.sendServerPacket(p, border);
/* 73 */       } catch (InvocationTargetException e) {
/* 74 */         throw new RuntimeException("Cannot send packet " + border, e);
/*    */       } 
/*    */     } 
/*    */   }

/*    */   public void updateLowHealth(Player p, int health) {
/* 36 */     if (health > p.getMaxHealth() * 0.15D) {
/* 37 */       UtilPlayer.setLowHealthWarn(p, false);
/*    */       
/*    */       return;
/*    */     } 
/* 41 */     UtilPlayer.setLowHealthWarn(p, true);
/*    */   }

Send Mobs to the player

  • Create a configuration file to place mobs inside the map
  • Implement a Basic Mob like the Poule, only add a custom name for now, with a level, like §fPoule§4 [Lvl 1]
  • Send the mobs to the player when he enter a chunk

Send Items to Player

  • Take the old Shopkeepers config file aresv1.yml convert it to json with only the items
  • Write some functions to convert a AresRPG item to a Notch item
  • Send one item to the player at spawn

Experience when you kill a mob

Depends on #13

https://docs.google.com/document/d/1wXd8ZTcBAEc25vP8Tx5JtV37An6Hwuk43tCahPABnEc/edit?usp=sharing

Old code

/*     */   public static void calcAndAddPlayerExp(Player p, int exp, int mobLvl) {
/*  90 */     byte maxLVL = 100;
/*  91 */     if (GroupeManager.hasGroupe(p)) {
/*  92 */       ArrayList lvl = GroupeManager.getGroupeMembers(p);
/*  93 */       ArrayList<Player> message = new ArrayList();
/*  94 */       Iterator<String> var7 = lvl.iterator();
/*     */       
/*  96 */       while (var7.hasNext()) {
/*  97 */         String loc = var7.next();
/*  98 */         Player lvl1 = Bukkit.getPlayerExact(loc);
/*  99 */         if (lvl1 != null && lvl1.isOnline() && lvl1.getLocation().distance(p.getLocation()) <= 50.0D) {
/* 100 */           message.add(lvl1);
/*     */         }
/*     */       } 
/*     */       
/* 104 */       if (message.size() != 0) {
/* 105 */         if (message.size() > 1) {
/* 106 */           exp = (int)Math.round(exp * 1.25D);
/*     */         }
/*     */         
/* 109 */         exp = (int)Math.round(exp / message.size());
/* 110 */         if (exp <= 0) {
/* 111 */           exp = 1;
/*     */         }
/*     */         
/* 114 */         var7 = (Iterator)message.iterator();
/*     */         
/* 116 */         while (var7.hasNext()) {
/* 117 */           Player loc3 = (Player)var7.next();
/* 118 */           if (!loc3.isDead()) {
/* 119 */             int lvl3 = loc3.getLevel();
/* 120 */             int expp = getExpForLevel(lvl3, mobLvl, exp);
/* 121 */             if (StatsStorage.getPlayerAme(loc3) <= 40) {
/* 122 */               expp = (int)(expp * 0.5D);
/*     */             }
/*     */             
/* 125 */             if (expp != 0) {
/* 126 */               if (lvl3 < maxLVL) {
/* 127 */                 ExpStorage.addPlayerExp(loc3, expp);
/*     */               }
/*     */               
/* 130 */               MessageHolo message1 = new MessageHolo(new String[] { ChatColor.DARK_GREEN + "+" + expp + "°" });
/* 131 */               Location loc1 = loc3.getLocation().getBlock().getRelative(PlayerDirection.getDirection(loc3)).getLocation().add(0.8D, 0.0D, 0.8D);
/* 132 */               message1.show(loc1, 35L);
/*     */             } 
/*     */           } 
/*     */         } 
/*     */         
/*     */         return;
/*     */       } 
/*     */     } 

Study custom biomes and dimensions for aresrpg

1.16 introduced custom dimensions and 1.16.2 custom biomes (thanks @Vahelnir)

Maybe we could use this for AresRPG

On the protocol it's implemented as a nbt dimensionCodec https://github.com/aresrpg/aresrpg/blob/master/src/world/codec.js and sent in the login packet https://github.com/aresrpg/aresrpg/blob/master/src/login.js#L23

Some initial links:
https://www.minecraft.net/en-us/article/minecraft-java-edition-1-16-2
https://www.planetminecraft.com/data-pack/custom-biome-datapack-20w28a-higher/

Custom achievements

The minecraft protocol seems to allow to create custom achievements

  • Try to create a custom achievement tree
  • Make utility functions to do it

Reducer / Observer structure refactoring

While implementing #103 i came across some ambiguous limitations, the design is going to evolve as follow:

player state -> can be reduced -> can be observed -> can impact other parties
mob state -> can be reduced -> can be observed -> can impact other parties

would need the same for traders and world (world events that act on other parties)

It is basically the same thing as we currently have but way more structured and easy to understand

Damage indicators

Need #13

When a mob takes damages spawn a invisible armor stand with a custom name showing the number of damage

/*    */   private void showDamageIndicator(LivingEntity entity, double damage, boolean crit) {
/* 24 */     String dmg = "§c-" + (int)damage;
/* 25 */     if (crit)
/* 26 */       dmg = "§4§l-" + (int)damage + " Crit"; 
/* 27 */     if (damage == 0.0D)
/* 28 */       dmg = "§fEchec"; 
/* 29 */     UtilDamage.sendDamageIndicator((Entity)entity, entity.getEyeLocation().add(0.0D, 0.6D, 0.0D), dmg, false, 20);
/*    */   }

Player Inventory

Depends #6

  • Send a whole inventory to the player
  • Update state when the player move items in it's inventory
  • Cancel item drop

Mob Damage

Depend on #9

  • Add data for mob life
  • When player hit the mob lower the life of the mob
  • Play effect for mob damage
  • Play sound for mob damage

I18N

Implement i18n using minecraft translation system

Soul system

Update (2023)

Reopened to handle the complete feature.

  • Each death remove 10%
  • When reaching 0 of soul the player should become a ghost and walk very slowly, he shouldn't be able to interact with anything
  • While being a ghost, the player should be invisible and have some sort of ghost model on top of him
  • The player can turn back to life and with 10 of soul by reaching a phoenix statue

Original issue

The soul on aresrpg is a way to penalize death.
image

  • Each death remove 10%
  • Below 50% the player has a 50% experience gains penality
  • At 0%, the player has a 90% experience penality and his stats are reduced by 40%
  • The sould can be regenerated by paying an NPC or by waiting enough time

Bank Chest

  • Open an double chest inventory when clicking on a ender chest
  • Add multiple pages

Data persistence

The implementation will have to load the player initial_state from the chosen DB, including a system to combine sources

ex:

  • load from mongo
  • load from blockchain

Implement Levels

  • Use the java implementation ExpStorage.java to reimplement the Level Algorithm from AresRPG
  • Create some functions to add xp to a player
  • Send the Level to the Player

Implement all the mobs

This is more a tracking issue than a real issue

Mobs

Implemented id Name
abrakleur1 §fAbrakleur§4 [Lvl 18]
abrakleurcentenaire §fAbrakleur Centenaire§4 [Lvl 26]
ankreatrophie §fAnkre Atrophié §4[Lvl 6]
ankreharpon §fAnkre Harpon §4[Lvl 11]
ankreprofondeurs §fAnkre des Profondeurs §4[Lvl 16]
ankrevenerable §fAnkre Vénérables §4[Lvl 19]
arakneaffamee §fArakne Affamée §4[Lvl 17]
arakneelfique §fArakne Elfique §4[Lvl 27]
arakneinnofensive §fArakne Innofensive §4[Lvl 2]
araknesombre §fArakne Sombre §4[Lvl 23]
archertenebres §fArcher des Ténèbres§4 [Lvl 28]
cannibale §fCannibale§4 [Lvl 17]
cerbere §fCerbère§4 [Lvl 35]
chaman §fChaman§4 [Lvl 15]
chefdeguerre §fChef de Guerre§4 [Lvl 23]
chevalhades §fKrizan§4 [Lvl 37]
claqueur1 §fClaqueur§4 [Lvl 6]
claqueur2 §fClaqueur§4 [Lvl 8]
claqueurdecompose §fClaqueur Décomposé§4 [Lvl 10]
claqueursombre §fClaqueur Sombre§4 [Lvl 18]
cranetourmente §fCrane Tourmenté§4 [Lvl 9]
demonaffame §fDémon Affamé§4 [Lvl 31]
devoreusecavernes §fDévoreuse des Cavernes §4[Lvl 15]
devoreusevelue §fDévoreuse Velue §4[Lvl 10]
draugr1 §fDraugr§4 [Lvl 5]
draugrantique §fDraugr Antique§4 [Lvl 14]
draugrarcher §fDraugr Archer§4 [Lvl 7]
draugrlancier §fDraugr Lancier§4 [Lvl 13]
draugrpossede §fDraugr Possédé§4 [Lvl 10]
espritinsolent §fEsprit Insolent§4 [Lvl 25]
espritneiges §fEsprit des Glaces§4 [Lvl 20]
gardienabysse §fGardien des Abysses§4 [Lvl 26]
guerrierloup1 §fGuerrier Loup§4 [Lvl 3]
guerrierloup2 §fGuerrier Loup§4 [Lvl 7]
infecte1 §fInfécté§4 [Lvl 1]
infecte2 §fInfécté§4 [Lvl 3]
infecte3 §fInfécté§4 [Lvl 4]
infecte4 §fInfécté§4 [Lvl 5]
jeuneloup §fJeune Loup§4 [Lvl 2]
jeunesauvageon §fJeune Sauvageon§4 [Lvl 1]
jeunevenimeuse §fJeune Venimeuse §4[Lvl 6]
loup1 §fLoup§4 [Lvl 4]
loupaffame §fLoup Affamé§4 [Lvl 6]
loupantique §fLoup Antique§4 [Lvl 33]
loupblanc §fLoup Blanc§4 [Lvl 15]
loupcavernes §fLoup des Cavernes§4 [Lvl 25]
loupenrage §fLoup Enragé§4 [Lvl 10]
louve §fLouve§4 [Lvl 18]
louveteau §fLouveteau§4 [Lvl 5]
marcheurblanc1 §fMarcheur Blanc§4 [Lvl 9]
marcheurblanc2 §fMarcheur Blanc§4 [Lvl 15]
mouton1 §fMouton de Thebes§4 [Lvl 2]
nephilainaurata §fNéphila Inaurata §4[Lvl 14]
nephiledoree §fNéphile Dorée §4[Lvl 12]
nephileimmature §fNéphile Immature §4[Lvl 10]
pig1 §fPorc de Talus§4 [Lvl 4]
porcbamboula §fPorc Bamboula§4 [Lvl 2]
porcsavanne §fPorc de Savanne§4 [Lvl 3]
poule1 §fPoule§4 [Lvl 1]
poulemalade §fPoule Malade§4 [Lvl 1]
pouletmoine §fPoulet Moîne§4 [Lvl 1]
rat1 §fRat§4 [Lvl 2]
rat2 §fRat Nordique§4 [Lvl 4]
sanglierplaines §fSanglier des Plaines§4 [Lvl 35]
sauvageon1 §fSauvageon§4 [Lvl 1]
sauvageonagressif §fSauvageon Agressif§4 [Lvl 3]
sauvageondechu §fSauvageon Déchu§4 [Lvl 5]
sauvageonfrondeur §fSauvageon Frondeur§4 [Lvl 2]
sauvageonnefeconde §fSauvageonne Féconde§4 [Lvl 13]
sauvageonne §fSauvageonne§4 [Lvl 8]
sauvageonparjure §fSauvageon Parjure§4 [Lvl 1]
soldattenebres §fSoldat des Ténèbres§4 [Lvl 28]
squelette1 §fSquelette§4 [Lvl 5]
squelettefragile §fSquelette Fragile§4 [Lvl 4]
squelettenordique §fSquelette Nordique§4 [Lvl 8]
tegenaireagressive §fTégénaire Agressive §4[Lvl 4]
tegenaireforet §fTégénaire de Foret §4[Lvl 5]
vache §fVache§4 [Lvl 3]
venimeusecrochet §fVenimeuse à Crochets §4[Lvl 8]

ArchiMobs

Implemented id Name
araknea §6Araknéa la Couveuse§4 [Lvl 27]
moutron §6Moutron l'Epique§4 [Lvl 4]
nofus §6Nofus le Chafer§4 [Lvl 15]
ramick §6Ramick Eymouse§4 [Lvl 2]
raton §6Raton L'immaculé§4 [Lvl 7]
severin §6Severin le boursouflé§4 [Lvl 7]
sparot §6Sparot le Pirate§4 [Lvl 10]

Boss

Implemented id Name Extra
aragog §cAragog L'Acromentule §4[Lvl 31]
Hades §cHades l'impitoyable§4 [Lvl 20-79] int levelHades = r.nextInt(60) + 20;
kraken §cKraken §4[Lvl 25]
nerak §cNérak l'Invoqué§4 [Lvl 18]
phacochere §cPhacochère§4 [Lvl 5]

Npc

Implemented id Name
citoyennumen §aCitoyen de Nùmen
citoyensegeste §aCitoyen de Ségeste
citoyenthebes §aCitoyen de Thebes
garde §9Garde §4[Lvl §2100§4]
moine §aMoine

Send Villagers to Player

  • Take the old Shopkeepers config file aresv1.yml convert it to json with only the positions
  • Send the villagers to the player when he enter a chunk

Implement all the Spells

This is more a tracking issue than a real issue

  • Mutilation 1
  • Lance Hache
  • Charge
  • Mutilation 2
  • Onde de choc
  • Fleches multiples
  • Fleche enflamee
  • Fleche explosive
  • Furtivite
  • Boule de feu
  • Soin basique
  • Vague a lame
  • Champ force
  • Let rock
  • Vole de vie
  • Pacte de sang
  • Malediction
  • Crops ethers
  • Back jump
id Lvl Name Lore Class
Mutilation I 3 §6§lMutilation I Augmente vos dégâts physiques de 20% pendant 15s! Guerrier
LanceHache 5 §6§lTomahawk I Lance une hache devant vous , qui inflige 26 dégats (+0.65 par force) a l'entité qui se la prend ! Guerrier
Charge 8 §6§Charge Charge l'entitée dans la ligne de vue, lui infligeant 25 dégats (+0.63 par force) et l'immobilise pendant 2s (+0,01 par agi, max 5s). On ne peut pas eviter la charge Guerrier
MutilationII 7 §6§lMutilation II Augmente vos dégâts de 30% pendant 15s! Guerrier
OndeDeChoc 10 §8§lOnde de choc Expulse les entités environnantes dans un rayon de 5 blocs, leur infligeant 20 degats (+0,5 par force) Guerrier
Fleches_Multiples 3 §6§lFlèches multiples Envoie un salve de 10 flèches sur l'ennemis, infligeant 15 degats (+0.5 par Agi, 200 max) divisés sur les dix flèches. Archer
Fleches_Enflamées Archer
Fleche_Teleport Archer
Fleche_Explosive Archer
Furtivite Archer
BouleDeFeu Mage
SoinBasique Mage
VagueALame Mage
ChampForce Mage
LetRock Mage
VolDeVie Vampire
PacteDeSang Vampire
Malediction Vampire
CropsEthers Vampire
BackJump Vampire

Extra

(In the old code but not used ?)

  • Torrent
  • NovaDeGlace
  • DragonBreath
  • NovaDeFeu
  • SpikeLine
  • SalveDeFleche
  • CristauxArcaniques
  • ForceField
  • FurieAsgard

Send ActionBar to the Player

/*    */ package aresGame.Utils;
/*    */ 
/*    */ import aresGame.AresGame;
/*    */ import fr.pingoo.player.Stats.StatsStorage;
/*    */ import me.clip.actionannouncer.ActionAPI;
/*    */ import org.bukkit.entity.Player;
/*    */ import org.bukkit.plugin.Plugin;
/*    */ 
/*    */ 
/*    */ public class UtilActionBar
/*    */ {
/*    */   public static void update(Player p, Double vie, Double maxVie) {
/* 13 */     String msg = "§8§l>> §a§lVie §7§l: " + vieColor(vie, maxVie) + "§7§l/§2§l" + maxVie.intValue() + "  §8§l|  §9§lZone §7§l: §c§oNon disponible §8§l<<";
/* 14 */     if (p == null)
/*    */       return; 
/* 16 */     int po = StatsStorage.getPlayerPointsDispoAtLevel(p, p.getLevel());
/* 17 */     if (po > 0) {
/* 18 */       msg = "§8§l>> §a§lVie §7§l: " + vieColor(vie, maxVie) + "§7§l/§2§l" + maxVie.intValue() + "  §8§l|  §9§lZone §7§l: §c§oNon disponible  §8§l| §6§l+" + po + " pts de Stats §8§l<<";
/* 19 */       ActionAPI.sendTimedPlayerAnnouncement((Plugin)AresGame.plugin, p, msg, 216000);
/*    */     } else {
/*    */       
/* 22 */       ActionAPI.sendTimedPlayerAnnouncement((Plugin)AresGame.plugin, p, msg, 216000);
/*    */     } 
/*    */   }
/*    */ 
/*    */   
/*    */   public static String vieColor(Double vie, Double maxvie) {
/* 28 */     String s = "";
/*    */     
/* 30 */     if (vie.doubleValue() <= maxvie.doubleValue() * 0.3D) {
/* 31 */       s = "§c§l" + vie.intValue();
/* 32 */     } else if (vie.doubleValue() <= maxvie.doubleValue() * 0.6D) {
/* 33 */       s = "§e§l" + vie.intValue();
/*    */     } else {
/* 35 */       s = "§2§l" + vie.intValue();
/* 36 */     }  return s;
/*    */   }
/*    */ }

Implement Teleportation Stones

  • Take the old HolographicDisplay config file database.yml convert it to json
  • Send something to the player to materialize the teleportation stone (can be a invisible entity with a custom name like before or something new)
  • Teleport the player when he interact with the Teleportation Stone

There should be 2 branchs instead of 16

Branch management is messy right now

  • As long as we don't use extensive testing on pull requests through github actions, contributors should work on their own fork only
  • Dependabot is imo useless except to spam irrelevant issues and PRs

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.