1+ package org .dave .compactmachines3 .misc ;
2+
3+ import com .google .common .collect .Lists ;
4+ import com .google .common .collect .Maps ;
5+ import com .google .common .collect .Sets ;
6+ import com .google .gson .JsonDeserializationContext ;
7+ import com .google .gson .JsonObject ;
8+ import net .minecraft .advancements .ICriterionTrigger ;
9+ import net .minecraft .advancements .PlayerAdvancements ;
10+ import net .minecraft .advancements .critereon .AbstractCriterionInstance ;
11+ import net .minecraft .entity .player .EntityPlayerMP ;
12+ import net .minecraft .util .ResourceLocation ;
13+
14+ import java .util .List ;
15+ import java .util .Map ;
16+ import java .util .Set ;
17+
18+ public class BaseTrigger implements ICriterionTrigger <BaseTrigger .Instance > {
19+ private final ResourceLocation ID ;
20+ private final Map <PlayerAdvancements , Listeners > listeners = Maps .<PlayerAdvancements , BaseTrigger .Listeners >newHashMap ();
21+
22+ public BaseTrigger (String parString ) {
23+ super ();
24+ ID = new ResourceLocation (parString );
25+ }
26+
27+ public BaseTrigger (ResourceLocation parRL ) {
28+ super ();
29+ ID = parRL ;
30+ }
31+
32+ @ Override
33+ public ResourceLocation getId () {
34+ return ID ;
35+ }
36+
37+ @ Override
38+ public void addListener (PlayerAdvancements playerAdvancementsIn , ICriterionTrigger .Listener <BaseTrigger .Instance > listener ) {
39+ BaseTrigger .Listeners basetrigger$listeners = this .listeners .get (playerAdvancementsIn );
40+
41+ if (basetrigger$listeners == null ) {
42+ basetrigger$listeners = new BaseTrigger .Listeners (playerAdvancementsIn );
43+ this .listeners .put (playerAdvancementsIn , basetrigger$listeners );
44+ }
45+
46+ basetrigger$listeners .add (listener );
47+ }
48+
49+ @ Override
50+ public void removeListener (PlayerAdvancements playerAdvancementsIn , ICriterionTrigger .Listener <BaseTrigger .Instance > listener ) {
51+ BaseTrigger .Listeners basetrigger$listeners = this .listeners .get (playerAdvancementsIn );
52+
53+ if (basetrigger$listeners != null ) {
54+ basetrigger$listeners .remove (listener );
55+
56+ if (basetrigger$listeners .isEmpty ()) {
57+ this .listeners .remove (playerAdvancementsIn );
58+ }
59+ }
60+ }
61+
62+ @ Override
63+ public void removeAllListeners (PlayerAdvancements playerAdvancementsIn ) {
64+ this .listeners .remove (playerAdvancementsIn );
65+ }
66+
67+ @ Override
68+ public BaseTrigger .Instance deserializeInstance (JsonObject json , JsonDeserializationContext context ) {
69+ return new BaseTrigger .Instance (this .getId ());
70+ }
71+
72+ public void trigger (EntityPlayerMP parPlayer ) {
73+ BaseTrigger .Listeners basetrigger$listeners = this .listeners .get (parPlayer .getAdvancements ());
74+
75+ if (basetrigger$listeners != null ) {
76+ basetrigger$listeners .trigger (parPlayer );
77+ }
78+ }
79+
80+ public static class Instance extends AbstractCriterionInstance {
81+
82+ public Instance (ResourceLocation parID ) {
83+ super (parID );
84+ }
85+
86+ public boolean test () {
87+ return true ;
88+ }
89+ }
90+
91+ static class Listeners {
92+ private final PlayerAdvancements playerAdvancements ;
93+ private final Set <Listener <Instance >> listeners = Sets .<ICriterionTrigger .Listener <BaseTrigger .Instance >>newHashSet ();
94+
95+ public Listeners (PlayerAdvancements playerAdvancementsIn ) {
96+ this .playerAdvancements = playerAdvancementsIn ;
97+ }
98+
99+ public boolean isEmpty () {
100+ return this .listeners .isEmpty ();
101+ }
102+
103+ public void add (ICriterionTrigger .Listener <BaseTrigger .Instance > listener ) {
104+ this .listeners .add (listener );
105+ }
106+
107+ public void remove (ICriterionTrigger .Listener <BaseTrigger .Instance > listener ) {
108+ this .listeners .remove (listener );
109+ }
110+
111+ public void trigger (EntityPlayerMP player ) {
112+ List <Listener <Instance >> list = null ;
113+
114+ for (ICriterionTrigger .Listener <BaseTrigger .Instance > listener : this .listeners ) {
115+ if (listener .getCriterionInstance ().test ()) {
116+ if (list == null ) {
117+ list = Lists .<ICriterionTrigger .Listener <BaseTrigger .Instance >>newArrayList ();
118+ }
119+
120+ list .add (listener );
121+ }
122+ }
123+
124+ if (list != null ) {
125+ for (ICriterionTrigger .Listener <BaseTrigger .Instance > listener1 : list ) {
126+ listener1 .grantCriterion (this .playerAdvancements );
127+ }
128+ }
129+ }
130+ }
131+ }
0 commit comments