Skip to content

Commit

Permalink
Merge stable-7 into cleanup branch to ensure functionality.
Browse files Browse the repository at this point in the history
Signed-off-by: Gabriel Harris-Rouquette <[email protected]>
  • Loading branch information
gabizou committed Jun 10, 2018
2 parents d2eb35b + 50507d2 commit 3682d25
Show file tree
Hide file tree
Showing 19 changed files with 215 additions and 67 deletions.
2 changes: 1 addition & 1 deletion SpongeAPI
Original file line number Diff line number Diff line change
Expand Up @@ -846,7 +846,7 @@ public static InteractBlockEvent.Secondary createInteractBlockEventSecondary(Ent
}
}

public static DestructEntityEvent.Death callDestructEntityEventDeath(EntityLivingBase entity, @Nullable DamageSource source, boolean isMainThread) {
public static Optional<DestructEntityEvent.Death> callDestructEntityEventDeath(EntityLivingBase entity, @Nullable DamageSource source, boolean isMainThread) {
final MessageEvent.MessageFormatter formatter = new MessageEvent.MessageFormatter();
MessageChannel originalChannel;
MessageChannel channel;
Expand Down Expand Up @@ -892,7 +892,7 @@ public static DestructEntityEvent.Death callDestructEntityEventDeath(EntityLivin
if (!event.isCancelled() && !event.isMessageCancelled() && !message.isEmpty()) {
event.getChannel().ifPresent(eventChannel -> eventChannel.send(entity, event.getMessage()));
}
return event;
return Optional.of(event);
}
}

Expand Down Expand Up @@ -1371,4 +1371,9 @@ public static CraftItemEvent.Craft callCraftEventPost(EntityPlayer player, Craft
((IMixinContainer) container).setCaptureInventory(true);
return event;
}

public static void callPostPlayerRespawnEvent(EntityPlayerMP playerMP, boolean conqueredEnd) {
// We overwrite this method in SpongeForge, in order to fire
// Forge's PlayerRespawnEvent
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -344,4 +344,14 @@ default boolean performOrCaptureItemDrop(C phaseContext, Entity entity, EntityIt
default boolean doesCaptureEntitySpawns() {
return false;
}

/**
* Specifically designed to allow certain registries use the event listener hooks to prevent unnecessary off-threaded
* checks and allows for registries to restrict additional registrations ouside of events.
*
* @return True if this is an event listener state
*/
default boolean isEvent() {
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import org.spongepowered.api.item.inventory.crafting.CraftingOutput;
import org.spongepowered.api.item.inventory.query.QueryOperationTypes;
import org.spongepowered.api.item.inventory.transaction.SlotTransaction;
import org.spongepowered.api.item.recipe.Recipe;
import org.spongepowered.api.item.recipe.crafting.CraftingRecipe;
import org.spongepowered.common.SpongeImpl;
import org.spongepowered.common.entity.EntityUtil;
Expand Down Expand Up @@ -96,11 +97,11 @@ public void unwind(InventoryPacketContext context) {
Transaction<ItemStackSnapshot> cursorTransaction = new Transaction<>(cursor, cursor);
ClickInventoryEvent event;
if (shift) {
event = SpongeEventFactory.createClickInventoryEventShiftPrimary(frame.getCurrentCause(),
cursorTransaction, ((Container) player.openContainer), transactions);
event = SpongeEventFactory.createClickInventoryEventRecipeAll(frame.getCurrentCause(),
cursorTransaction, (Recipe) recipe, ((Container) player.openContainer), transactions);
} else {
event = SpongeEventFactory.createClickInventoryEventPrimary(frame.getCurrentCause(),
cursorTransaction, ((Container) player.openContainer), transactions);
event = SpongeEventFactory.createClickInventoryEventRecipeSingle(frame.getCurrentCause(),
cursorTransaction, (Recipe) recipe, ((Container) player.openContainer), transactions);
}
SpongeImpl.postEvent(event);
if (event.isCancelled() || !event.getCursorTransaction().isValid()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ public void unwind(ListenerPhaseContext phaseContext) {

}

@Override
public boolean isEvent() {
return true;
}

@Override
public boolean tracksBlockSpecificDrops() {
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,6 @@ public interface IMixinPlayerList {

void transferEntityToWorld(Entity entityIn, int fromDimensionId, WorldServer fromWorld, WorldServer toWorld, net.minecraft.world
.Teleporter teleporter);

void reloadAdvancementProgress();
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,6 @@ public interface IMixinAdvancementProgress {
void setAdvancement(String advancement);

void invalidateAchievedState();

void updateProgressMap();
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,6 @@ public interface IMixinPlayerAdvancements {
Set<AdvancementTree> getAdvancementTrees();

Player getPlayer();

void reloadAdvancementProgress();
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
*/
package org.spongepowered.common.mixin.core.advancement;

import static com.google.common.base.Preconditions.checkState;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import net.minecraft.advancements.Advancement;
Expand All @@ -50,13 +52,15 @@
import org.spongepowered.common.advancement.SpongeAdvancementBuilder;
import org.spongepowered.common.advancement.SpongeAdvancementTree;
import org.spongepowered.common.advancement.SpongeScoreCriterion;
import org.spongepowered.common.event.tracking.PhaseTracker;
import org.spongepowered.common.interfaces.advancement.IMixinAdvancement;
import org.spongepowered.common.interfaces.advancement.IMixinCriterion;
import org.spongepowered.common.interfaces.advancement.IMixinDisplayInfo;
import org.spongepowered.common.registry.type.advancement.AdvancementRegistryModule;
import org.spongepowered.common.registry.type.advancement.AdvancementTreeRegistryModule;
import org.spongepowered.common.text.SpongeTexts;
import org.spongepowered.common.text.translation.SpongeTranslation;
import org.spongepowered.common.util.ServerUtils;

import java.util.ArrayList;
import java.util.Collection;
Expand Down Expand Up @@ -89,10 +93,18 @@ public class MixinAdvancement implements org.spongepowered.api.advancement.Advan

@Nullable private Advancement tempParent;

private void checkServer() {
checkState(ServerUtils.isCallingFromMainThread());
}

@SuppressWarnings("ConstantConditions")
@Inject(method = "<init>", at = @At("RETURN"))
private void onInit(ResourceLocation id, @Nullable Advancement parentIn, @Nullable DisplayInfo displayIn,
AdvancementRewards rewardsIn, Map<String, Criterion> criteriaIn, String[][] requirementsIn, CallbackInfo ci) {
// Don't do anything on the client
if (!ServerUtils.isCallingFromMainThread()) {
return;
}
if (displayIn != null) {
((IMixinDisplayInfo) displayIn).setAdvancement(this);
}
Expand All @@ -102,7 +114,7 @@ private void onInit(ResourceLocation id, @Nullable Advancement parentIn, @Nullab
if (displayIn != null) {
this.name = SpongeTexts.toPlain(displayIn.getTitle());
}
if (!AdvancementRegistryModule.INSIDE_REGISTER_EVENT) {
if (!PhaseTracker.getInstance().getCurrentState().isEvent()) {
AdvancementRegistryModule.getInstance().registerAdditionalCatalog(this);
} else {
// Wait to set the parent until the advancement is registered
Expand Down Expand Up @@ -182,47 +194,56 @@ private void onInit(ResourceLocation id, @Nullable Advancement parentIn, @Nullab

@Override
public Optional<AdvancementTree> getTree() {
checkServer();
return Optional.ofNullable(this.tree);
}

@Override
public void setParent(@Nullable Advancement advancement) {
checkServer();
this.parent = advancement;
}

@Override
public void setTree(AdvancementTree tree) {
checkServer();
this.tree = tree;
}

@SuppressWarnings({"unchecked", "rawtypes"})
@Override
public Collection<org.spongepowered.api.advancement.Advancement> getChildren() {
checkServer();
return ImmutableList.copyOf((Collection) this.children);
}

@Override
public AdvancementCriterion getCriterion() {
checkServer();
return this.criterion;
}

@Override
public void setCriterion(AdvancementCriterion criterion) {
checkServer();
this.criterion = criterion;
}

@Override
public void setName(String name) {
checkServer();
this.name = name;
}

@Override
public boolean isRegistered() {
checkServer();
return this.tempParent == null;
}

@Override
public void setRegistered() {
checkServer();
if (this.tempParent == null) {
return;
}
Expand All @@ -232,6 +253,7 @@ public void setRegistered() {

@Override
public Optional<org.spongepowered.api.advancement.Advancement> getParent() {
checkServer();
if (this.tempParent != null) {
return Optional.of((org.spongepowered.api.advancement.Advancement) this.tempParent);
}
Expand All @@ -243,26 +265,31 @@ public Optional<org.spongepowered.api.advancement.Advancement> getParent() {

@Override
public Optional<org.spongepowered.api.advancement.DisplayInfo> getDisplayInfo() {
checkServer();
return Optional.ofNullable((org.spongepowered.api.advancement.DisplayInfo) this.display);
}

@Override
public List<Text> toToastText() {
checkServer();
return this.toastText;
}

@Override
public String getId() {
checkServer();
return this.spongeId;
}

@Override
public String getName() {
checkServer();
return this.name;
}

@Override
public Text toText() {
checkServer();
return this.text;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
import net.minecraft.advancements.AdvancementList;
import net.minecraft.util.ResourceLocation;
import org.apache.logging.log4j.Logger;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.advancement.AdvancementTree;
import org.spongepowered.api.event.cause.Cause;
import org.spongepowered.api.event.cause.EventContext;
import org.spongepowered.asm.mixin.Final;
Expand All @@ -38,9 +40,12 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.common.SpongeImpl;
import org.spongepowered.common.event.registry.SpongeGameRegistryRegisterEvent;
import org.spongepowered.common.event.tracking.phase.plugin.ListenerPhaseContext;
import org.spongepowered.common.event.tracking.phase.plugin.PluginPhase;
import org.spongepowered.common.interfaces.advancement.IMixinAdvancementList;
import org.spongepowered.common.registry.type.advancement.AdvancementRegistryModule;
import org.spongepowered.common.registry.type.advancement.AdvancementTreeRegistryModule;
import org.spongepowered.common.util.ServerUtils;

import java.util.Map;
import java.util.Set;
Expand All @@ -60,18 +65,38 @@ public class MixinAdvancementList implements IMixinAdvancementList {
@Inject(method = "loadAdvancements", at = @At(value = "INVOKE", shift = At.Shift.BEFORE,
target = "Ljava/util/Map;size()I", remap = false))
private void onLoadAdvancements(Map<ResourceLocation, Advancement.Builder> advancementsIn, CallbackInfo ci) {
AdvancementRegistryModule.INSIDE_REGISTER_EVENT = true;
SpongeImpl.postEvent(new SpongeGameRegistryRegisterEvent<>(Cause.of(EventContext.empty(), SpongeImpl.getRegistry()),
org.spongepowered.api.advancement.Advancement.class, AdvancementRegistryModule.getInstance()));
AdvancementRegistryModule.INSIDE_REGISTER_EVENT = false;
// Don't post events when loading advancements on the client
if (!ServerUtils.isCallingFromMainThread()) {
return;
}
final SpongeGameRegistryRegisterEvent<org.spongepowered.api.advancement.Advancement>
event =
new SpongeGameRegistryRegisterEvent<>(Cause.of(EventContext.empty(), SpongeImpl.getRegistry()),
org.spongepowered.api.advancement.Advancement.class, AdvancementRegistryModule.getInstance());
try (ListenerPhaseContext context = PluginPhase.Listener.GENERAL_LISTENER.createPhaseContext()
.event(event)
.source(Sponge.getGame())) {
context.buildAndSwitch();
SpongeImpl.postEvent(event);
}
}

@Inject(method = "loadAdvancements", at = @At(value = "RETURN"))
private void onLoadAdvancementForTrees(Map<ResourceLocation, Advancement.Builder> advancementsIn, CallbackInfo ci) {
AdvancementTreeRegistryModule.INSIDE_REGISTER_EVENT = true;
SpongeImpl.postEvent(new SpongeGameRegistryRegisterEvent<>(Cause.of(EventContext.empty(), SpongeImpl.getRegistry()),
org.spongepowered.api.advancement.AdvancementTree.class, AdvancementTreeRegistryModule.getInstance()));
AdvancementTreeRegistryModule.INSIDE_REGISTER_EVENT = false;
// Don't post events when loading advancements on the client
if (!ServerUtils.isCallingFromMainThread()) {
return;
}
final SpongeGameRegistryRegisterEvent<AdvancementTree>
event =
new SpongeGameRegistryRegisterEvent<>(Cause.of(EventContext.empty(), SpongeImpl.getRegistry()),
AdvancementTree.class, AdvancementTreeRegistryModule.getInstance());
try (ListenerPhaseContext context = PluginPhase.Listener.GENERAL_LISTENER.createPhaseContext()
.event(event)
.source(Sponge.getGame())) {
context.buildAndSwitch();
SpongeImpl.postEvent(event);
}
LOGGER.info("Loaded " + this.roots.size() + " advancement trees");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,22 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.common.SpongeImpl;
import org.spongepowered.common.interfaces.IMixinPlayerList;
import org.spongepowered.common.registry.type.advancement.AdvancementRegistryModule;
import org.spongepowered.common.registry.type.advancement.AdvancementTreeRegistryModule;

@Mixin(AdvancementManager.class)
public class MixinAdvancementManager {

@Inject(method = "reload", at = @At("HEAD"))
private void onReload(CallbackInfo ci) {
private void onReloadHead(CallbackInfo ci) {
AdvancementTreeRegistryModule.getInstance().clear();
AdvancementRegistryModule.getInstance().clear();
}

@Inject(method = "reload", at = @At("RETURN"))
private void onReloadReturn(CallbackInfo ci) {
((IMixinPlayerList) SpongeImpl.getServer().getPlayerList()).reloadAdvancementProgress();
}
}
Loading

0 comments on commit 3682d25

Please sign in to comment.