Git Product home page Git Product logo

zenutils's Introduction

ZenUtils

A powerful CraftTweaker (for Minecraft 1.12) addon. The most important feature is the (partial) script reloading. Check wiki to view all features.

zenutils's People

Contributors

andre-byrne avatar friendlyhj avatar gblodb avatar ikexing-cn avatar risinginiris2017 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

zenutils's Issues

Can you add a player analog handheld item? 【能不能给加个模拟手持物品?】

I saw a lot of statements that simulated the player in the "Player Interaction Simulation", but there was no statement that simulated the player holding an item, so please strengthen the "ZenUtilsPlayer", thank you
在Player Interaction Simulation里面看到了很多模拟玩家的语句,但是没有模拟玩家手持物品的语句,求加强ZenUtilsPlayer

[Question] `EntityRemoveEvent` how to stop hopper?

I have custom crafting mechanic of turning Seared Stone into ore by dropping items in it.

Source code of mechanic. Im using EntityRemoveEvent to determine, when item get burned in lava-like Seared Stone so i could transform it (with 30% chance).

The problem happens when there is Hopper under Seared Stone block.
To reproduce:

  1. Place hopper under lava
  2. Drop item inside lava block (im using vanilla Dropper)
  3. EntityRemoveEvent fired
  4. I can't stop hopper to consume that item programmatically

image

I tried to remove entity from world or set it size to 0, but nothing helps and after event, item still consumed

  entityItem.item.mutable().withAmount(0);
  world.removeEntity(e.entity);

I know there is note that event cant be cancelled. But its there other way to check what consuming item? Like, separate event from "Item destroyed by lava" and "Item pulled by hopper" ?

[Feature Request] Expose `Statistics`

Please add access to player's Statistics.

This tab have many useful information about player.

I intend to use it for Advancements / Quest progression and player ranks.
For example, notify players that reached progression stage to whole server

+ Player Krutoy242 finished [Industrial Craft] after 120 hours of  play! +

Conflict with FTB Utilities

After updating from 1.16.9 to 1.17.0 some change caused FTB Utilities healing button at the top left of the screen when opening the inventory to stop restoring players properly. It still heals them, but it wont replenish the hunger anymore. And now it also starts printing: /heal < player>, in the in-game chat.

One log:
https://gist.github.com/Sereath/1159346b463429b7d7e1eafc7abadb31

Expected from FTB Utilities healing button:
Heal
Restore hunger

With 1.17.0:
Heal
No hunger restoration
Now prints ingame /heal < player>

[Feature Request] Check if block is in loaded chunk

Using CraftTweaker and ZenUtils I made Portal Spread mechanic.

When portal is spawned, it saved with setCustomWorldData(). Then I iterate all portals in onWorldTick event.

javaw_YkYWCxOVPS.mp4

The problem is that CraftTweaker's functions always load chunks for calls like world.getBlockState(). So, each time i want to tick the portal, it would call getBlockState and actually work as chunk loader.

Please, add function to check if block is in loaded chunk.

With such function I could check if portal is in loaded chunk and tick it only if loaded.

Error in log when using StaticString.format

[INITIALIZATION][CLIENT][ERROR] crafttweaker\tooltips\coin_tooltips.zs:16 > a method available but none matches the parameters (string, int)
This is usually an error in your script, not in the mod
format(string, ZenTypeNative: java.lang.Object[])

It seems that ZenScript has no idea how to convert an int to an object.

[Feature/Tool] Expanded ITeam (whos idea was it to not have a method for fetching it other than an existing entity; I SWEAR)

as the title insinuates; ITeam is a very niche thing used and even when I tried to use it I found it frustrating because of one thing; there is no method to call an ITeam object in the script. To elaborate; imagine this: imagine you have to make a script involving a team setup system and you cant use commandManager to use commands but the world will already have a team space in its scoreboard for them to be put in. The question is how? there is a setter .setTeam() that requires an ITeam object to use; but where would you get it? from an entity? well no entity has it set yet and trying to fetch it without a team will return null. Your thinking would be to call it using global functions like server.world or game. You be right BUT YOU CAN'N! there IS NO METHOD todo such so its IMPOSIBLE to do it in zen using pure script wtihout the use of commandManager and even then you would require AT LEAST ONE ENITTY to fetch a ITeam object that cant be stored (sure you could in customWorldData but for the sake of example and simplicity sake lets pretend we cant do that). Thus lies the problem; it seems that some of these things that would have been important were left out.

and thats where this mod comes in by expanding on those things to impliment the missing stuff that SHOULD have been there to begin with (how it was though to be OK as it was is beyond me, its a bit maddening)

  • Depending on where its stored, expanding IGame to include a method to call The Scoreboard (where teams are handled in this version) would be useful as the scoreboard is a global/server thing and can be refrenced anywhere regardless of dimension
  • game.teams could be how you would call/access this expanded form of it (would make sense as ITeam is under game to begin with.
    TEAMS
  • getTeams(); a method that will return a array containing every ITeam registered in the game; returns null if the array that is returned is empty as a result of no teams existing. List can be (or is by default; idk how they work) iterable with for
  • getTeamFromString( teamName as string); returns a specific ITeam object from a string with the matching name of it; otherwise returns null
  • createTeam( name as string); a method to create a new team without using the command manager (whether there are benefits to this or not is up to you I suppose but at least there's a way to do it if you wanna avoid using commandManager like the plague for whatever reason :P) can return true if it is done successfully
  • removeTeam( name as string); the opposite of createTeam; returns true if it succeeds, false if it fails (afaik this would happen if the thing doesn't exist anymore period.

[Feature request] optional `item` in simulate functions

I want to simulate right-click for opening "loot box" by the entity.
In my case its Goose holding Fur Ball (fur ball dropping items on right click).

image

The problem, is that i cant know what item result i would get after right-clicking.

As i got it right, i should

  1. Detect item Goose holding
  2. Make fake player
  3. Simulate right-click by player with item goose holding
  4. This would open "fur ball" and drop items into fake player inventory
  5. Drop inventory of fake player in world like it was Goose

The problem is that i want any item be used this way. Like, maybe gun? Or giant sword. In this case i need to know not only the result of usage simulation but item transformation (like reducing durability).

image

If in functions like player.simulateRightClickItem(item, hand); i could assume that item is thing holded in hand, actual item would be used from fake player inventory and transformed, so u could read result after.

Cannot use `mods.zenutils.StaticString.join` to join string array

Seems like mods.zenutils.StaticString.join should work with any types of CraftTweaker arrays, but it cant work with string[]

Both this lines erroring:

print(mods.zenutils.StaticString.join(['a','b'], ','));
print(mods.zenutils.StaticString.join(['a','b'] as string[], ','));

Error in crafttweaker.log:

12 methods available but none matches the parameters (string[], string)
This is usually an error in your script, not in the mod
join(short[], string)
join(float[], string)
join(double[], string)
join(int[], string)
join(long[], string)
join(ZenTypeNative: java.lang.Object[], string)
join(float[], string, int, int)
join(ZenTypeNative: java.lang.Object[], string, int, int)
join(int[], string, int, int)
join(long[], string, int, int)
join(short[], string, int, int)
join(double[], string, int, int)

JourneyMap Integration

This includes creating waypoints from given waypoint name, xyz pos, and hex color and such properties.

Would be useful to create waypoints on triggering specific events.

[Feature Request] Dump stack trace on `Exception occurred in a catenation`

Right now i have something wrong with catenation executions. I have this lines in crafttweaker.log:

[SERVER_STARTED][SERVER][ERROR] Exception occurred in a catenation task, stopping the catenation...
java.lang.NullPointerException

I tried to /ct reload and problem is still there.

There is output in debug.log file:

[16:51:22] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] §cERROR: Exception occurred in a catenation task, stopping the catenation..., caused by java.lang.NullPointerException
[16:51:22] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] §cERROR: Exception occurred in a catenation task, stopping the catenation..., caused by java.lang.NullPointerException

Please add full stack trace, so i could find source of error.

Server crash: `NoClassDefFoundError: net/minecraft/client/multiplayer/WorldClient`

zenutils-1.12.5

Just updated server and got crash on load:

[Server thread/ERROR] [FML]: An error occurred trying to load an EventBusSubscriber youyihj.zenutils.impl.util.catenation.CatenationManager for modid zenutils
java.lang.NoClassDefFoundError: net/minecraft/client/multiplayer/WorldClient
        at java.lang.Class.getDeclaredMethods0(Native Method) ~[?:1.8.0_352]
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) ~[?:1.8.0_352]
        at java.lang.Class.privateGetPublicMethods(Class.java:2902) ~[?:1.8.0_352]
        at java.lang.Class.getMethods(Class.java:1615) ~[?:1.8.0_352]
        at net.minecraftforge.fml.common.eventhandler.EventBus.register(EventBus.java:82) ~[EventBus.class:?]
        at net.minecraftforge.fml.common.AutomaticEventSubscriber.inject(AutomaticEventSubscriber.java:82) [AutomaticEventSubscriber.class:?]

crash-2023-01-27_21.00.38-server.txt
debug.log

Сatenation MC stall

After updating to new version and using new catenation api, i encounter MC window unresponding.

This happen when i firstly subscribe to events.onPlayerLoggedIn, then create new catenation with sleeps

e.player.world.catenation().sleep(100).then(function(world) {
    print('First then');
  })
  
  .sleep(300).then(function(world) {
    print('Second then');
    runAutomation(e.player);
  }).start();

and then create another inside

function runAutomation(player as IPlayer) as void {
  print('runAutomation');
  player.world.catenation().sleep(20).then(function(world) {
    print('First catenation');
  }).start();
  print('end');

Output looks like this:

First then
Second then
runAutomation
end

And then MC window hang unresponding.

Crash Report:

java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
    at java.util.ArrayList$Itr.next(ArrayList.java:851)
    at com.google.common.collect.AbstractMapBasedMultimap$WrappedCollection$WrappedIterator.next(AbstractMapBasedMultimap.java:496)
    at java.util.Collection.removeIf(Collection.java:414)
    at youyihj.zenutils.impl.util.catenation.CatenationManager.onWorldTick(CatenationManager.java:25)
    at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_1841_CatenationManager_onWorldTick_WorldTickEvent.invoke(.dynamic)

Logs

crash-2022-08-05_09.02.37-server.txt
debug.log

setToItemSlot() 调用中抛出 NPE

ZenUtils 版本

1.16.1

复现涉及到的模组

各模组的前置省略。

复现所需的配置文件

https://gist.github.com/RisingInIris2017/d6aa354eccb0d7a68d35ac885f1fbe39

问题脚本

https://mclo.gs/ES2nmim

报错

https://mclo.gs/7lsuoZ5

复现报错方式

  1. 获取名为 item.custom_newbie.name 的拔刀剑(即为问题脚本 L9 所匹配的目标物品),把它放在快捷栏除左起第一格以外的栏位。
  2. 设法让玩家在消耗其耐久的过程中被杀。已尝试过可行的方式包括:
    • 和怪物战斗的过程中被怪物杀死
    • 先触发一个接到写有 kill @p 命令的命令方块的延时电路,然后用这把拔刀剑挖掘事先放好的方块
  3. 如果重生后快捷栏中出现了一把耐久不满的拔刀剑,那么滚动鼠标滚轮或按数字 1-9,将主手切换到这把拔刀剑上,上述报错即出现,复现即成功。

预期行为

该脚本除了报错以外的行为都是预期要实现的行为,只要能有避免上述报错的方法就好了。

et2更新这个模组就报错,

报错内容[ERROR] contenttweaker\item\AdvancedFruit.zs:47 > No such member in mods.contenttweaker.MutableItemStack: setTag
[zenutils-1.7.4]是最后一个可以使用的版本,只要高过这个版本他就出错,要怎么修

Augmentation

It is hoped that the modification of the orientation of the block can be added.

[Feature request] `IEntityDefinition.onUpdate(...)`

Please add event listener for a specific entity definition onUpdate (or onTick) action.
This is required when i want to add special mechanics only for specific entity.

Right now, only way i found is to iterate all entities in world, using onWorldTick event.

https://github.com/Krutoy242/Enigmatica2Expert-Extended/blob/master/scripts/mods/betteranimalsplus_goose.zs#L19-L31

events.onWorldTick(function (e as crafttweaker.event.WorldTickEvent) {
  val world = e.world;
  if (world.remote || world.time % 10 != 0) return;
  
  for entity in world.getEntities() {
    if (!(entity instanceof IEntityAnimal) || !entity.alive) continue;
    val animal as IEntityAnimal = entity;
    if (!animal.canPickUpLoot) continue;
    if (animal.definition.id != 'betteranimalsplus:goose') continue;
    val base as IEntityLivingBase = animal;
    tickGoose(base);
  }
});

This sounds inefficient, since i need to use additional comparisons such as animal.definition.id != 'betteranimalsplus:goose' to just find appropriate entity. Another problem is that it required iterating all entities, and if there is 1000+ of them on server, but 0 desirable entities, iterations just consume CPU without actual doing anything.

If there would be function like this, it could save lot of lines of code. And i assume that this function would not be called if world have 0 entities of this type, so could save CPU time.

<entity:betteranimalsplus:goose>.onUpdate(function(e){ ... })

P.S. would be also cool if onUpdate() have optional argument step or interval, so i dont need to check world.time % 10 != 0 100 times for 100 entities.

Crash: ConcurrentModificationException on tandem with Catenation

I'm changing string list inside catenation and getting this server crash:

java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:911)
    at java.util.ArrayList$Itr.next(ArrayList.java:861)
    at commands\Restart_server.clearPending(commands/restart_server.zs:59)
    at commands\Restart_server.cancelVoting(commands/restart_server.zs:66)
    at Crafttweakercommands\Restart_server89.apply(commands/restart_server.zs:91)
    at youyihj.zenutils.impl.util.catenation.InstantTask.run(InstantTask.java:20)
    at youyihj.zenutils.api.util.catenation.Catenation.tick(Catenation.java:38)
    at youyihj.zenutils.impl.util.catenation.CatenationManager.lambda$onWorldTick$0(CatenationManager.java:31)
    at java.util.Collection.removeIf(Collection.java:414)
    at youyihj.zenutils.impl.util.catenation.CatenationManager.onWorldTick(CatenationManager.java:31)
    at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_1352_CatenationManager_onWorldTick_WorldTickEvent.invoke(.dynamic)

My code: https://github.com/Krutoy242/Enigmatica2Expert-Extended/blob/7ae848b7b5df53c85416e4c5b8d5cde74da9ba6f/scripts/commands/restart_server.zs#L59
Full crash log:
crash-2022-08-31_19.20.37-server.txt

[Feature] AoE Entity List methods

TLDR: a method to allow someone to get a list of enitties within a set radus around another entity or point in the world; like how the @e(distance=..value) in newer versions would do this (yeah, only (type=) exists with @e in this version)

id imagine it would be something like this; whether you use the syntax or not is up to you; just thinking ideas here
entity.getNearbyEntities( radius as int, type/focus as optional [put in the instanceOf to filter it out; if its not present then it assumes any entity type (Ientity, Iplayer, IitemEntity, IEntityLivingBase, etc)]

can use an POSsition in the world or an entity directly (since they will have a XYZ on them for the most part, only difference is that an entity pos will be more percise than using a block pos (unless you wanna punch floats in by hand XD)

pos.getNearbyEntities( x as int, game.getEntity("sheep")); //Returns a list of entities that are "minecraft:sheep"
pos.getNearbyEntities( 12, IItemEntity ); // returns a list of entities that are an instanceOf a IItemEntity within a 12 block/meter radius
pos.getNearbyEntities( 0, IBlock ); // would return null as there would be nothing; but would error because IBlock is not a type of entity [no mater how hard you want it to be, tileEntities wont count as being a valid entity to check for with this as well]

[Bug/Help] DelayManager

I have try the DelayManager example on the wiki and MC don't import the classes.

Her is my script: (1 to 1 copy from the wiki)

// mods.zenutils.DelayManager.addDelayWork(DelayRunnable runnable, @Optional(valueLong = 1L) long delay);
import crafttweaker.event.PlayerLoggedInEvent;
import mods.zenutils.DelayManager;


events.onPlayerLoggedIn(function(event as PlayerLoggedInEvent) {
    if (event.player.world.remote) return;
    DelayManager.addDelayWork(function() {
        event.player.sendMessage("The message is shown 10 seconds after the player logs in");
    }, 10 * 20);
});

Error 1: https://pastebin.com/HDUGXNSm
I am running a client server, so maybe there is something wrong on this script.

Error 2: §cERROR: 08Delay.zs:2 > No such member: zenutils
When I try only to import import mods.zenutils.DelayManager;

Mod is installed and shows up in Mod section.

Instance / Installed Mods:

  • Newest (commanded) Forge Version
  • Newest CT and MTLib Version

debug.log WARN: `mixins.zenutils.vanilla.json:MixinForgeHooks exceeds the maximum allowed value: 0`

I found this warning in my debug.log file. I didnt found any malfunctions yet, but better safe than sorry 😀

[Client thread/DEBUG] [mixin]: Mixing UTForgeHooksMixin from mixins.tweaks.performance.advancementcheck.json into net.minecraftforge.common.ForgeHooks
[Client thread/WARN] [mixin]: @Inject(@At("INVOKE")) Shift.BY=2 on mixins.zenutils.vanilla.json:MixinForgeHooks from mod unknown-owner::handler$zzc000$passPlayer exceeds the maximum allowed value: 0. Increase the value of maxShiftBy to suppress this warning.
[Client thread/DEBUG] [mixin]: mixins.zenutils.vanilla.json:MixinForgeHooks from mod unknown-owner->@Inject::passPlayer(Lnet/minecraft/inventory/ContainerRepair;Lnet/minecraft/item/ItemStack;Lnet/minecraft/item/ItemStack;Lnet/minecraft/inventory/IInventory;Ljava/lang/String;ILorg/spongepowered/asm/mixin/injection/callback/CallbackInfoReturnable;Lnet/minecraftforge/event/AnvilUpdateEvent;)V doesn't use it's CallbackInfoReturnable

debug.log

Is this warning can be ignored? Should i expect anything breaks?
I know its not an ERROR that usually lead to malfunctions, but I know that Mixins sometimes only using WARN to report that nothing working.

Suggestion; stable method to get client player object from UUID

One issue ive ran into wiht my script with data manipulation is that some data requires both the player instance on the server and client to be updated at the same time to avoid halluciantions (as in one having it while the other dosent)

one instance of this is the onPlayerDeath event, which only runs on the server; lets say you want something to update about the player data on respawn but it requires a client update for things to work correctly to avoid desync/hallucination; you can use the UUID already in this addon to get the player object but is there a way to have this call the client object of the player as well

Note: while you can use IClient to fetch the client player object, this may cause issues in the event a non-client (dedicated server) tries to run the script.

Catenations not working (need more info)

(This is unfinished issue, im still investigating it)

I have code that prevent players to visit Nether if they have lower than 30 HP.
https://github.com/Krutoy242/Enigmatica2Expert-Extended/blob/master/scripts/category/dimensions.zs

Problem is that players doesnt receive message.

This would work:

player.sendRichTextMessage(...);

This won't:

player.world.catenation().sleep(1).then(function(world, ctx) {
	player.sendRichTextMessage(...);
}).start();

Interesting note, is that this code worked fine on older (several month - year old) versions.

`reward.quest.title` not working on server

I want to make global notification when player finishing important quest.

My ZS code sending global message in chat, so everyone on server knows progress of other players.

There is my code: https://github.com/Krutoy242/Enigmatica2Expert-Extended/blob/5307a7e9483b9191ea83b196b9c3615745e16536/scripts/mods/ftbquests_custom_rewards.zs#L48

Im using events.onCustomReward and getting e.reward.quest.title for quest title.

Seems like (but not sure) since i have lang entries instead of actual titles {q.gates.conflux_i.name}, ftbquests try to translate it but unable to and print this error into crafttweaker.log:

[SERVER_STARTED][SERVER][ERROR] net/minecraft/client/resources/I18n
java.lang.NoClassDefFoundError: net/minecraft/client/resources/I18n
	at com.feed_the_beast.ftbquests.quest.QuestObjectBase.getTitle(QuestObjectBase.java:378)
	at youyihj.zenutils.api.ftbq.CTQuestObjectBase.getTitle(CTQuestObjectBase.java:39)
	at CrafttweakerReloadablemods\Ftbquests_custom_rewards186.handle(mods/ftbquests_custom_rewards.zs:48)
	at CrafttweakerReloadablemods\Ftbquests_custom_rewards186.handle(mods/ftbquests_custom_rewards.zs)
	at crafttweaker.util.EventList.publish(EventList.java:51)
	at youyihj.zenutils.api.ftbq.FTBQEventManager$Handler.onCustomReward(FTBQEventManager.java:104)
	at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_1374_Handler_onCustomReward_CustomRewardEvent.invoke(.dynamic)

How i can fix this error? Is this means i cant notify players with lang entries, since lang can only being translated on clients?

[Feature Request] Numerical `Block ID` getter from a block

Sometimes, i need to acces int IDs of blocks from CT code.

Jared, mainteiner of CT suggested

make a crt addon to expose the int id

Right now, in my modpack E2E-E i need two usage for this getter:

  1. Bedrock Ore mod using int IDs in its NBT block tags. Sometimes i need to change one block to another or turn bedrock into Bedrock Ore with a script.

image

  1. Vulpes Library ghost blocks. Using them could be nice idea for interactions or custom events. They use numerical IDs too.

image

getPlayerBaubleItemHandler() should somehow not lead to total script failure when baubles isnt present

bit of a niche issue but the only way I can describe this issue is to relate it to my current delema.

in my custom script I am using something that dosent nessisary rely on baubles as a requirement nor do Intend on it being a requirement; however, a specific error utilizing getPlayerBaubleItemHandler() breaks the entiery of my script using it.

this may seem redundant; though I can assure that this is a problem as even if I were to have it kept in some sort of if condition it still outright breaks from its meer presence
image
image
^ atempt to not use it; failed lel

my suggestion here is to somehow still keep this line as a viable method but instead have it return as null or something; allowing for a simple !isNull() check to be done to prevent that part of the code being used and have it be used without baubles as a dependency

XaeroMap Integration

Currently we have compatibility with JourneyMap but for some modpacks that use XaeroMap this is still required.

The required compatibility is consistent with the above issue.

Using `world.getFakePlayer().simulateRightClickItem()` causing error

My code:

val player = world.getFakePlayer();
player.simulateRightClickItem(item, crafttweaker.entity.IEntityEquipmentSlot.mainHand());

error written in crafttweaker.log:

[SERVER_STARTED][SERVER][ERROR] null
java.lang.NullPointerException
	at net.minecraft.entity.player.EntityPlayerMP.func_71110_a(EntityPlayerMP.java:989)
	at net.minecraft.entity.player.EntityPlayerMP.func_71120_a(EntityPlayerMP.java:984)
	at net.minecraft.server.management.PlayerInteractionManager.func_187250_a(PlayerInteractionManager.java:391)
	at youyihj.zenutils.impl.util.PlayerInteractionSimulation.lambda$simulateRightClickItem$0(PlayerInteractionSimulation.java:36)
	at youyihj.zenutils.impl.util.PlayerInteractionSimulation.ghostItemOperation(PlayerInteractionSimulation.java:113)
	at youyihj.zenutils.impl.util.PlayerInteractionSimulation.simulateRightClickItem(PlayerInteractionSimulation.java:34)
	at youyihj.zenutils.api.player.ZenUtilsPlayer.simulateRightClickItem(ZenUtilsPlayer.java:65)
	at CrafttweakerReloadablemods\Betteranimalsplus_event109.handle(mods\betteranimalsplus_event.zs:32)

Extended Potion

Can you add shouldRender?Used to control the effect in the backpack.

[Feature Request] Catenation executes a custom function when it stops

I need catenation to do such a thing: when it stops, it executes a custom function.
And I can retrieve the reason why this cantenation stops, STOP_WHEN, MANUALLY, UNEXPECTED for example.
Then I will be able to let catenation do something according to its "stop reason".

If catenation is forced to stop (players exit the save they were playing just now normally, or server executes /stop command),
it should return UNEXPECTED its "stop reason", and perform the function mentioned above, then let game/server continues to stop.

It is unnecessary for my request to consider about crashes or something like these.

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.