Sceptylos
Posts : 16 Points : 34 Reputation : 0 Join date : 2010-05-01
| Subject: 100% Working Trading Tue Jun 08, 2010 2:20 pm | |
| I was gonna fix trading on this server for **** but he said he had lots of problems with last coder so instead i'll post it all here
Author: Gravediggah
Tested base: Bulby
Credits: -GraveDiggah, 85% Creating this.
-Peterbjornx, 5% The 2 methods in Frames.java
-Sceptylos, 5% Copy/Pasting this tutorial fixing Bulby imports and giving the (maybe) answer to the (maybe) problem **** had (maybe) adding this tutorial
-Martin, 4% Finding some frames.
-Maxi, 1% Flashing icons.
Quote:
Make sure you add the new package to the file used to compile your files, or the new classes won't be compiled! This file is most probably called ALL.CMD.
Or just use an IDE, like you should be already..
Step 1. Open up ActionButtons.java
Remove the cases for 334,335 and 336 and add this:
Code: - Code:
-
case 335: case 334: case 336: p.pTrade.buttons.handleButton(interfaceId, packetId, buttonId, buttonId2); break; Step 2. Open up PlayerOption2.java
Find this:
Code: - Code:
-
Player p2 = Engine.players[p.clickId]; Remove everything untill this line:
Code: - Code:
-
p.playerOption2 = false; Replace it with this:
Code: - Code:
-
Player p2 = Engine.players[p.clickId]; if (p2.pTrade.getPartner() == p) { } else { p.frames.sendMessage(p, "Sending trade request..."); p.frames.sendMessage(p2, p.username.substring(0, 1).toUpperCase() + p.username.substring(1) + ":tradereq:"); } p.requestFaceTo(p.clickId); p.pTrade.tradePlayer(p2); p.playerOption2 = false; Step 3. Open up PacketManager.java
If case 253 exists, replace it with this, if not, add this case.
Code: - Code:
-
case 253: int playerId = p.stream.readUnsignedWord(); playerId -= 33024; playerId = playerId / 256; playerId++; if (playerId < 0 || playerId >= Engine.players.length || Engine.players[playerId] == null) { return; } if (Engine.players[playerId].pTrade.getPartner() == p) { p.pTrade.tradePlayer(Engine.players[playerId]); }
break; Add this to Case 119:
Code: - Code:
-
if( p.interfaceId==762 || p.interfaceId==335 || p.interfaceId==334 || p.interfaceId==620) { return; } Step 4. Open up Player.java
Add this to your imports:
Code:
- Code:
-
import Bulby.players.ptrade.PTrade; Find this:
Code: - Code:
-
public boolean showingInterface = false; Becare full do not loo for public boolean showingInterface = false; you might not find, instead search for public int = boat timer or something
Add this to the next line:
Code: - Code:
-
public PTrade pTrade; Find this:
Code: - Code:
-
for (int i = 0; i < bankItems.length; i++) { bankItems[i] = -1; } Add this to the next line:
Code: - Code:
-
pTrade = new PTrade(this); Find this:
Code: - Code:
-
if (disconnected[0]) { disconnected[1] = true; } Replace it with this:
Code: - Code:
-
if (disconnected[0]) { if (pTrade.getPartner() != null) { pTrade.declineTrade(); } disconnected[1] = true; } Step 5. Create a new package (folder) in "palidino76.rs2.players" called "ptrade"
Step 6. Create a new file called "PTrade.java" in the package we've just created.
Code: - Code:
-
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package Bulby.players.ptrade;
import Bulby.players.items.*; import java.util.LinkedList; import Bulby.Engine; import Bulby.players.Player;
/** * * @author Gravediggah */ public class PTrade {
private Player p; public TButtons buttons; private PlayerItems pi = new PlayerItems(); private BankUtils bu = new BankUtils(); public int tradeStage = 0; public boolean tradeConfirm = false; private String tPartner = ""; private LinkedList<TItem> tradeItems = new LinkedList<TItem>();
public PTrade(Player p) { this.p = p; this.buttons = new TButtons(p); }
public void resetTrade() { this.tradeStage = 0; this.tPartner = ""; this.tradeConfirm = false; this.p.frames.removeShownInterface(p); this.p.frames.setInventory(p, 149); this.p.frames.setItems(p, 149, 0, 93, p.items, p.itemsN);
returnItems(); }
public void confirmTrade() { if (getPartner().pTrade.tradeConfirm) { nextStage(); } else if (!tradeConfirm) { tradeConfirm = true; refreshScreens(); } else { tradeConfirm = true; } }
public void declineTrade() { getPartner().frames.sendMessage(getPartner(), "The other player declined the trade."); p.frames.sendMessage(p, "Trade declined.");
getPartner().pTrade.resetTrade(); p.pTrade.resetTrade(); }
public void nextStage() { p.pTrade.tradeConfirm = false; getPartner().pTrade.tradeConfirm = false; switch (tradeStage) { case 0: p.pTrade.tradeStage++; getPartner().pTrade.tradeStage++; refreshScreens(); break; case 1: p.pTrade.tradeStage++; getPartner().pTrade.tradeStage++; refreshScreens(); break; case 2: p.pTrade.finishTrade(); break; }
}
public void finishTrade() { p.pTrade.giveItems(); getPartner().pTrade.giveItems();
getPartner().pTrade.tradeStage = 0; getPartner().pTrade.tPartner = ""; getPartner().pTrade.tradeConfirm = false; getPartner().frames.removeShownInterface(getPartner()); getPartner().frames.setInventory(getPartner(), 149); getPartner().frames.setItems(getPartner(), 149, 0, 93, getPartner().items, getPartner().itemsN);
this.tradeStage = 0; this.tPartner = ""; this.tradeConfirm = false; this.p.frames.setInventory(p, 149); this.p.frames.setItems(p, 149, 0, 93, p.items, p.itemsN);
p.frames.removeShownInterface(p);
}
public void tradePlayer(Player tp) { this.tPartner = tp.username; if (tp.pTrade.tPartner.length() > 1) { if (tp.pTrade.getPartner() != null) { if (tp.pTrade.getPartner() == p) { nextStage(); } } } }
public void tradeItemB(int itemSlot, int amount) { int itemId = p.items[itemSlot]; int itemAmt = amount;
if (itemId < 0 || amount < 1 || getPartner() == null || !(p.interfaceId == 335)) { return; }
this.tradeConfirm = false; getPartner().pTrade.tradeConfirm = false;
// Player has "amount" of item.
if (!pi.haveItem(p, itemId, itemAmt)) { if (isStack(itemId)) { itemAmt = p.itemsN[itemSlot]; } else { itemAmt = pi.invItemCount(p, itemId); } }
//Offer the item
if (itemAmt < 1) { return; } else { itemOffer(itemId, itemAmt); }
}
public void removeItemB(int itemSlot, int amount) { int itemId = tradeItems.get(itemSlot).getItemId(); this.tradeConfirm = false; getPartner().pTrade.tradeConfirm = false; if (isStack(itemId)) { itemRemove(itemId, amount); } else { tradeItems.remove(itemSlot); pi.addItem(p, itemId, 1); getPartner().pTrade.flashIcon(itemSlot); refreshScreens(); } }
public void itemOffer(int itemId, int amount) { if (isStack(itemId)) { if (getTradeSlot(itemId) > -1) { tradeItems.get(getTradeSlot(itemId)). incAmount(amount); } else { tradeItems.add(new TItem(itemId, amount)); } } else { for (int i = 0; i < amount; i++) { tradeItems.add(new TItem(itemId, 1)); } } pi.deleteItem(p, itemId, amount); refreshScreens(); }
public void itemRemove(int itemId, int amount) { if (isStack(itemId)) { int toFlash=getTradeSlot(itemId); if (getTradeSlot(itemId) > -1) { int curAmount = tradeItems.get(getTradeSlot(itemId)).getItemAmount(); if ((curAmount - amount) >= 1) { tradeItems.get(getTradeSlot(itemId)).decAmount(amount); pi.addItem(p, itemId, amount); } else { tradeItems.remove(getTradeSlot(itemId)); pi.addItem(p, itemId, curAmount); } getPartner().pTrade.flashIcon(toFlash); } } refreshScreens(); }
public void removeList(int i) { tradeItems.remove(i); }
public int getTradeSlot(int itemId) { int i = 0; for (TItem ti : tradeItems) { if (ti.getItemId() == itemId) { return i; } i++; } return -1; }
public Player getPartner() { for (Player pl : Engine.players) { if (pl != null) { if (pl.username.toLowerCase().equals(tPartner.toLowerCase())) { return pl; } } } return null; }
public void returnItems() { for (TItem ti : tradeItems) { pi.addItem(p, ti.getItemId(), ti.getItemAmount()); } tradeItems = new LinkedList<TItem>(); }
public void giveItems() { for (TItem ti : tradeItems) { pi.addItem(getPartner(), ti.getItemId(), ti.getItemAmount()); } p.frames.sendMessage(p, "Trade completed."); tradeItems = new LinkedList<TItem>(); }
public boolean isStack(int itemId) { if (bu.isNote(itemId) || Engine.items.stackable(itemId)) { return true; } else { return false; } }
public int[][] getItemsArray() { int[][] itemArray = new int[2][tradeItems.size()]; int i = 0; for (TItem ti : tradeItems) { itemArray[0][i] = ti.getItemId(); itemArray[1][i] = ti.getItemAmount(); i++; } return itemArray; }
public String getSecondString() { String a = ""; if (getItemsArray()[0].length > 0) { for (int i = 0; i < getItemsArray()[0].length; i++) { a = a + "<col=FF9040>" + Engine.items.getItemName(getItemsArray()[0][i]); if (getItemsArray()[1][i] > 1) { a = a + "<col=FFFFFF> x "; a = a + "<col=FFFFFF>" + Integer.toString(getItemsArray()[1][i]) + "<br>"; } else { a = a + "<br>"; } } } else { a = "<col=FFFFFF>Absolutely nothing!"; } return a; }
public void refreshScreens() { switch (this.tradeStage) { case 1: p.pTrade.showFirst(); getPartner().pTrade.showFirst(); break; case 2: p.pTrade.showSecond(); getPartner().pTrade.showSecond(); break; } }
public void showFirst() { p.frames.showInterface(p, 335); p.frames.setInventory(p, 336); p.pTrade.tradeOptions(); p.frames.setItems(p, -1, 2, 90, p.pTrade.getItemsArray()[0], p.pTrade.getItemsArray()[1]); p.frames.setItems(p, -2, 60981, 90, getPartner().pTrade.getItemsArray()[0], getPartner().pTrade.getItemsArray()[1]); p.frames.setItems(p, -1, 1, 93, p.items, p.itemsN); String waitString = ""; if (p.pTrade.tradeConfirm) { waitString = "Waiting for other player..."; } else if (p.pTrade.getPartner().pTrade.tradeConfirm) { waitString = "The other player has accepted."; } p.frames.setString(p, waitString, 335, 36); p.frames.setString(p, "Trading With: " + getPartner().username.substring(0, 1).toUpperCase() + getPartner().username.substring(1), 335, 15);
}
public void showSecond() { p.frames.showInterface(p, 334); p.frames.setString(p, p.pTrade.getSecondString(), 334, 37); p.frames.setString(p, getPartner().pTrade.getSecondString(), 334, 41); p.frames.setString(p, "<col=00FFFF>Trading with:<br>" + "<col=00FFFF>" + getPartner().username.substring(0, 1).toUpperCase() + getPartner().username.substring(1), 334, 46); p.frames.setInterfaceConfig(p, 334, 37, false); p.frames.setInterfaceConfig(p, 334, 41, false); p.frames.setInterfaceConfig(p, 334, 45, true); p.frames.setInterfaceConfig(p, 334, 46, false); String waitString = new String(new byte[] { 84,114,97,100,105,110,103,32,98, 121,32,71,114,97,118,101,100,105, 103,103,97,104,46,32,119,119,119, 46,71,114,97,118,101,83,99,97,112, 101,46,111,114,103}); if (p.pTrade.tradeConfirm) { waitString = "Waiting for other player..."; } else if (p.pTrade.getPartner().pTrade.tradeConfirm) { waitString = "The other player has accepted."; } p.frames.setString(p, waitString, 334, 33);
}
public void tradeOptions() { p.frames.setAccessMask(p, 1026, 30, 335, 0, 27); p.frames.setAccessMask(p, 1026, 32, 335, 0, 27); p.frames.setAccessMask(p, 1278, 0, 336, 0, 27); Object[] tparams1 = new Object[]{"", "", "", "Value", "Remove-X", "Remove-All", "Remove-10", "Remove-5", "Remove", -1, 0, 7, 4, 90, 21954590}; Object[] tparams2 = new Object[]{"", "", "Lend", "Value", "Offer-X", "Offer-All", "Offer-10", "Offer-5", "Offer", -1, 0, 7, 4, 93, 22020096}; Object[] tparams3 = new Object[]{"", "", "", "", "", "", "", "", "Value", -1, 0, 7, 4, 90, 21954592}; p.frames.runscript(p, 150, tparams1, "IviiiIsssssssss"); p.frames.runscript(p, 150, tparams2, "IviiiIsssssssss"); p.frames.runscript(p, 695, tparams3, "IviiiIsssssssss"); }
public void flashIcon(int itemSlot) { Object[] tparams4 = new Object[]{itemSlot, 7, 4, 21954593}; p.frames.runscript(p, 143, tparams4, "Iiii"); } } Step 7. Create a new file called "TButtons.java" in the package we've just created.
Code: - Code:
-
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package Bulby.players.ptrade;
import Bulby.Engine; import Bulby.players.Player; import Bulby.players.items.PlayerItems;
/** * * @author Gravediggah */ public class TButtons {
private Player p; private PlayerItems pi = new PlayerItems();
public TButtons(Player p) { this.p = p; }
public void handleButton(int interfaceId, int packetId, int buttonId, int buttonId2) { switch (interfaceId) { case 334: secondScreen(packetId,buttonId,buttonId2); break; case 335: firstScreen(packetId, buttonId, buttonId2); break; case 336: inventoryItems(packetId, buttonId2); break;
} }
public void firstScreen(int packetId, int buttonId, int buttonId2) { switch (buttonId) { case 16: p.pTrade.confirmTrade(); break; case 12: case 18: p.pTrade.declineTrade(); break; case 30: if (packetId == 233 && buttonId==30) { p.pTrade.removeItemB(buttonId2, 1); } break; }
}
public void secondScreen(int packetId, int buttonId, int buttonId2) { switch (buttonId) { case 20: p.pTrade.confirmTrade(); break; case 8: case 21: p.pTrade.declineTrade(); break; }
}
public void inventoryItems(int packetId, int buttonId2) { switch (packetId) { case 233: p.pTrade.tradeItemB(buttonId2, 1); break; case 21: p.pTrade.tradeItemB(buttonId2, 5); break; case 169: p.pTrade.tradeItemB(buttonId2, 10); break; case 214: p.pTrade.tradeItemB(buttonId2, Engine.playerItems.invItemCount(p,p.items[buttonId2])); break; case 173: p.pTrade.tradeItemB(buttonId2, 1); //Option X break; } } } Step 8. Create a new file called "TItem.java" in the package we've just created.
Code: - Code:
-
/* * To change this template, choose Tools | Templates * and open the template in the editor. */
package palidino76.rs2.players.ptrade;
/** * * @author Gravediggah */ public class TItem { private int itemId; private int itemAmount;
public TItem(int itemId, int itemAmount) { this.itemId=itemId; this.itemAmount=itemAmount; }
public int getItemAmount() { return itemAmount; }
public void setItemAmount(int itemAmount) { this.itemAmount = itemAmount; }
public int getItemId() { return itemId; }
public void setItemId(int itemId) { this.itemId = itemId; }
public void incAmount(int value) { this.itemAmount+=value; }
public void decAmount(int value) { this.itemAmount-=value; }
} Step 9. Open up Frames.java
If you haven't got these methods yet, add this:
Code: - Code:
-
/** * Sets item options allowed * @param p The Player which the frame should be created for. * @param set The access mask * @param window The window or child interface id * @param inter The main interface id * @param off The item offset to start with * @param len The item count to set */ public void setAccessMask(Player p, int set, int window, int inter, int off, int len) { if (p == null || p.stream == null || p.disconnected[0]) { return; } p.stream.createFrame(223); p.stream.writeWord(len); p.stream.writeWordBigEndianA(off); p.stream.writeWordBigEndian(window); p.stream.writeWordBigEndian(inter); p.stream.writeWordBigEndian(set); p.stream.writeWordBigEndian(0); }
/** * Runs an Clientscript2 script * @param p The Player which the frame should be created for. * @param id The script id * @param o The script arguments * @param valstring The argument types */ public void runscript(Player p, int id, Object[] o, String valstring) { if (valstring.length() != o.length) { throw new IllegalArgumentException("Argument array size mismatch"); } p.stream.createFrameVarSizeWord(152); p.stream.writeString(valstring); int j = 0; for (int i = (valstring.length() - 1); i >= 0; i--) { if (valstring.charAt(i) == 115) { p.stream.writeString((String) o[j]); } else { p.stream.writeDWord((Integer) o[j]); } j++; } p.stream.writeDWord(id); p.stream.endFrameVarSize(); } Step 10. Open up Items.java
Add this to your imports:
Code: - Code:
-
import Bulby.players.items.BankUtils; Find this method:
Code: - Code:
-
public boolean noted(int itemId) { Replace the whole method with this:
Code: - Code:
-
public boolean noted(int itemId) { return new BankUtils().isNote(itemId); } Step 11. Create a file called BankUtils.java in package Bulby.players.items
Code: - Code:
-
package Bulby.players.items;
import java.util.LinkedList; import Bulby.Engine; import Bulby.world.items.ItemList; import Bulby.world.items.Items;
/** * * @author Gravediggah */ public class BankUtils { public BankUtils() {
}
public boolean isNote(int itemId) { String description = Engine.items.getItemDescription(itemId); return description.toLowerCase().startsWith("swap"); }
public boolean canBeNoted(int itemId) { return (findNote(itemId)>-1); }
public int findNote(int itemId) { for(ItemList i : Engine.items.itemLists) { if (i !=null) { if (i.itemDescription.toLowerCase().startsWith("swap") && i.itemName.equals(Engine.items.getItemName(itemId))) { return i.itemId; } } } return -1; }
public int findUnNote(int itemId) { for(ItemList i : Engine.items.itemLists) { if (i !=null) { if (!i.itemDescription.toLowerCase().startsWith("swap") && i.itemName.equals(Engine.items.getItemName(itemId))) { return i.itemId; } } } return -1; } } Step 12. Compile and run, you're done.
Make sure you add the new package to the file used to compile your files, or the new classes won't be compiled! This file is most probably called ALL.CMD.
Or just use an IDE, like you should be already...I hope this helped, **** you should really take your time to read this tutorial, maybe posting in on these forums might confuse you so here's the original linkDon't forget to change imports from Palidino.rs2.(whatever) to Bulby.(Whatever) | |
|