Guide to Vo and back.

Forum for our dedicated Vore themed Minecraft server, more details [url=https://aryion.com/forum/viewtopic.php?t=43179]here[/url]

Moderator: Vorecraft

Guide to Vo and back.

Postby Potato » Tue Aug 16, 2016 7:25 pm

  • Contents:
    - The Alt system & BIO
    - The vo command
    - The kc command
    - Pet Bellies
This is where i try to explain all the features of the vo plugin, it is pretty massive, so please hang with me :?

First order of business: The Alt system:
Spoiler: show
So basicly the alt system stores different nicks and chatcolors and seperate stomaches for your alts. you must select a different alt, if you want to store a different bio etc..
Allright, now that you understand what the alt system does in a nutshell. you are ready to go on to the more advanced parts.

(if you have problems still, please ask questions and i'll update the guide.)
The bio command has the following options:
1)
/bio help

This displays the help menu, it can be hovered over to view explanations.
2)
/bio new altname coloredAltName chatcolor

This sets the current alt to altname, and the nick to coloredAltname, and enforces your chosen chatcolor in RP channels or private.
To OOC, you must either use pm, or global, or do something like &r(OOOOOOOOCCCCCC)&whateveryourcolorwas
Later on you can select the alt using
/bio select altname OR use the fancy menu available at /bio alts
3)
If you really regret making an alt, or still using the compatability alt called default, you should make a new alt first, then do
/bio del altname

4)
Next up is the /bio custom command
This command will give you a book, and ask you to not increase the page count or modify the first line.
this is very important, as it uses the lines on the top to check if the book is valid.
This book is used to "manufacture" your custom predtype, that is selectable with /vo pred custom, or /vo predprey /custom
, you can also set a stomach for the custom predtype with /vo setstomach
Just press enter on the top line to get started (or something idunno :P)

Write all your custom stuff in that book, and when you are satisfied and you have signed the book go on to the next step. (or skip this step)

5)
And so we have the ultimate question, how do i WRITE a bio?
Simple enough, craft yourself a book-and-quill, write a lot in it.
maybe use /bio example, as an example for some stuff?
Then, after a long time, sweat dawning on your face, you sign the book with the name you have choosen for that book (it is not important)

after that, you can simply skip on to the next step

6)
/bio save
This command IMPORTS books, if you have a custom predtype book already made in step 4, you can import the predtype by doing
/bio save while holding your custom predtype book, it will either say success or invalid book. Good luck with that! :D
if the criteria for a book DOES not match the predtype book, then it will try importing the book as a BIO,
if you have a bio in your mainhand, and want to import that, just type /bio save.
/bio save does not "eat" your book, so you can keep a copy for safekeeping.
7)
Allright, now that you both have a bio and a predtype (maybe i don't know :V)
you suddenly realise that you made a mistake in the bio! OH NO!
This situation is what we have /bio edit for, it will give you the BIO in unsigned form, so you can edit it and /bio save it later, to apply the fixed bio version.
this is TODO for custom predtypes, you'll have to retype it yourself atm.

Second up: The Vore Plugin:
Spoiler: show
Predtypes as is: Oral,Anal,Cock,Tail,Unbirth,Absorb,Breast,Navel,Soul,Pouch,Bladder
The vo command has the following options:
/vo pred predtypehere
^ This command is self explanatory, it sets your predatortype to a predtype

/vo prey playername
^ Same as above, except it sets you to prey mode, and if you typed a player behind, it restricts your preymode to only that player.

/vo predprey predtype
^ Become both pred and prey with this command, it will set your predatortype to predtype.

/vo setstomach food
^ Command to set your stomach, in the Art world only, on your own plot, if food is included, it will set the location where food spawns when you eat it. (you must have eaten prey)

/vo digest slow

^ If you type this command, then type slow behind, it will slowly digest the prey, instead of the normal "fast" mode

/vo dispose
^ this command makes you safely dispose of the prey

/vo eatme
^ This command toggles forcefeeding of predators, ala forcing yourself into the hungry maw of the predators.

/vo eatmobs
^ This command toggles eating of mobs, incase you don't want to eat mobs.

/vo mobeatme
^ Enable the mode that allows mobs to eat you (or pets)

/vo ride
^ Enable ride mode, ala rightclick a player to send a ride request (some people think this is lewd owo)

/vo changelog
^ Prints the changelog for this version.

/vo dislike predtype

^ dislikes a predtype

/vo msgt
^ toggles the chat system between actionbar and chat

/vo endo
^ toggles endo mode, makes you unable to digest in stomaches.

/vo astral
^ enables you to visit your stomach for a little while, to test settings or see prey.

/vo voreception

^ Toggles the ability for other predators you have eaten, to eat the preys you've eaten

/vo list playername

^ View a list of preds/switches/prey online currently if a playername is included, it will list which stomaches that player has set.

/vo stop
^ The plugins safeword, to exit any kind of event the plugin has going

/vo ghost manual
^ Toggle ghostmode, if you dislike having to specate your predator after being eaten, if manual is included, you have to spawn back manually using /vo stop (assuming ghostmode is enabled)

/vo copy
^ Get a copy of your preds disposal, for reasons unknown

/vo gc

^ check predator arena game time.

/vo debug
^ Print a lot of debug data on your user, used to diagnose horribleness

/vo key
^ FUTURE USE

/vo repopulate
^ We don't talk about this one, it does nothing.

/vo setmsg
^ FUTURE USE

Almost finished: Third up, KC plugin, or rather, what's left of it:
Spoiler: show
This is a chat plugin, or was before i decided to just emulate the whole thing

It has the following features:
- begin your sentence with a prefix to chat to that channel
- opt out of voremessages
- use parties to chat to groups
- opt out of rp chat / global chat
- and more!

Onto the commands:
/kc ?
^ View help menu

/kc p <name>
^ join a party by its name

/kc p list
^ List who's in your party, this should list on join anyways

/kc leaveparty
^ Leave your current party

/kc leaverp
^ Leaves the rp channel

/kc leaveglobal
^ leave global for intimate rp owo

/kc death dislikes/no_vore
^ Select notification mode, this was originally designed with more options, so it is left as is.
dislikes, will stop you from seeing events generated by disliked predtypes, while no_vore will just stop vore death messages alltogheter

/kc invite playername
^ invites a player to your party

/kc !
^ Change default channel to global, you can also send a message with the prefix ! to send to global while in another channel

Other prefixes include: % for local,@ for stomach chat, $ for party chat, rp for rp chat, #W for world chat.

Fourth up, Pets:
Spoiler: show
Allright, this one is super simple.

Take a nametag, rightclick something you want as a pet, (the AI will NOT turn off, i recommend doing this on non hostile mobs)
it will lock onto your pet, so you can go rightclick somewhere else with the same or a different nametag to set the pets belly.
That's it!, your pet now has a belly, got build a house inside or something :P
User avatar
Potato
Vorecraft Mod
 
Posts: 74
Joined: Fri Aug 07, 2015 1:45 pm

Re: Guide to Vo and back.

Postby Potato » Tue Aug 16, 2016 7:26 pm

Now the new action system for vo:
Spoiler: show

so basicly how this thing works:
Each "Scene" is a list of actions or triggers that should be executed for a particular location /stomach /whatever
In the future each location can have multiple scenes (WIP)
all the menus are click based. edit stuff when it tells you in the command window, don't immediatly press enter.
Some actions require you to EDIT the action to add blocks / text etc.
For example triggers would need 2 blocks set, think worldedit region.

Make scene
-> scene contains actions
-> make action
-> set type of action
-> modify action

Now that you have the overview, we will go in dept on the different objects.
- /vo scene
--> displays menu of things, you can EDIT, DELETE or CREATE
-----> CREATE results in textbox being replaced with /vo scene sceneNameEditMe CREATE (replace sceneNameEditMe with whatever scene name you want)
----> vo will now display the actions menu, you can here do the same as clicking the EDIT button would do.

-->/vo actionmenu
--> here is the list of actions or triggers for your scene
> clicking create gives you a list of action/triggers for your scene.
-> click the one you want:
delay, // Delay for x seconds
setBlock, // Restricted to "redstone_block" to begin
sendTitle, // String title, String subtitle display title to user
sendMessage, // String message
teleport, // teleport player to block 1
playNote, // Plays sound directly at player or blockselection
playMusic, // Plays sound directly at player
resourcepack, // Force resource pack to be used while in this scene, must be hosted at whitelisted domain
delayUntillMovement, // Delays next action untill player moves
onEnterTrigger, // Player enters area, blockselection x2
onClickBlock, // Player clicks a block
delayUntillFishing, // Wait untill player starts fishing
addForceToPlayer, // Add velocity in xyz if player has less velocity than 20
forceClickBlock, // Force the player to click a spesifc block
-
> /vo actionchange (when clicking modify on an action)
-> set time here gives you /vo actionchange TIME actionNumber 0-32766
-> edit line before submitting to a number between the above, so the command looks like /vo actionchange TIME actionNumber 2
-> set title/message/soundtype gives you a line, edit the editme portion.
--> soundtype is from this list: https://hub.spigotmc.org/javadocs/spigo ... nt.summary

from /vo scene you can also assign or unassign from your current predtype.

here is a picture describing the basic idea: Image
when stickman passes red line, it plays sound, that can be one scene
red line and sound are seperate actions

Basic overview:

scenes be here -> edit or delete or create new
-> edit :
-> list of actions be here, modify or delete or create new
-> create new: list of actions that can be selected
-> modify calls modify action for selected action

-> scenes can be unassign/assigned to alt, or deleted or modified
for example you can do
door.scene :
- onEnterTrigger
-setblock
-loop
win.scene:
- onEnterTrigger
- sendMessage Pred
- playSound NOTEBLOCK_NOTE_SNARE


And then the Forge networking support, complete classes below:

SPIGOT SIDE::
Spoiler: show
Code: Select all
package plugins;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.messaging.PluginMessageListener;

import Vore.Vore;
import Vore.VoreDB;

public class ForgeListener implements PluginMessageListener {

   public final static String channele = "vorecraft:data";

   static enum PacketDiscriminators {
      REGISTER, STOMACH_UPDATE, STOP, EATEN, SHRINK
   }

   @Override
   public void onPluginMessageReceived(String channel, Player player, byte[] payload) {
      if (!channel.equalsIgnoreCase(channele))
         return;
      if (payload.length == 0)
         return;
      VoreDB db = Vore.PlayerDB.get(player.getUniqueId());
      PacketDiscriminators disc = PacketDiscriminators.values()[payload[0]];
      if (db == null && disc != PacketDiscriminators.REGISTER) {
         // how?
         return;
      }
      if(db.isForgeMode()) {
         return;
      }
      db.setForgeMode(true);
      Vore plugin = Vore.getPlugin(Vore.class);
      player.sendPluginMessage(plugin, channele, StringToPayload(PacketDiscriminators.REGISTER, "Success"));
      for (Player playere : Bukkit.getOnlinePlayers()) {
         if (player.getWorld().getUID().equals(playere.getWorld().getUID())
               && player.getLocation().distanceSquared(playere.getLocation()) < 1000) {
            VoreDB dg = Vore.PlayerDB.get(playere.getUniqueId());
            if (dg != null) {
               if (dg.hasEaten.size() > 0) {
                  onStomachNumberUpdate(dg, player);
               }
            }
         }
      }
      return;
   }
   
   //called to update stomachs from internal stuff
   public static void updateStomach(VoreDB voreDB) {
      for (VoreDB db : Vore.PlayerDB.values()) {
         if (db.isForgeMode()) {
            Player target = Bukkit.getPlayer(db.getThisPlayer());
            if (target != null) {
               onStomachNumberUpdate(voreDB, target);
            }
         }
      }
   }

   /* predtype enum:
    * oral, anal, cock, tail, unbirth, absorb, breast, navel, soul, pouch, bladder,
    * unused, food, custom,
    */
   /* Mode enum:
    * none, prey, pred, predprey, freeprey, freepred, freepredprey
    */
   static // sends update when stomach contents changed with amount of players inside
   void onStomachNumberUpdate(VoreDB db, Player target) {
      final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

      byteArrayOutputStream.write(PacketDiscriminators.STOMACH_UPDATE.ordinal());
      byteArrayOutputStream.write(db.hasEaten.size());
      byteArrayOutputStream.write(db.getPredType().ordinal());
      byteArrayOutputStream.write(db.mode.ordinal());
      writeString(byteArrayOutputStream, db.getThisPlayer().toString()); //UUID in string format

      final byte[] p = byteArrayOutputStream.toByteArray();
      target.sendPluginMessage(Vore.getPlugin(Vore.class), channele, p);
   }


   public static// all vo stuff ends or ejected from belly /death etc
   void onStop(VoreDB db, Player target) {
      if (db.isForgeMode()) {
         final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

         byteArrayOutputStream.write(PacketDiscriminators.STOP.ordinal());
         final byte[] p = byteArrayOutputStream.toByteArray();
         target.sendPluginMessage(Vore.getPlugin(Vore.class), channele, p);
      }
   }

   /*
    * oral, anal, cock, tail, unbirth, absorb, breast, navel, soul, pouch, bladder,
    * unused, food, custom,
    */
   public static // sends update when eaten by pred, number is predtype
   void onEaten(VoreDB db, Player target, Vore.PredTypes type) {
      if (db.isForgeMode()) {
         final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

         byteArrayOutputStream.write(PacketDiscriminators.EATEN.ordinal());
         byteArrayOutputStream.write(type.ordinal());

         final byte[] p = byteArrayOutputStream.toByteArray();
         target.sendPluginMessage(Vore.getPlugin(Vore.class), channele, p);
      }
   }

   // -------------------------UTILITY METHODS BELOW THIS POINT!-------------------------------------------------
   public static byte[] StringToPayload(PacketDiscriminators version, String input) {
      ByteArrayOutputStream output = new ByteArrayOutputStream();

      output.write((byte) version.ordinal());
      if (!writeString(output, input)) {
         output.reset();
         return output.toByteArray();
      }

      return output.toByteArray();

   }

   public static boolean writeString(ByteArrayOutputStream output, String str) {
      byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
      int len = bytes.length;
      try {
         if (!writeVarInt(output, len, 2))
            return false;
         output.write(bytes);
      } catch (IOException e) {
         return false;
      }

      return true;
   }

   public static int varIntByteCount(int toCount) {
      return (toCount & 0xFFFFFF80) == 0 ? 1
            : ((toCount & 0xFFFFC000) == 0 ? 2
                  : ((toCount & 0xFFE00000) == 0 ? 3 : ((toCount & 0xF0000000) == 0 ? 4 : 5)));
   }

   public static boolean writeVarInt(ByteArrayOutputStream to, int toWrite, int maxSize) {
      if (varIntByteCount(toWrite) > maxSize)
         return false;
      while ((toWrite & -128) != 0) {
         to.write(toWrite & 127 | 128);
         toWrite >>>= 7;
      }

      to.write(toWrite);
      return true;
   }

}

ExampleMod.java
Spoiler: show
Code: Select all
package com.example.examplemod;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.example.examplemod.ForgeListener.PacketDiscriminators;

import net.minecraft.client.Minecraft;
import net.minecraftforge.client.event.ClientPlayerNetworkEvent.LoggedInEvent;
import net.minecraftforge.client.event.ClientPlayerNetworkEvent.LoggedOutEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.fml.network.NetworkRegistry;
import net.minecraftforge.fml.network.simple.SimpleChannel;

// The value here should match an entry in the META-INF/mods.toml file
@Mod("examplemod")
public class ExampleMod
{
    static final Logger LOGGER = LogManager.getLogger();
   
    private static final SimpleChannel HANDLER = NetworkRegistry.ChannelBuilder
            .named(ForgeListener.location)
            .clientAcceptedVersions(NetworkRegistry.ACCEPTVANILLA::equals)
            .serverAcceptedVersions(NetworkRegistry.ACCEPTVANILLA::equals)
            .networkProtocolVersion(() -> "1")
            .simpleChannel();
   
    public void preInit(FMLClientSetupEvent  event)
    {
       HANDLER.registerMessage(PacketDiscriminators.EATEN.ordinal(), ForgeListener.class, ForgeListener::encode, ForgeListener::onEatenbyPred, ForgeListener::handle);
       HANDLER.registerMessage(PacketDiscriminators.STOMACH_UPDATE.ordinal(), ForgeListener.class, ForgeListener::encode, ForgeListener::onStomachNumberUpdate, ForgeListener::handle);
       HANDLER.registerMessage(PacketDiscriminators.STOP.ordinal(), ForgeListener.class, ForgeListener::encode, ForgeListener::onStop, ForgeListener::handle);
       HANDLER.registerMessage(PacketDiscriminators.REGISTER.ordinal(), ForgeListener.class, ForgeListener::encode, ForgeListener::onRegisterWithServer, ForgeListener::handle);
       LOGGER.info("Channel registered as CLIENT Side with all enums");
    }
   
    @SubscribeEvent
    public void onPlayerLeftServer(LoggedOutEvent event) {
           ForgeListener.onRegisterWithServer(false);
         LOGGER.info("Player left!");
    }
   
    @SubscribeEvent
    public void onPlayerJoinedServer(LoggedInEvent event) {
         LOGGER.info("Player joined!");
         sendVersionInfo();
    }
   
    public static void sendVersionInfo() {
      Minecraft.getInstance().getConnection().sendPacket(ForgeListener.getVoreCraftClientRegisterPacket());
   }
   
    public ExampleMod() {
        // Register the setup method for modloading
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::preInit);
       
        // Register ourselves for server and other game events we are interested in
        MinecraftForge.EVENT_BUS.register(this);
       
        LOGGER.info("STARTUP! ");
    }
}

ForgeListener.java
Spoiler: show
Code: Select all
package com.example.examplemod;

import java.util.UUID;
import java.util.function.Supplier;

import io.netty.buffer.Unpooled;
import net.minecraft.network.PacketBuffer;
import net.minecraft.network.play.client.CCustomPayloadPacket;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.network.NetworkEvent;;

public class ForgeListener {

   public final static ResourceLocation location = new ResourceLocation("vorecraft","data");
   public static boolean isRegistered = false;
   
   public static enum PacketDiscriminators {
      REGISTER, STOMACH_UPDATE, STOP, EATEN
   }
   
   public static enum predtype  {
      oral, anal, cock, tail, unbirth, absorb, breast, navel, soul, pouch, bladder,
       unused, food, custom   
   };
   
   public static enum mode {
      none, prey, pred, predprey, freeprey, freepred, freepredprey
   }
   

   public static CCustomPayloadPacket getVoreCraftClientRegisterPacket()
   {
      PacketBuffer pb = new PacketBuffer(Unpooled.buffer());
      pb.writeByte(PacketDiscriminators.REGISTER.ordinal());
        return  (new CCustomPayloadPacket(location, pb));
   }

   
    public static boolean handle(ForgeListener msg, Supplier<NetworkEvent.Context> context) {
       return true;
    }
   
     //unused
   public static void encode(ForgeListener msg, PacketBuffer buf) {}
   
   static ForgeListener onRegisterWithServer(PacketBuffer buf) {
      onRegisterWithServer(true);
      return null;
   }
   
   static void onRegisterWithServer(boolean state) {
      isRegistered = state;
      ExampleMod.LOGGER.info("Connection state changed to "+state);
   }

   static ForgeListener onEatenbyPred(PacketBuffer buf) {
      predtype[] predtypevalues = predtype.values();
      predtype predtype = predtypevalues[buf.readByte()];
      
      ExampleMod.LOGGER.info("Was eaten by pred with the type : "+predtype.name());
      return null;
   }

   static ForgeListener onStomachNumberUpdate(PacketBuffer br) {
      predtype[] predtypevalues = predtype.values();
      mode[] modevalues = mode.values();
      
      byte bellySize = br.readByte();
      predtype predtype = predtypevalues[br.readByte()];
      mode mode = modevalues[br.readByte()];
      UUID thisplayer = UUID.fromString(br.readString());
      
      ExampleMod.LOGGER.info("A belly changed size : "+bellySize+" and they were in "+mode.name()+" with type "+predtype.name()+" their uuid was "+thisplayer.toString());
      return null;
      
   }

    static ForgeListener onStop(PacketBuffer br) {
       ExampleMod.LOGGER.info("Recieved onstop");
      return null;
   }

}
User avatar
Potato
Vorecraft Mod
 
Posts: 74
Joined: Fri Aug 07, 2015 1:45 pm


Return to Vorecraft

Who is online

Users browsing this forum: No registered users