Display Model Packet
317:
Code:
package org.apollo.game.release.r317;
import org.apollo.game.message.impl.SetWidgetModelMessage;
import org.apollo.net.codec.game.DataOrder;
import org.apollo.net.codec.game.DataTransformation;
import org.apollo.net.codec.game.DataType;
import org.apollo.net.codec.game.GamePacket;
import org.apollo.net.codec.game.GamePacketBuilder;
import org.apollo.net.release.MessageEncoder;
/**
* A {@link MessageEncoder} for the {@link SetWidgetModelMessage}.
*
* @author Shamon King
*/
public final class SetWidgetModelMessageEncoder extends MessageEncoder<SetWidgetModelMessage> {
@Override
public GamePacket encode(SetWidgetModelMessage message) {
GamePacketBuilder builder = new GamePacketBuilder(8);
builder.put(DataType.SHORT, DataOrder.LITTLE, DataTransformation.ADD, message.getInterfaceId());
builder.put(DataType.SHORT, message.getModelId());
return builder.toGamePacket();
}
}
377:
Code:
package org.apollo.game.release.r377;
import org.apollo.game.message.impl.SetWidgetModelMessage;
import org.apollo.net.codec.game.DataOrder;
import org.apollo.net.codec.game.DataTransformation;
import org.apollo.net.codec.game.DataType;
import org.apollo.net.codec.game.GamePacket;
import org.apollo.net.codec.game.GamePacketBuilder;
import org.apollo.net.release.MessageEncoder;
/**
* A {@link MessageEncoder} for the {@link SetWidgetModelMessage}.
*
* @author Shamon King
*/
public final class SetWidgetModelMessageEncoder extends MessageEncoder<SetWidgetModelMessage> {
@Override
public GamePacket encode(SetWidgetModelMessage message) {
GamePacketBuilder builder = new GamePacketBuilder(216);
builder.put(DataType.SHORT, DataOrder.LITTLE, DataTransformation.ADD, message.getModelId());
builder.put(DataType.SHORT, DataOrder.LITTLE, DataTransformation.ADD, message.getInterfaceId());
return builder.toGamePacket();
}
}
Code:
package org.apollo.game.message.impl;
import org.apollo.net.message.Message;
/**
* A {@link Message} sent to the client to set a widget's displayed model.
*
* @author Shamon king
*/
public final class SetWidgetModelMessage extends Message {
/**
* The interface's id.
*/
private final int interfaceId;
/**
* The model's id.
*/
private final int modelId;
/**
* Creates a new set interface model message.
*
* @param interfaceId The interface's id.
* @param modelId The model's id.
*/
public SetWidgetModelMessage(int interfaceId, int modelId) {
this.interfaceId = interfaceId;
this.modelId = modelId;
}
/**
* Gets the interface's id.
*
* @return The id.
*/
public int getInterfaceId() {
return interfaceId;
}
/**
* Gets the model's id.
*
* @return The id.
*/
public int getModelId() {
return modelId;
}
}
Register it
Code:
register(SetWidgetModelMessage.class, new SetWidgetModelMessageEncoder());
Ya I know should be in ruby, but the majority of the userbase doesn't use apollo so this is more useful.
Code:
package org.apollo.game.model.content;
public enum BarrowsPuzzle {
ARROWS(6713, new int[] { 6716, 6717, 6718 }, new int[] { 6713, 6714, 6715 }),
SQUARES(6719, new int[] { 6722, 6723, 6724 }, new int[] { 6719, 6720, 6721 }),
SQUARES_OFFSET(6725, new int[] { 6728, 6729, 6730 }, new int[] { 6725, 6726, 6727 }),
SHAPES(6731, new int[] { 6734, 6735, 6736 }, new int[] { 6731, 6732, 6733 });
/**
* The answer to the barrows puzzle.
*/
private final int answer;
/**
* The initial puzzle sequence.
*/
private final int[] sequence;
/**
* The options to finish the sequence.
*/
private final int[] options;
/**
* Creates a new barrow puzzle.
*
* @param answer
* The answer to the barrows puzzle.
* @param sequence
* The initial puzzle sequence.
* @param options
* The options to finish the sequence.
*/
private BarrowsPuzzle(int answer, int[] sequence, int[] options) {
this.answer = answer;
this.sequence = sequence;
this.options = options;
}
public int getAnswer() {
return answer;
}
public int getSequenceModel(int index) {
return sequence[index];
}
public int[] getSequence() {
return sequence;
}
public int[] getOptions() {
return options;
}
}
Code:
package org.apollo.game.model.content;
import org.apollo.game.message.impl.SetWidgetModelMessage;
import org.apollo.game.model.entity.Player;
public class BarrowsPuzzleDisplay {
/**
* Buttons.
*/
private static final int FIRST_OPTION_BUTTON = 4550;
private static final int SECOND_OPTION_BUTTON = 4551;
private static final int THIRD_OPTION_BUTTON = 4552;
/**
* Main interface.
*/
private static final int BARROWS_PUZZLE_INTERFACE = 4543;
/**
* Model childs.
*/
private static final int SEQUENCE_CHILD_START = 4545;
private static final int OPTIONS_CHILD_START = 4550;
/**
* The puzzle being displayed.
*/
private final BarrowsPuzzle puzzle;
/**
* The current shuffled options.
*/
private final int[] shuffledOptions;
/**
* Create a new instanfe of a puzzle.
*
* @param puzzle
* The puzzle to display.
*/
public BarrowsPuzzleDisplay(BarrowsPuzzle puzzle) {
this.puzzle = puzzle;
this.shuffledOptions = Util.shuffleIntArray(puzzle.getOptions());
}
/**
* Display the puzzle interface with random options.
*
* @param player
* The instance of the player.
*/
public void displayInterface(Player player) {
for (int i = 0; i < 3; i++) {
int sequenceModel = puzzle.getSequenceModel(i);
player.send(new SetWidgetModelMessage(SEQUENCE_CHILD_START + i, sequenceModel));
int optionModel = shuffledOptions[i];
player.send(new SetWidgetModelMessage(OPTIONS_CHILD_START + i, optionModel));
}
player.getInterfaceSet().openWindow(BARROWS_PUZZLE_INTERFACE);
}
/**
* @param buttonClicked
* The button clicked on puzzle interface.
*
* @return true if the button clicked is the correct shape.
*/
public boolean checkCorrectAnswer(int buttonClicked) {
int index = buttonClicked - FIRST_OPTION_BUTTON;
int model = shuffledOptions[index];
return model == puzzle.getAnswer();
}
}
Integer shuffle method.
Code:
import java.util.Random;
public class Util {
private static final Random random = new Random();
public static int[] shuffleIntArray(int[] array) {
int[] shuffledArray = new int[array.length];
System.arraycopy(array, 0, shuffledArray, 0, array.length);
for (int i = shuffledArray.length - 1; i > 0; i--) {
int index = random.nextInt(i + 1);
int a = shuffledArray[index];
shuffledArray[index] = shuffledArray[i];
shuffledArray[i] = a;
}
return shuffledArray;
}
}
Ruby implementation
Code:
BARROWS_PUZZELS = {}
class BarrowsPuzzle
attr_reader :answer, :sequence, :options
def initialize(answer, sequence, options)
@answer = answer
@sequence = sequence
@options = options
end
end
def create_puzzle(name, hash)
unless hash.has_keys?(:answer, :sequence, :options)
fail 'Hash must have answer, sequence, and options keys.'
end
puzzle = BarrowsPuzzle.new hash[:answer], hash[:sequence], hash[:options]
BARROWS_PUZZELS[name] = puzzle
end
create_puzzle :arrows, answer: 6713, sequence: [6716, 6717, 6718], options: [6713, 6714, 6715]
create_puzzle :squares, answer: 6719, sequence: [6722, 6723, 6724], options: [6719, 6720, 6721]
create_puzzle :squares_offset, answer: 6725, sequence: [6728, 6729, 6730], options: [6725, 6726, 6727]
create_puzzle :shapes, answer: 6731, sequence: [6734, 6735, 6736], options: [6731, 6732, 6733]
Code:
# Buttons
FIRST_OPTION_BUTTON = 4550
SECOND_OPTION_BUTTON = 4551
THIRD_OPTION_BUTTON = 4552
# Main interface.
BARROWS_PUZZLE_INTERFACE = 4543
# Model childs.
SEQUENCE_CHILD_START = 4545
OPTIONS_CHILD_START = 4550
require 'java'
java_import 'org.apollo.game.message.impl.SetWidgetModelMessage'
class BarrowsPuzzleDisplay
attr_reader :puzzle, :shuffled_options
def initialize(name)
@puzzle = BARROWS_PUZZELS[name]
@shuffled_options = puzzle.options.shuffle
end
def display_interface(player)
(0..2).each do |n|
sequence_model = puzzle.sequence[n]
options_model = shuffled_options[n]
player.send SetWidgetModelMessage.new SEQUENCE_CHILD_START + n, sequence_model
player.send SetWidgetModelMessage.new OPTIONS_CHILD_START + n, options_model
end
player.interfaceSet.openWindow(BARROWS_PUZZLE_INTERFACE)
end
def check_answer(button)
index = button - FIRST_OPTION_BUTTON
shuffled_options[index] == puzzle.answer
end
end
on :command, :test, RIGHTS_ADMIN do |player, _command|
puzzle = BarrowsPuzzleDisplay.new :arrows
puzzle.display_interface player
end
def test(name)
puzzle = BarrowsPuzzleDisplay.new name
puts "Testing #{name}"
puts "#{puzzle.puzzle.answer}, #{puzzle.puzzle.sequence}, #{puzzle.shuffled_options}"
puts "Option 1: #{puzzle.check_answer FIRST_OPTION_BUTTON}, Option 2: #{puzzle.check_answer SECOND_OPTION_BUTTON}, Option 3: #{puzzle.check_answer THIRD_OPTION_BUTTON}"
puts ""
end
test(:arrows)
test(:arrows)
test(:shapes)
test(:squares)
test(:squares_offset)
Tudah. Now someone make me an awesome minigame!