9
9
import cpw .mods .fml .common .gameevent .InputEvent ;
10
10
import cpw .mods .fml .common .gameevent .TickEvent ;
11
11
import cpw .mods .fml .relauncher .Side ;
12
- import ibxm .Player ;
13
12
import net .minecraft .block .*;
14
13
import net .minecraft .block .material .Material ;
14
+ import net .minecraft .client .multiplayer .PlayerControllerMP ;
15
15
import net .minecraft .client .settings .KeyBinding ;
16
16
import net .minecraft .entity .player .EntityPlayer ;
17
- import net .minecraft .item .ItemSeeds ;
17
+ import net .minecraft .init .Items ;
18
+ import net .minecraft .item .Item ;
18
19
import net .minecraft .item .ItemStack ;
19
20
import net .minecraft .util .ChatComponentText ;
20
- import net .minecraft .util .ChunkCoordinates ;
21
21
import net .minecraft .util .Vec3 ;
22
22
import net .minecraft .world .World ;
23
23
import net .minecraftforge .common .MinecraftForge ;
24
- import net .minecraftforge .event .entity .player .PlayerEvent ;
25
24
import org .lwjgl .input .Keyboard ;
26
25
26
+ import java .util .*;
27
+
27
28
/**
28
29
* Created by recursiveg on 14-9-28.
29
30
*/
30
31
31
- @ Mod (modid ="autoharvest" , name ="Auto Harvest" , version ="0.1-dev" )
32
+ @ Mod (modid ="autoharvest" , name ="Auto Harvest Mod " , version ="0.1-dev" )
32
33
public class AutoHarvest {
33
34
private boolean enabled =false ;
34
35
private boolean harvestTick =true ;
35
- private KeyBinding toggleKey =new KeyBinding ("Toggle Status" , Keyboard .KEY_H ,"Auto Harvest Mod" );
36
- private static int [] delta ={-1 ,0 ,1 };
36
+ private KeyBinding toggleKey =new KeyBinding ("Toggle Enabled/Disabled" , Keyboard .KEY_H ,"Auto Harvest Mod" );
37
+ private static int harvestRange =1 ;
38
+ private static PlayerControllerMP controller =null ;
39
+ private static final Set <Integer > grassBlockIds =new HashSet <Integer >(Arrays .asList (new Integer []{
40
+ 6 ,31 ,32 ,37 ,38 ,39 ,40 ,175
41
+ }));
42
+ private static final Set <Item > plantableItems =new HashSet <Item >(){{
43
+ add (Items .wheat_seeds );
44
+ add (Items .carrot );
45
+ add (Items .potato );
46
+ add (Items .poisonous_potato );
47
+ add (Items .melon_seeds );
48
+ add (Items .pumpkin_seeds );
49
+ }};
50
+ private static final Map <Class <?>,Item > harvestMap =new HashMap <Class <?>,Item >(){{
51
+ put (BlockCrops .class ,Items .wheat_seeds );
52
+ put (BlockCarrot .class ,Items .carrot );
53
+ put (BlockPotato .class ,Items .potato );
54
+ put (BlockNetherWart .class ,Items .nether_wart );
55
+ }};
56
+ private static final Map <Class <?>,Integer > cropMatureData =new HashMap <Class <?>, Integer >(){{
57
+ put (BlockCrops .class ,7 );
58
+ put (BlockCarrot .class ,7 );
59
+ put (BlockPotato .class ,7 );
60
+ put (BlockNetherWart .class ,3 );
61
+ }};
62
+
37
63
38
64
@ Mod .EventHandler
39
65
public void load (FMLInitializationEvent event ) {
@@ -42,91 +68,102 @@ public void load(FMLInitializationEvent event) {
42
68
FMLCommonHandler .instance ().bus ().register (this );
43
69
}
44
70
71
+ private void sendPlayerPrivateMsg (String str ){
72
+ FMLClientHandler .instance ().getClient ().thePlayer .addChatMessage (new ChatComponentText (str ));
73
+ }
45
74
@ SubscribeEvent
46
75
public void onToggle (InputEvent .KeyInputEvent e ){
47
76
if (toggleKey .isPressed ()){
48
- //off->harvest->plant
49
- /*if(!enabled){
50
- enabled=true;
51
- harvestTick=true;
52
- FMLClientHandler.instance().getClient().thePlayer.addChatMessage(new ChatComponentText("[Auto Harvest] Current Mode: Harvest"));
53
- }else if(enabled&&harvestTick){
54
- harvestTick=false;
55
- FMLClientHandler.instance().getClient().thePlayer.addChatMessage(new ChatComponentText("[Auto Harvest] Current Mode: Plant"));
56
- }else{
57
- enabled=false;
58
- FMLClientHandler.instance().getClient().thePlayer.addChatMessage(new ChatComponentText("[Auto Harvest] Current Mode: OFF"));
59
- }*/
60
77
if (!enabled ){
61
78
enabled =true ;
62
- FMLClientHandler .instance ().getClient ().thePlayer .addChatMessage (new ChatComponentText ("[Auto Harvest] Current Mode: ON" ));
79
+ controller =FMLClientHandler .instance ().getClient ().playerController ;
80
+ sendPlayerPrivateMsg ("[Auto Harvest] Enabled" );
63
81
}else {
64
82
enabled =false ;
65
- FMLClientHandler . instance (). getClient (). thePlayer . addChatMessage ( new ChatComponentText ( "[Auto Harvest] Current Mode: OFF" ) );
83
+ sendPlayerPrivateMsg ( "[Auto Harvest] Disabled" );
66
84
}
67
85
}
68
86
}
69
87
70
88
@ SubscribeEvent
71
- public void onTick (TickEvent .PlayerTickEvent e ){
89
+ public void onInGameTick (TickEvent .PlayerTickEvent e ){//one block a tick
72
90
if (enabled && e .side ==Side .CLIENT && e .player !=null ){
73
- harvestTick =!harvestTick ;
74
- if (harvestTick )
75
- doHarvest (e .player );
76
- else
77
- doPlant (e .player );
91
+ if (e .player .inventory .getCurrentItem ()==null ){
92
+ doClearGrass (e .player );
93
+ }else {
94
+ if (harvestTick )
95
+ doHarvest (e .player );
96
+ else
97
+ doPlant (e .player );
98
+ harvestTick =!harvestTick ;
99
+ }
78
100
}
79
101
}
80
102
103
+ private void doClearGrass (EntityPlayer p ){
104
+ World w =p .worldObj ;
105
+ int X =(int )Math .floor (p .posX );
106
+ int Y =(int )Math .floor (p .posY -1.61 );//the "leg block"
107
+ int Z =(int )Math .floor (p .posZ );
108
+ for (int deltaY =-1 ;deltaY <=1 ;++deltaY )
109
+ for (int deltaX =-2 ;deltaX <=2 ;++deltaX )
110
+ for (int deltaZ =-2 ;deltaZ <=2 ;++deltaZ )
111
+ if (canClearGrass (w ,X + deltaX , Y +deltaY , Z + deltaZ )){
112
+ controller .onPlayerDamageBlock (X + deltaX , Y +deltaY , Z + deltaZ , 1 );
113
+ return ;
114
+ }
115
+ }
116
+
81
117
private void doHarvest (EntityPlayer p ){
82
118
World w =p .worldObj ;
83
119
int X =(int )Math .floor (p .posX );
84
- int Y =(int )Math .floor (p .posY -1.61 );
120
+ int Y =(int )Math .floor (p .posY -1.61 );//the "leg block"
85
121
int Z =(int )Math .floor (p .posZ );
86
- for (int deltaX : delta )
87
- for (int deltaZ : delta ){
88
- if (canHarvest (w ,X +deltaX ,Y ,Z +deltaZ )) {
89
- FMLClientHandler . instance (). getClient (). playerController .onPlayerDamageBlock (X + deltaX , Y , Z + deltaZ , 1 );
122
+ for (int deltaX =- harvestRange ; deltaX <= harvestRange ;++ deltaX )
123
+ for (int deltaZ =- harvestRange ; deltaZ <= harvestRange ;++ deltaZ ){
124
+ if (canHarvest (w ,p , X +deltaX ,Y ,Z +deltaZ )) {
125
+ controller .onPlayerDamageBlock (X + deltaX , Y , Z + deltaZ , 1 );
90
126
return ;
91
127
}
92
128
}
93
129
}
94
130
95
- private boolean canHarvest (World w ,int X ,int Y ,int Z ){
96
- return (w .getBlock (X ,Y ,Z )instanceof BlockCrops &&w .getBlockMetadata (X ,Y ,Z )==7 );
97
- }
98
-
99
131
private void doPlant (EntityPlayer p ){
100
132
World w =p .worldObj ;
101
133
int X =(int )Math .floor (p .posX );
102
- int Y =(int )Math .floor (p .posY -1 .61 );
134
+ int Y =(int )Math .floor (p .posY -2 .61 ); //Block player stand on ;
103
135
int Z =(int )Math .floor (p .posZ );
104
-
105
- Y =Y -1 ;
106
- for (int deltaX :delta )
107
- for (int deltaZ :delta ){
108
- if (canPlantOn (w , X + deltaX , Y , Z + deltaZ )) {
109
- ItemStack seed =selectSeed (p );
110
- if (seed !=null )
111
- FMLClientHandler .instance ().getClient ().playerController .onPlayerRightClick (p ,w ,seed ,X + deltaX , Y , Z + deltaZ ,1 ,
136
+ for (int deltaX =-harvestRange ;deltaX <=harvestRange ;++deltaX )
137
+ for (int deltaZ =-harvestRange ;deltaZ <=harvestRange ;++deltaZ ){
138
+ if (canPlantOn (w , p ,X + deltaX , Y , Z + deltaZ )) {
139
+ ItemStack seed =FMLClientHandler .instance ().getClient ().thePlayer .inventory .getCurrentItem ();
140
+ controller .onPlayerRightClick (p ,w ,seed ,X + deltaX , Y , Z + deltaZ ,1 ,
112
141
Vec3 .createVectorHelper (X + deltaX +0.5 , Y +1 , Z + deltaZ +0.5 ));
113
- else {
114
- //System.out.println("seed==null");
115
- }
116
142
return ;
117
143
}
118
144
}
119
145
}
120
146
121
- private boolean canPlantOn (World w ,int X ,int Y ,int Z ){
122
- return (w .getBlock (X ,Y ,Z ) instanceof BlockFarmland )&&(w .getBlock (X ,Y +1 ,Z )instanceof BlockAir );
147
+ private boolean canClearGrass (World w ,int X ,int Y ,int Z ){
148
+ return grassBlockIds .contains (Block .getIdFromBlock (w .getBlock (X , Y , Z )));
149
+ }
150
+
151
+ private boolean canHarvest (World w ,EntityPlayer p ,int X ,int Y ,int Z ){
152
+ Class <?> c =w .getBlock (X , Y , Z ).getClass ();
153
+ return harvestMap .containsKey (c )&&harvestMap .get (c )==p .inventory .getCurrentItem ().getItem ()&&CropGrown (w ,X ,Y ,Z ,c );
154
+ }
155
+
156
+ private boolean CropGrown (World w ,int X ,int Y ,int Z ,Class <?> cropClass ){
157
+ int meta =w .getBlockMetadata (X ,Y ,Z );
158
+ return cropMatureData .get (cropClass )==meta ;
123
159
}
124
160
125
- private ItemStack selectSeed (EntityPlayer p ){
126
- if (p ==null ||p .inventory ==null ||p .inventory .getCurrentItem ()==null )return null ;
127
- if (p .inventory .getCurrentItem ().getItem () instanceof ItemSeeds )
128
- return p .inventory .getCurrentItem ();
129
- else
130
- return null ;
161
+ private boolean canPlantOn (World w ,EntityPlayer p ,int X ,int Y ,int Z ){
162
+ Item i =p .inventory .getCurrentItem ().getItem ();
163
+ boolean haveSpace =w .getBlock (X ,Y +1 ,Z )instanceof BlockAir ;
164
+ boolean isFarm =w .getBlock (X ,Y ,Z ) instanceof BlockFarmland ;
165
+ boolean CropOnFarm =plantableItems .contains (i );
166
+ boolean nether_wart =(w .getBlock (X ,Y ,Z ) instanceof BlockSoulSand )&&(i ==Items .nether_wart );
167
+ return haveSpace &&(nether_wart ||(isFarm &&CropOnFarm ));
131
168
}
132
169
}
0 commit comments