package silentium.gameserver.instancemanager;
import java.util.Map;
import javolution.text.TextBuilder;
import javolution.util.FastMap;
import silentium.gameserver.ThreadPoolManager;
import silentium.gameserver.data.html.StaticHtmPath;
import silentium.gameserver.model.actor.instance.L2PcInstance;
import silentium.gameserver.network.serverpackets.NpcHtmlMessage;
import silentium.gameserver.network.serverpackets.SpecialCamera;
/**
* @author KKnD
*/
public class MovieMakerManager
{
protected Map<Integer, Sequence> _sequence = new FastMap<>();
public static final MovieMakerManager getInstance()
{
return SingletonHolder._instance;
}
protected class Sequence
{
protected int _sequenceId;
protected int _objid;
protected int _dist;
protected int _yaw;
protected int _pitch;
protected int _time;
protected int _duration;
protected int _turn;
protected int _rise;
protected int _widescreen;
}
public void mainHtm(L2PcInstance player)
{
NpcHtmlMessage html = new NpcHtmlMessage(5);
if (!_sequence.isEmpty())
{
TextBuilder sb = new TextBuilder();
for (Sequence s : _sequence.values())
sb.append("<tr><td>Id: ").append(s._sequenceId).append("</td></tr>");
html.setFile(StaticHtmPath.AdminHtmPath + "movie/main_notempty.htm", player);
html.replace("%sequences%", sb.toString());
}
else
html.setFile(StaticHtmPath.AdminHtmPath + "movie/main_empty.htm", player);
player.sendPacket(html);
}
public void playSequence(int id, L2PcInstance player)
{
if (_sequence.containsKey(id))
{
Sequence s = new Sequence();
s = _sequence.get(id);
player.sendPacket(new SpecialCamera(s._objid, s._dist, s._yaw, s._pitch, s._time, s._duration, s._turn, s._rise, s._widescreen, 0));
}
else
{
player.sendMessage("Wrong sequence id.");
mainHtm(player);
}
}
public void broadcastSequence(int id, L2PcInstance player)
{
if (_sequence.containsKey(id))
{
Sequence s = new Sequence();
s = _sequence.get(id);
player.broadcastPacket(new SpecialCamera(s._objid, s._dist, s._yaw, s._pitch, s._time, s._duration, s._turn, s._rise, s._widescreen, 0));
}
else
{
player.sendMessage("Wrong sequence id.");
mainHtm(player);
}
}
public void playSequence(L2PcInstance player, int objid, int dist, int yaw, int pitch, int time, int duration, int turn, int rise, int screen)
{
player.sendPacket(new SpecialCamera(objid, dist, yaw, pitch, time, duration, turn, rise, screen, 0));
}
public void addSequence(L2PcInstance player, int seqId, int objid, int dist, int yaw, int pitch, int time, int duration, int turn, int rise, int screen)
{
if (!_sequence.containsKey(seqId))
{
Sequence s = new Sequence();
s._sequenceId = seqId;
s._objid = objid;
s._dist = dist;
s._yaw = yaw;
s._pitch = pitch;
s._time = time;
s._duration = duration;
s._turn = turn;
s._rise = rise;
s._widescreen = screen;
_sequence.put(seqId, s);
mainHtm(player);
}
else
{
player.sendMessage("This sequence already exists.");
mainHtm(player);
}
}
public void addSequence(L2PcInstance player)
{
NpcHtmlMessage html = new NpcHtmlMessage(5);
html.setFile(StaticHtmPath.AdminHtmPath + "movie/add_sequence.htm", player);
player.sendPacket(html);
}
public void editSequence(int id, L2PcInstance player)
{
if (_sequence.containsKey(id))
{
Sequence s = new Sequence();
s = _sequence.get(id);
NpcHtmlMessage html = new NpcHtmlMessage(5);
html.setFile(StaticHtmPath.AdminHtmPath + "movie/edit_sequence.htm", player);
html.replace("%sId%", String.valueOf(s._sequenceId));
html.replace("%sDist%", String.valueOf(s._dist));
html.replace("%sYaw%", String.valueOf(s._yaw));
html.replace("%sPitch%", String.valueOf(s._pitch));
html.replace("%sTime%", String.valueOf(s._time));
html.replace("%sDuration%", String.valueOf(s._duration));
html.replace("%sTurn%", String.valueOf(s._turn));
html.replace("%sRise%", String.valueOf(s._rise));
html.replace("%sWidescreen%", String.valueOf(s._widescreen));
player.sendPacket(html);
}
else
{
player.sendMessage("The sequence couldn't be updated.");
mainHtm(player);
}
}
public void updateSequence(L2PcInstance player, int seqId, int objid, int dist, int yaw, int pitch, int time, int duration, int turn, int rise, int screen)
{
if (_sequence.containsKey(seqId))
{
_sequence.remove(seqId);
Sequence s = new Sequence();
s._sequenceId = seqId;
s._objid = objid;
s._dist = dist;
s._yaw = yaw;
s._pitch = pitch;
s._time = time;
s._duration = duration;
s._turn = turn;
s._rise = rise;
s._widescreen = screen;
_sequence.put(seqId, s);
}
else
player.sendMessage("This sequence doesn't exist.");
mainHtm(player);
}
public void deleteSequence(int id, L2PcInstance player)
{
if (_sequence.containsKey(id))
_sequence.remove(id);
else
player.sendMessage("This sequence id doesn't exist.");
mainHtm(player);
}
public void playMovie(int broadcast, L2PcInstance player)
{
if (!_sequence.isEmpty())
ThreadPoolManager.getInstance().scheduleGeneral(new Play(1, broadcast, player), 500);
else
{
player.sendMessage("There is nothing to play.");
mainHtm(player);
}
}
private class Play implements Runnable
{
private final int _id;
private final int _broad;
private final L2PcInstance _player;
public Play(int id, int broadcast, L2PcInstance player)
{
_id = id;
_broad = broadcast;
_player = player;
}
@Override
public void run()
{
int id = 0;
Sequence sec = new Sequence();
if (_sequence.containsKey(_id))
{
id = _id + 1;
sec = _sequence.get(_id);
if (_broad == 1)
_player.broadcastPacket(new SpecialCamera(sec._objid, sec._dist, sec._yaw, sec._pitch, sec._time, sec._duration, sec._turn, sec._rise, sec._widescreen, 0));
else
_player.sendPacket(new SpecialCamera(sec._objid, sec._dist, sec._yaw, sec._pitch, sec._time, sec._duration, sec._turn, sec._rise, sec._widescreen, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new Play(id, _broad, _player), (sec._duration - 100));
}
else
{
_player.sendMessage("Movie ended on sequence: " + (_id - 1) + ".");
mainHtm(_player);
}
}
}
private static class SingletonHolder
{
protected static final MovieMakerManager _instance = new MovieMakerManager();
}
}