Fix /blockprops not updating blockprops, fixes #473. Also fixes /gb remove.

This commit is contained in:
UnknownShadow200 2017-07-16 22:25:09 +10:00
parent 253cb65f85
commit 8befec23a8
4 changed files with 51 additions and 35 deletions

View File

@ -135,13 +135,22 @@ namespace MCGalaxy {
}
public static void UpdateGlobalBlockProps() {
for (int i = 0; i < Block.Count; i++) {
GlobalProps[i] = Block.Props[i];
GlobalProps[i + Block.Count] = BlockProps.MakeDefault();
for (int i = 0; i < GlobalProps.Length; i++) {
ExtBlock block = ExtBlock.FromIndex(i);
GlobalProps[i] = BlockProps.MakeDefault();
GlobalProps[i] = DefaultProps(block);
}
BlockProps.Load("global", GlobalProps, true);
}
internal static BlockProps DefaultProps(ExtBlock block) {
if (block.IsPhysicsType) return Block.Props[block.Index];
if (block.IsCustomType || GlobalDefs[block.BlockID] != null)
return GlobalProps[block.Index];
return Block.Props[block.Index];
}
static void UpdateLoadedLevels(BlockDefinition[] oldGlobalDefs) {
Level[] loaded = LevelInfo.Loaded.Items;
foreach (Level lvl in loaded) {
@ -158,7 +167,7 @@ namespace MCGalaxy {
public static void Add(BlockDefinition def, BlockDefinition[] defs, Level level) {
byte raw = def.BlockID;
bool global = defs == GlobalDefs;
if (global) UpdateGlobalCustom(def);
if (global) UpdateGlobalCustom(raw, def);
defs[raw] = def;
if (global) Block.SetDefaultNames();
@ -180,7 +189,7 @@ namespace MCGalaxy {
public static void Remove(BlockDefinition def, BlockDefinition[] defs, Level level) {
byte raw = def.BlockID;
bool global = defs == GlobalDefs;
if (global) UpdateGlobalCustom(def);
if (global) UpdateGlobalCustom(raw, null);
defs[raw] = null;
if (global) Block.SetDefaultNames();
@ -197,10 +206,8 @@ namespace MCGalaxy {
Save(global, level);
}
static void UpdateGlobalCustom(BlockDefinition def) {
byte raw = def.BlockID;
Level[] loaded = LevelInfo.Loaded.Items;
static void UpdateGlobalCustom(byte raw, BlockDefinition def) {
Level[] loaded = LevelInfo.Loaded.Items;
foreach (Level lvl in loaded) {
if (lvl.CustomBlockDefs[raw] != GlobalDefs[raw]) continue;
lvl.UpdateCustomBlock(raw, def);

View File

@ -477,9 +477,9 @@ namespace MCGalaxy.Commands.CPE {
string scope = global ? "global" : "level";
Player.Message(p, "Created a new " + scope + " custom block " + def.Name + "(" + def.BlockID + ")");
block = ExtBlock.FromRaw(def.BlockID);
UpdateBlockProps(global, p, block, props);
block = ExtBlock.FromRaw(def.BlockID);
BlockDefinition.Add(def, defs, p == null ? null : p.level);
UpdateBlockProps(global, p, block, props);
return true;
}
@ -568,36 +568,39 @@ namespace MCGalaxy.Commands.CPE {
static void UpdateBlockProps(bool global, Player p, ExtBlock block, BlockProps props) {
if (!global) {
p.level.BlockProps[block.Index] = props;
p.level.UpdateBlockHandler(block);
return;
}
}
BlockDefinition.GlobalProps[block.Index] = props;
Level[] loaded = LevelInfo.Loaded.Items;
byte raw = block.BlockID;
byte raw = block.RawID;
foreach (Level lvl in loaded) {
if (lvl.CustomBlockDefs[raw] != BlockDefinition.GlobalDefs[raw]) continue;
if (lvl.CustomBlockDefs[raw] != BlockDefinition.GlobalDefs[raw]) continue;
lvl.BlockProps[block.Index] = props;
lvl.UpdateBlockHandler(block);
}
}
static void RemoveBlockProps(bool global, ExtBlock block, Player p) {
// Level block reverts to using global block
if (!global) {
p.level.BlockProps[block.Index] = BlockDefinition.GlobalProps[block.Index];
p.level.BlockProps[block.Index] = BlockDefinition.DefaultProps(block);
p.level.UpdateBlockHandler(block);
return;
}
if (block.BlockID < Block.CpeCount) {
BlockDefinition.GlobalProps[block.Index] = Block.Props[block.Index];
} else {
BlockDefinition.GlobalProps[block.Index] = BlockProps.MakeDefault();
}
BlockProps props = BlockProps.MakeDefault();
BlockDefinition.GlobalProps[block.Index] = props;
Level[] loaded = LevelInfo.Loaded.Items;
byte raw = block.BlockID;
byte raw = block.RawID;
if (!block.IsCustomType) props = Block.Props[raw];
foreach (Level lvl in loaded) {
if (lvl.CustomBlockDefs[raw] != BlockDefinition.GlobalDefs[raw]) continue;
lvl.BlockProps[block.Index] = BlockDefinition.GlobalProps[block.Index];
lvl.UpdateBlockHandler(block);
}
}

View File

@ -192,14 +192,16 @@ namespace MCGalaxy.Commands.World {
static void OnPropsChanged(BlockProps[] scope, Level level, ExtBlock block) {
scope[block.Index].Changed = true;
int idx = block.Index;
scope[idx].Changed = true;
if (scope == Block.Props) {
BlockProps.Save("core", scope, i=> true);
BlockProps.Save("core", scope, i => true);
Level[] loaded = LevelInfo.Loaded.Items;
BlockDefinition.GlobalProps[idx] = BlockDefinition.DefaultProps(block);
foreach (Level lvl in loaded) {
lvl.BlockProps[block.Index] = Block.Props[block.Index];
lvl.BlockProps[idx] = BlockDefinition.GlobalProps[idx];
lvl.UpdateBlockHandler(block);
}
} else if (scope == BlockDefinition.GlobalProps) {
@ -208,8 +210,8 @@ namespace MCGalaxy.Commands.World {
byte raw = block.RawID;
foreach (Level lvl in loaded) {
if (lvl.CustomBlockDefs[raw] != BlockDefinition.GlobalDefs[raw]) continue;
lvl.BlockProps[block.Index] = BlockDefinition.GlobalProps[block.Index];
if (lvl.CustomBlockDefs[raw] != BlockDefinition.GlobalDefs[raw]) continue;
lvl.BlockProps[idx] = BlockDefinition.GlobalProps[idx];
lvl.UpdateBlockHandler(block);
}
} else {

View File

@ -53,9 +53,8 @@ namespace MCGalaxy {
for (int i = 0; i < CustomBlockDefs.Length; i++)
CustomBlockDefs[i] = BlockDefinition.GlobalDefs[i];
for (int i = 0; i < BlockProps.Length; i++)
BlockProps[i] = BlockDefinition.GlobalProps[i];
LoadCoreProps();
for (int i = 0; i < blockAABBs.Length; i++) {
ExtBlock block = ExtBlock.FromIndex(i);
blockAABBs[i] = Block.BlockAABB(block, this);
@ -470,10 +469,15 @@ namespace MCGalaxy {
public ushort smallX, smallY, smallZ;
}
public void UpdateBlockProps() {
void LoadCoreProps() {
for (int i = 0; i < BlockProps.Length; i++) {
BlockProps[i] = BlockDefinition.GlobalProps[i];
}
ExtBlock block = ExtBlock.FromIndex(i);
BlockProps[i] = BlockDefinition.DefaultProps(block);
}
}
public void UpdateBlockProps() {
LoadCoreProps();
MCGalaxy.Blocks.BlockProps.Load("lvl_" + MapName, BlockProps, true);
}
@ -484,9 +488,9 @@ namespace MCGalaxy {
}
public void UpdateBlockHandler(ExtBlock block) {
bool nonSolid = CollideType(block) != MCGalaxy.Blocks.CollideType.Solid;
bool nonSolid = CollideType(block) != MCGalaxy.Blocks.CollideType.Solid;
int i = block.Index;
deleteHandlers[i] = BlockBehaviour.GetDeleteHandler(block, BlockProps);
placeHandlers[i] = BlockBehaviour.GetPlaceHandler(block, BlockProps);
walkthroughHandlers[i] = BlockBehaviour.GetWalkthroughHandler(block, BlockProps, nonSolid);