Merge branch 'master' into 1.17
This commit is contained in:
commit
3b6261d3d6
4 files changed
+62
-21
No files matched your search
+18
-3
@@ -4860,9 +4860,24 @@ averaging.
|
|||||||
|
|
||||||
### `game_tick(mstime?)`
|
### `game_tick(mstime?)`
|
||||||
|
|
||||||
Causes game to run for one tick. By default runs it and returns control to the program, but can optionally
|
Causes game to run for one tick. By default, it runs it and returns control to the program, but can optionally
|
||||||
accept expected tick length, in milliseconds. You can't use it to permanently change the game speed, but setting
|
accept expected tick length, in milliseconds, waits that extra remaining time and then returns the control to the program.
|
||||||
longer commands with custom tick speeds can be interrupted via `/script stop` command
|
You can't use it to permanently change the game speed, but setting
|
||||||
|
longer commands with custom tick speeds can be interrupted via `/script stop` command - if you can get access to the
|
||||||
|
command terminal.
|
||||||
|
|
||||||
|
Running `game_tick()` as part of the code that runs within the game tick itself is generally a bad idea,
|
||||||
|
unless you know what this entails. Triggering the `game_tick()` will cause the current (shoulder) tick to pause, then run the internal tick,
|
||||||
|
then run the rest of the shoulder tick, which may lead to artifacts in between regular code execution and your game simulation code.
|
||||||
|
If you need to break
|
||||||
|
up your execution into chunks, you could queue the rest of the work into the next task using `schedule`, or perform your actions
|
||||||
|
defining `__on_tick()` event handler, but in case you need to take a full control over the game loop and run some simulations using
|
||||||
|
`game_tick()` as the way to advance the game progress, that might be the simplest way to do it,
|
||||||
|
and triggering the script in a 'proper' way (there is not 'proper' way, but via commmand line, or server chat is the most 'proper'),
|
||||||
|
would be the safest way to do it. For instance, running `game_tick()` from a command block triggered with a button, or in an entity
|
||||||
|
event triggered in an entity tick, may technically
|
||||||
|
cause the game to run and encounter that call again, causing stack to overflow. Thankfully it doesn't happen in vanilla running
|
||||||
|
carpet, but may happen with other modified (modded) versions of the game.
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
loop(1000,game_tick()) // runs the game as fast as it can for 1000 ticks
|
loop(1000,game_tick()) // runs the game as fast as it can for 1000 ticks
|
||||||
|
|||||||
@@ -406,9 +406,24 @@ averaging.
|
|||||||
|
|
||||||
### `game_tick(mstime?)`
|
### `game_tick(mstime?)`
|
||||||
|
|
||||||
Causes game to run for one tick. By default runs it and returns control to the program, but can optionally
|
Causes game to run for one tick. By default, it runs it and returns control to the program, but can optionally
|
||||||
accept expected tick length, in milliseconds. You can't use it to permanently change the game speed, but setting
|
accept expected tick length, in milliseconds, waits that extra remaining time and then returns the control to the program.
|
||||||
longer commands with custom tick speeds can be interrupted via `/script stop` command
|
You can't use it to permanently change the game speed, but setting
|
||||||
|
longer commands with custom tick speeds can be interrupted via `/script stop` command - if you can get access to the
|
||||||
|
command terminal.
|
||||||
|
|
||||||
|
Running `game_tick()` as part of the code that runs within the game tick itself is generally a bad idea,
|
||||||
|
unless you know what this entails. Triggering the `game_tick()` will cause the current (shoulder) tick to pause, then run the internal tick,
|
||||||
|
then run the rest of the shoulder tick, which may lead to artifacts in between regular code execution and your game simulation code.
|
||||||
|
If you need to break
|
||||||
|
up your execution into chunks, you could queue the rest of the work into the next task using `schedule`, or perform your actions
|
||||||
|
defining `__on_tick()` event handler, but in case you need to take a full control over the game loop and run some simulations using
|
||||||
|
`game_tick()` as the way to advance the game progress, that might be the simplest way to do it,
|
||||||
|
and triggering the script in a 'proper' way (there is not 'proper' way, but via commmand line, or server chat is the most 'proper'),
|
||||||
|
would be the safest way to do it. For instance, running `game_tick()` from a command block triggered with a button, or in an entity
|
||||||
|
event triggered in an entity tick, may technically
|
||||||
|
cause the game to run and encounter that call again, causing stack to overflow. Thankfully it doesn't happen in vanilla running
|
||||||
|
carpet, but may happen with other modified (modded) versions of the game.
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
loop(1000,game_tick()) // runs the game as fast as it can for 1000 ticks
|
loop(1000,game_tick()) // runs the game as fast as it can for 1000 ticks
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ public class CarpetScriptServer
|
|||||||
public Set<String> unloadableModules;
|
public Set<String> unloadableModules;
|
||||||
public long tickStart;
|
public long tickStart;
|
||||||
public boolean stopAll;
|
public boolean stopAll;
|
||||||
|
public int tickDepth;
|
||||||
private Set<String> holyMoly;
|
private Set<String> holyMoly;
|
||||||
public CarpetEventServer events;
|
public CarpetEventServer events;
|
||||||
|
|
||||||
|
|||||||
@@ -634,30 +634,40 @@ public class Auxiliary {
|
|||||||
|
|
||||||
|
|
||||||
expression.addLazyFunction("game_tick", -1, (c, t, lv) -> {
|
expression.addLazyFunction("game_tick", -1, (c, t, lv) -> {
|
||||||
ServerCommandSource s = ((CarpetContext)c).s;
|
CarpetContext cc = (CarpetContext)c;
|
||||||
|
ServerCommandSource s = cc.s;
|
||||||
if (!s.getMinecraftServer().isOnThread()) throw new InternalExpressionException("Unable to run ticks from threads");
|
if (!s.getMinecraftServer().isOnThread()) throw new InternalExpressionException("Unable to run ticks from threads");
|
||||||
((MinecraftServerInterface)s.getMinecraftServer()).forceTick( () -> System.nanoTime()- CarpetServer.scriptServer.tickStart<50000000L);
|
if (CarpetServer.scriptServer.tickDepth > 16) throw new InternalExpressionException("'game_tick' function caused other 'game_tick' functions to run. You should not allow that.");
|
||||||
if (lv.size()>0)
|
try
|
||||||
{
|
{
|
||||||
long ms_total = NumericValue.asNumber(lv.get(0).evalValue(c)).getLong();
|
CarpetServer.scriptServer.tickDepth ++;
|
||||||
long end_expected = CarpetServer.scriptServer.tickStart+ms_total*1000000L;
|
((MinecraftServerInterface) s.getMinecraftServer()).forceTick(() -> System.nanoTime() - CarpetServer.scriptServer.tickStart < 50000000L);
|
||||||
long wait = end_expected-System.nanoTime();
|
if (lv.size() > 0)
|
||||||
if (wait > 0L)
|
|
||||||
{
|
{
|
||||||
try
|
long ms_total = NumericValue.asNumber(lv.get(0).evalValue(c)).getLong();
|
||||||
{
|
long end_expected = CarpetServer.scriptServer.tickStart + ms_total * 1000000L;
|
||||||
Thread.sleep(wait/1000000L);
|
long wait = end_expected - System.nanoTime();
|
||||||
}
|
if (wait > 0L)
|
||||||
catch (InterruptedException ignored)
|
|
||||||
{
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Thread.sleep(wait / 1000000L);
|
||||||
|
}
|
||||||
|
catch (InterruptedException ignored)
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
CarpetServer.scriptServer.tickStart = System.nanoTime(); // for the next tick
|
||||||
|
Thread.yield();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
CarpetServer.scriptServer.tickDepth --;
|
||||||
}
|
}
|
||||||
CarpetServer.scriptServer.tickStart = System.nanoTime(); // for the next tick
|
|
||||||
Thread.yield();
|
|
||||||
if(CarpetServer.scriptServer.stopAll)
|
if(CarpetServer.scriptServer.stopAll)
|
||||||
throw new ExitStatement(Value.NULL);
|
throw new ExitStatement(Value.NULL);
|
||||||
return (cc, tt) -> Value.TRUE;
|
return (_c, _t) -> Value.TRUE;
|
||||||
});
|
});
|
||||||
|
|
||||||
expression.addLazyFunction("seed", -1, (c, t, lv) -> {
|
expression.addLazyFunction("seed", -1, (c, t, lv) -> {
|
||||||
|
|||||||
Reference in new issue
Block a user