These are just some things I saw unfinished and I think I could do. I'll be sure to code them with propper documentatioin, spacing and naming and all that.
Madman isn't answering his e-mail so I've got to bother you MuadDib.
Code: Select all
use uo;
include "include/PartySystem";
program PartySystem(ch, data)
var dataarray := SplitWords(data);
if (dataarray[1] = "ClientPacketbfSubcommand6")
if (dataarray[2] = "Subsubcommand1")
var pmserial := CInt(dataarray[3]);
AddPartyMember(ch, pmserial);
elseif (dataarray[2] = "Subsubcommand2")
var pmserial := CInt(dataarray[3]);
RemovePartyMember(ch, pmserial);
elseif (dataarray[2] = "Subsubcommand3")
var pmserial := CInt(dataarray[3]);
var startind := len(dataarray[1]) + len(dataarray[2]) + len(dataarray[3]) + 4;
SendMessageToPartyMember(ch, pmserial, data[startind, len(data)]);
elseif (dataarray[2] = "Subsubcommand4")
var startind := len(dataarray[1]) + len(dataarray[2]) + 3;
SendMessageToParty(ch, data[startind, len(data)]);
elseif (dataarray[2] = "Subsubcommand6")
var pcanloot := CInt(dataarray[3]);
if (GetObjProperty(ch, "parray"))
SetObjProperty(ch, "pcanloot", pcanloot);
if (pcanloot = 0)
SendSysMessage(ch, "Your party cannot loot your corpse.");
elseif (pcanloot = 1)
SendSysMessage(ch, "Your party can loot your corpse.");
endif
endif
elseif (dataarray[2] = "Subsubcommand8")
var plserial := CInt(dataarray[3]);
SetObjProperty(ch, "pinvitation", {plserial, "accepted"});
elseif (dataarray[2] = "Subsubcommand9")
var plserial := CInt(dataarray[3]);
SetObjProperty(ch, "pinvitation", {plserial, "declined"});
endif
endif
endprogram
Code: Select all
use os;
use uo;
include "include/SendPacket";
function AddPartyMember(ch, pmserial)
var pm := CheckPartyMember(ch, pmserial, 0);
if (pm != 0)
var pinvitation := InvitePartyMember(ch, pm);
if (pinvitation = "declined")
SendSysMessage(ch, pm.name +" has declined your offer.");
SendSysMessage(pm, "You have declined "+ ch.name +"'s offer.");
elseif (pinvitation = "accepted")
SendSysMessage(ch, pm.name +" has accepted your offer.");
SendSysMessage(pm, "You have accepted "+ ch.name +"'s offer.");
var parray := GetObjProperty(ch, "parray");
var parray2 := parray[2];
if (!parray)
SetObjProperty(ch, "parray", {ch.serial, {pm.serial}});
SetObjProperty(ch, "pcanloot", 1);
SendSysMessage(ch, "Your party can loot your corpse.");
SetObjProperty(pm, "pcanloot", 1);
SendSysMessage(pm, "Your party can loot your corpse.");
UpdateParty(ch, pm, 0);
SendSysMessage(pm, "You have joined the party.");
elseif (parray)
parray2.append(pm.serial);
parray := {parray[1], parray2};
SetObjProperty(ch, "parray", parray);
SetObjProperty(pm, "pcanloot", 1);
SendSysMessage(pm, "Your party can loot your corpse.");
UpdateParty(ch, pm, 0);
SendSysMessage(pm, "You have joined the party.");
endif
endif
endif
endfunction
function RemovePartyMember(ch, pmserial)
var pm := CheckPartyMember(ch, pmserial, 1);
if (pm != 0)
if (pm.serial != ch.serial)
var pmparray := GetObjProperty(pm, "parray");
var parray := ErasePartyMemberFromPartyArray(pm);
SetObjProperty(ch, "parray", parray);
UpdateParty(ch, pm, 1);
SendSysMessage(pm, "You have been removed from the party.");
parray := GetObjProperty(ch, "parray");
if (parray[2] = {})
DisbandParty(ch, pmparray);
endif
elseif (pm.serial = ch.serial)
var parray := GetObjProperty(ch, "parray");
if (parray[1] != ch.serial)
var pmparray := GetObjProperty(ch, "parray");
LeaveParty(ch);
parray := GetObjProperty(pmparray[1], "parray");
if (parray[2] = {})
DisbandParty(SystemFindObjectBySerial(parray[1], SYSFIND_SEARCH_OFFLINE_MOBILES), pmparray);
endif
elseif (parray[1] = ch.serial)
DisbandParty(ch, parray);
endif
endif
endif
endfunction
function LeaveParty(ch)
var parray := ErasePartyMemberFromPartyArray(ch);
SetObjProperty(parray[1], "parray", parray);
UpdateParty(SystemFindObjectBySerial(parray[1], SYSFIND_SEARCH_OFFLINE_MOBILES), ch, 1);
SendSysMessage(ch, "You have left the party.");
endfunction
function DisbandParty(ch, parray)
var parray2 := parray[2];
var PacketHexStringPart1 := "BF"+ ConvertIntToHex(15 + len(parray[2]) * 4, 2);
PacketHexStringPart1 := PacketHexStringPart1 + ConvertIntToHex(6, 2);
PacketHexStringPart1 := PacketHexStringPart1 + ConvertIntToHex(2, 1);
PacketHexStringPart1 := PacketHexStringPart1 + ConvertIntToHex(len(parray[2]) + 1, 1);
var PacketHexStringPart2 := ConvertIntToHex(ch.serial, 4);
foreach pmserial in parray2
PacketHexStringPart2 := PacketHexStringPart2 + ConvertIntToHex(pmserial, 4);
endforeach
var FullPacketHexString := PacketHexStringPart1 + ConvertIntToHex(ch.serial, 4) + PacketHexStringPart2;
EraseObjProperty(ch, "parray");
EraseObjProperty(ch, "pcanloot");
SendPacket(ch, FullPacketHexString);
SendSysMessage(ch, "Your party has disbanded.");
var pm;
foreach pmserial in parray2
pm := SystemFindObjectBySerial(pmserial, SYSFIND_SEARCH_OFFLINE_MOBILES);
FullPacketHexString := PacketHexStringPart1 + ConvertIntToHex(pmserial, 4) + PacketHexStringPart2;
EraseObjProperty(pm, "parray");
EraseObjProperty(pm, "pcanloot");
SendPacket(pm, FullPacketHexString);
SendSysMessage(pm, "Your party has disbanded.");
endforeach
endfunction
function ErasePartyMemberFromPartyArray(pm)
var parray := GetObjProperty(pm, "parray");
var parray2 := parray[2];
var parray2pmindex := 1;
while (parray2[parray2pmindex] != pm.serial)
parray2pmindex := parray2pmindex + 1;
endwhile
parray2.erase(parray2pmindex);
parray := {parray[1], parray2};
return parray;
endfunction
function UpdateParty(ch, pm, type)
var parray := GetObjProperty(ch, "parray");
var parray2 := parray[2];
if (type = 0)
var PacketHexString := "BF"+ ConvertIntToHex(11 + len(parray[2]) * 4, 2);
PacketHexString := PacketHexString + ConvertIntToHex(6, 2);
PacketHexString := PacketHexString + ConvertIntToHex(1, 1);
PacketHexString := PacketHexString + ConvertIntToHex(len(parray[2]) + 1, 1);
PacketHexString := PacketHexString + ConvertIntToHex(ch.serial, 4);
foreach pmserial in parray2
PacketHexString := PacketHexString + ConvertIntToHex(pmserial, 4);
endforeach
SendPacket(ch, PacketHexString);
SendSysMessage(ch, pm.name +" has joined the party.");
var pmname := pm.name;
var pmexcludeserial := pm.serial;
foreach pmserial in parray2
pm := SystemFindObjectBySerial(pmserial, SYSFIND_SEARCH_OFFLINE_MOBILES);
SetObjProperty(pm, "parray", parray);
SendPacket(pm, PacketHexString);
if (pmserial != pmexcludeserial)
SendSysMessage(pm, pmname +" has joined the party.");
endif
endforeach
elseif (type = 1)
var PacketHexString := "BF"+ ConvertIntToHex(15 + len(parray[2]) * 4, 2);
PacketHexString := PacketHexString + ConvertIntToHex(6, 2);
PacketHexString := PacketHexString + ConvertIntToHex(2, 1);
PacketHexString := PacketHexString + ConvertIntToHex(len(parray[2]) + 1, 1);
PacketHexString := PacketHexString + ConvertIntToHex(pm.serial, 4);
PacketHexString := PacketHexString + ConvertIntToHex(ch.serial, 4);
foreach pmserial in parray2
PacketHexString := PacketHexString + ConvertIntToHex(pmserial, 4);
endforeach
SendPacket(ch, PacketHexString);
SendSysMessage(ch, pm.name +" has left the party.");
var pmname := pm.name;
foreach pmserial in parray2
pm := SystemFindObjectBySerial(pmserial, SYSFIND_SEARCH_OFFLINE_MOBILES);
SetObjProperty(pm, "parray", parray);
SendPacket(pm, PacketHexString);
SendSysMessage(pm, pmname +" has left the party.");
endforeach
parray := GetObjProperty(pm, "parray");
parray2 := parray[2];
PacketHexString := "BF"+ ConvertIntToHex(15 + len(parray[2]) * 4, 2);
PacketHexString := PacketHexString + ConvertIntToHex(6, 2);
PacketHexString := PacketHexString + ConvertIntToHex(2, 1);
PacketHexString := PacketHexString + ConvertIntToHex(len(parray[2]) + 1, 1);
PacketHexString := PacketHexString + ConvertIntToHex(pm.serial, 4);
PacketHexString := PacketHexString + ConvertIntToHex(ch.serial, 4);
foreach pmserial in parray2
PacketHexString := PacketHexString + ConvertIntToHex(pmserial, 4);
endforeach
EraseObjProperty(pm, "parray");
EraseObjProperty(pm, "pcanloot");
SendPacket(pm, PacketHexString);
endif
endfunction
function InvitePartyMember(ch, pm)
SendSysMessage(ch, "You have invited "+ pm.name +" to join your party.");
SendSysMessage(pm, "You have been invited to join "+ ch.name +"'s party. Type \"/accept\" to join or \"/decline\" to decline the offer.");
var PacketHexString := "BF"+ ConvertIntToHex(14, 2);
PacketHexString := PacketHexString + ConvertIntToHex(6, 2);
PacketHexString := PacketHexString + ConvertIntToHex(7, 1);
PacketHexString := PacketHexString + ConvertIntToHex(ch.serial, 4);
PacketHexString := PacketHexString +"00000000";
EraseObjProperty(pm, "pinvitation");
SendPacket(pm, PacketHexString);
var pinvitationcounter := 0;
while ((!GetObjProperty(pm, "pinvitation")) and (pinvitationcounter < 10))
sleep(1);
pinvitationcounter := pinvitationcounter + 1;
endwhile
var pinvitation := GetObjProperty(pm, "pinvitation");
EraseObjProperty(pm, "pinvitation");
if (!pinvitation)
return "declined";
elseif (pinvitation)
if (pinvitation[1] = ch.serial)
return pinvitation[2];
else
return "declined";
endif
endif
endfunction
function CheckPartyMember(ch, pmserial, type)
if (type = 0)
if (pmserial != 0)
var parray := GetObjProperty(ch, "parray");
if (!parray)
var pm := SystemFindObjectBySerial(pmserial, SYSFIND_SEARCH_OFFLINE_MOBILES);
var pmparray := GetObjProperty(pm, "parray");
if (pm.serial != ch.serial)
if (!pmparray)
if ((!pm.npctemplate) and (pm.ip))
return pm;
elseif ((pm.npctemplate) or (!pm.ip))
SendSysMessage(ch, "You can only add online players to your party.");
return 0;
endif
elseif (pmparray)
SendSysMessage(ch, "This player has already joined a party.");
return 0;
endif
elseif (pm.serial = ch.serial)
SendSysMessage(ch, "Please choose another player.");
return 0;
endif
elseif (parray)
if (parray[1] != ch.serial)
SendSysMessage(ch, "Only the party leader can do this.");
return 0;
elseif (parray[1] = ch.serial)
if (len(parray[2]) < 9)
var pm := SystemFindObjectBySerial(pmserial, SYSFIND_SEARCH_OFFLINE_MOBILES);
var pmparray := GetObjProperty(pm, "parray");
if (pm.serial != ch.serial)
if (!pmparray)
if ((!pm.npctemplate) and (pm.ip))
return pm;
elseif ((pm.npctemplate) or (!pm.ip))
SendSysMessage(ch, "You can only add online players to your party.");
return 0;
endif
elseif (pmparray)
SendSysMessage(ch, "This player has already joined a party.");
return 0;
endif
elseif (pm.serial = ch.serial)
SendSysMessage(ch, "Please choose another player.");
return 0;
endif
elseif (len(parray[2]) = 9)
SendSysMessage(ch, "You can't add any more members to your party.");
return 0;
endif
endif
endif
elseif (pmserial = 0)
var parray := GetObjProperty(ch, "parray");
if (!parray)
SendSysMessage(ch, "Who would you like to add to your party?");
var pm := Target(ch);
if (!pm)
SendSysMessage(ch, "Targetting cancelled.");
return 0;
endif
var pmparray := GetObjProperty(pm, "parray");
if (pm.serial != ch.serial)
if (!pmparray)
if ((!pm.npctemplate) and (pm.ip))
return pm;
elseif ((pm.npctemplate) or (!pm.ip))
SendSysMessage(ch, "You can only add online players to your party.");
return 0;
endif
elseif (pmparray)
SendSysMessage(ch, "This player has already joined a party.");
return 0;
endif
elseif (pm.serial = ch.serial)
SendSysMessage(ch, "Please choose another player.");
return 0;
endif
elseif (parray)
if (parray[1] != ch.serial)
SendSysMessage(ch, "Only the party leader can do this.");
return 0;
elseif (parray[1] = ch.serial)
if (len(parray[2]) < 9)
SendSysMessage(ch, "Who would you like to add to your party?");
var pm := Target(ch);
if (!pm)
SendSysMessage(ch, "Targetting cancelled.");
return 0;
endif
var pmparray := GetObjProperty(pm, "parray");
if (pm.serial != ch.serial)
if (!pmparray)
if ((!pm.npctemplate) and (pm.ip))
return pm;
elseif ((pm.npctemplate) or (!pm.ip))
SendSysMessage(ch, "You can only add online players to your party.");
return 0;
endif
elseif (pmparray)
SendSysMessage(ch, "This player has already joined a party.");
return 0;
endif
elseif (pm.serial = ch.serial)
SendSysMessage(ch, "Please choose another player.");
return 0;
endif
elseif (len(parray[2]) = 9)
SendSysMessage(ch, "You can't add any more members to your party.");
return 0;
endif
endif
endif
endif
elseif (type = 1)
if (pmserial != 0)
var parray := GetObjProperty(ch, "parray");
if (!parray)
SendSysMessage(ch, "You are not a member of a party.");
return 0;
elseif (parray)
if (parray[1] != ch.serial)
if (pmserial != ch.serial)
SendSysMessage(ch, "Only the party leader can do this.");
return 0;
elseif (pmserial = ch.serial)
var pm := SystemFindObjectBySerial(pmserial, SYSFIND_SEARCH_OFFLINE_MOBILES);
return pm;
endif
elseif (parray[1] = ch.serial)
var pm := SystemFindObjectBySerial(pmserial, SYSFIND_SEARCH_OFFLINE_MOBILES);
var pmparray := GetObjProperty(pm, "parray");
if (!pmparray)
SendSysMessage(ch, "This player is not a member of a party.");
return 0;
elseif (pmparray)
if (pmparray[1] != parray[1])
SendSysMessage(ch, "This player is not a member of your party.");
return 0;
elseif (pmparray[1] = parray[1])
return pm;
endif
endif
endif
endif
elseif(pmserial = 0)
var parray := GetObjProperty(ch, "parray");
if (!parray)
SendSysMessage(ch, "You are not a member of a party.");
return 0;
elseif (parray)
if (parray[1] != ch.serial)
SendSysMessage(ch, "Who would you like to remove from your party?");
var pm := Target(ch);
if (!pm)
SendSysMessage(ch, "Targetting cancelled.");
return 0;
endif
var pmparray := GetObjProperty(pm, "parray");
if (!pmparray)
SendSysMessage(ch, "This player is not a member of a party.");
return 0;
elseif (pmparray)
if (pm.serial != ch.serial)
SendSysMessage(ch, "Only the party leader can do this.");
return 0;
elseif (pm.serial = ch.serial)
return ch;
endif
endif
elseif (parray[1] = ch.serial)
SendSysMessage(ch, "Who would you like to remove from your party?");
var pm := Target(ch);
if (!pm)
SendSysMessage(ch, "Targetting cancelled.");
return 0;
endif
var pmparray := GetObjProperty(pm, "parray");
if (!pmparray)
SendSysMessage(ch, "This player is not a member of a party.");
return 0;
elseif (pmparray)
if (pmparray[1] != parray[1])
SendSysMessage(ch, "This player is not a member of your party.");
return 0;
elseif (pmparray[1] = parray[1])
return pm;
endif
endif
endif
endif
endif
endif
endfunction
function SendMessageToPartyMember(ch, pmserial, pmmessage)
var PacketHexString := "BF"+ ConvertIntToHex(10 + len(ConvertStrToHex(pmmessage, 1)) / 2, 2);
PacketHexString := PacketHexString + ConvertIntToHex(6, 2);
PacketHexString := PacketHexString + ConvertIntToHex(3, 1);
PacketHexString := PacketHexString + ConvertIntToHex(ch.serial, 4);
PacketHexString := PacketHexString + ConvertStrToHex(pmmessage, 1);
var pm := SystemFindObjectBySerial(pmserial, SYSFIND_SEARCH_OFFLINE_MOBILES);
SendPacket(pm, PacketHexString);
endfunction
function SendMessageToParty(ch, pmmessage)
var parray := GetObjProperty(ch, "parray");
if (parray)
var parray2 := parray[2];
var PacketHexString := "BF"+ ConvertIntToHex(10 + len(ConvertStrToHex(pmmessage, 1)) / 2, 2);
PacketHexString := PacketHexString + ConvertIntToHex(6, 2);
PacketHexString := PacketHexString + ConvertIntToHex(4, 1);
PacketHexString := PacketHexString + ConvertIntToHex(ch.serial, 4);
PacketHexString := PacketHexString + ConvertStrToHex(pmmessage, 1);
if (parray[1] != ch.serial)
var pl := SystemFindObjectBySerial(parray[1], SYSFIND_SEARCH_OFFLINE_MOBILES);
SendPacket(pl, PacketHexString);
var pm;
foreach pmserial in parray2
pm := SystemFindObjectBySerial(pmserial, SYSFIND_SEARCH_OFFLINE_MOBILES);
SendPacket(pm, PacketHexString);
endforeach
elseif (parray[1] = ch.serial)
SendPacket(ch, PacketHexString);
var pm;
foreach pmserial in parray2
pm := SystemFindObjectBySerial(pmserial, SYSFIND_SEARCH_OFFLINE_MOBILES);
SendPacket(pm, PacketHexString);
endforeach
endif
endif
endfunction
Code: Select all
use uo;
use util;
function ConvertIntToHex(astring, alength)
astring := Hex(astring);
astring := CStr(astring);
if (astring["0x"])
astring := astring[3, len(astring)];
endif
if (len(astring) > alength * 2)
return;
endif
while (len(astring) < alength * 2)
astring := "0"+ astring;
endwhile
return astring;
endfunction
function ConvertLetterToHex(bletter)
bletter := CStr(bletter);
case (bletter)
"A": return "41";
"Ä": return "C4";
"B": return "42";
"C": return "43";
"D": return "44";
"E": return "45";
"F": return "46";
"G": return "47";
"H": return "48";
"I": return "49";
"J": return "4A";
"K": return "4B";
"L": return "4C";
"M": return "4D";
"N": return "4E";
"O": return "4F";
"Ö": return "D6";
"P": return "50";
"Q": return "51";
"R": return "52";
"S": return "53";
"T": return "54";
"U": return "55";
"Ü": return "DC";
"V": return "56";
"W": return "57";
"X": return "58";
"Y": return "59";
"Z": return "5A";
"a": return "61";
"ä": return "E4";
"b": return "62";
"c": return "63";
"d": return "64";
"e": return "65";
"f": return "66";
"g": return "67";
"h": return "68";
"i": return "69";
"j": return "6A";
"k": return "6B";
"l": return "6C";
"m": return "6D";
"n": return "6E";
"o": return "6F";
"ö": return "F6";
"p": return "70";
"q": return "71";
"r": return "72";
"s": return "73";
"t": return "74";
"u": return "75";
"ü": return "FC";
"v": return "76";
"w": return "77";
"x": return "78";
"y": return "79";
"z": return "7A";
"!": return "21";
"/": return "2F";
"[": return "5B";
"]": return "5D";
"@": return "40";
"=": return "3D";
"#": return "23";
"'": return "27";
"´": return "B4";
"`": return "60";
"{": return "7B";
"}": return "7D";
"_": return "5F";
",": return "2C";
".": return "2E";
"<": return "3C";
">": return "3E";
"|": return "7C";
"^": return "5E";
"ß": return "DF";
"?": return "3F";
":": return "3A";
";": return "3B";
"-": return "2D";
"+": return "2B";
"*": return "2A";
"(": return "28";
")": return "29";
"1": return "31";
"2": return "32";
"3": return "33";
"4": return "34";
"5": return "35";
"6": return "36";
"7": return "37";
"8": return "38";
"9": return "39";
"0": return "30";
" ": return "20";
default: return "20";
endcase
endfunction
function ConvertStrToHex(cstring, ctype := 0, clength := 0)
if (ctype = 0)
cstring := CStr(cstring);
var convertedstring := "";
var letter := 1;
repeat
convertedstring := convertedstring + ConvertLetterToHex(cstring[letter, 1]);
letter := letter + 1;
until (len(cstring) = len(convertedstring) / 2);
return convertedstring;
elseif (ctype = 1)
cstring := CStr(cstring);
var convertedstring := "";
var letter := 1;
repeat
convertedstring := convertedstring + ConvertLetterToHex(cstring[letter, 1]) +"00";
letter := letter + 1;
until (len(cstring) = len(convertedstring) / 4);
convertedstring := "00"+ convertedstring +"00";
return convertedstring;
elseif (ctype = 2)
cstring := CStr(cstring);
var convertedstring := "";
var letter := 1;
repeat
convertedstring := convertedstring + ConvertLetterToHex(cstring[letter, 1]);
letter := letter + 1;
until (len(cstring) = len(convertedstring) / 2);
if (len(convertedstring) > clength * 2)
return;
endif
while (len(convertedstring) < clength * 2)
convertedstring := convertedstring +"00";
endwhile
return convertedstring;
endif
endfunction
function SetPlayerWarMode(who, dvalue)
var PacketHexString;
PacketHexString := "72"+ ConvertIntToHex(dvalue, 1);
PacketHexString := PacketHexString +"003200";
SendPacket(who, PacketHexString);
endfunction
function EnableChatButton(who)
var PacketHexString;
PacketHexString := "B90001";
SendPacket(who, PacketHexString);
endfunction
function SendIdleWarning(who)
var PacketHexString;
PacketHexString := "5307";
SendPacket(who, PacketHexString);
endfunction
function UpdatePlayer(etowhom, who, egraphic, ex, ey, ez, efacing)
var PacketHexString;
PacketHexString := "77"+ ConvertIntToHex(who.serial, 4);
PacketHexString := PacketHexString + ConvertIntToHex(egraphic, 2);
PacketHexString := PacketHexString + ConvertIntToHex(ex, 2);
PacketHexString := PacketHexString + ConvertIntToHex(ey, 2);
PacketHexString := PacketHexString + ConvertIntToHex(ez, 1);
PacketHexString := PacketHexString + ConvertIntToHex(efacing, 1);
PacketHexString := PacketHexString +"00000000";
SendPacket(etowhom, PacketHexString);
endfunction
function PlayCharacterAnimation(ftowhom, who, fanimation, ffacing, frepeat, fdirection, frepeatflag, fframedelay)
var PacketHexString;
PacketHexString := "6E"+ ConvertIntToHex(who.serial, 4);
PacketHexString := PacketHexString + ConvertIntToHex(fanimation, 2);
PacketHexString := PacketHexString +"00";
PacketHexString := PacketHexString + ConvertIntToHex(ffacing, 1);
PacketHexString := PacketHexString + ConvertIntToHex(frepeat, 2);
PacketHexString := PacketHexString + ConvertIntToHex(fdirection, 1);
PacketHexString := PacketHexString + ConvertIntToHex(frepeatflag, 1);
PacketHexString := PacketHexString + ConvertIntToHex(fframedelay, 1);
SendPacket(ftowhom, PacketHexString);
endfunction
function SetQuestArrow(who, gvalue, gx, gy)
var PacketHexString;
PacketHexString := "BA"+ ConvertIntToHex(gvalue, 1);
PacketHexString := PacketHexString + ConvertIntToHex(gx, 2);
PacketHexString := PacketHexString + ConvertIntToHex(gy, 2);
SendPacket(who, PacketHexString);
endfunction
function SetCursorHue(who, hvalue)
var PacketHexString;
PacketHexString := "BF"+ ConvertIntToHex(6, 2);
PacketHexString := PacketHexString + ConvertIntToHex(8, 2);
PacketHexString := PacketHexString + ConvertIntToHex(hvalue, 1);
SendPacket(who, PacketHexString);
endfunction
function OpenWebBrowser(who, iaddress)
var PacketHexStringPart1 := "A5";
var PacketHexStringPart2 := ConvertStrToHex(iaddress);
var FullPacketHexStringLength := (len(PacketHexStringPart1) + len(PacketHexStringPart2)) / 2 + 2;
var FullPacketHexString := PacketHexStringPart1 + ConvertIntToHex(FullPacketHexStringLength, 2) + PacketHexStringPart2;
SendPacket(who, FullPacketHexString);
endfunction
function Play3DLightningBoltEffect(who)
var PacketHexString := "C703"+ ConvertIntToHex(who.serial, 4);
PacketHexString := PacketHexString +"0000000000000E260A15000E260A1500000000000000000000000000000013A700000000";
PacketHexString := PacketHexString + ConvertIntToHex(who.serial, 4);
PacketHexString := PacketHexString +"030000";
foreach mobile in ListMobilesNearLocationEx(who.x, who.y, who.z, 20, LISTEX_FLAG_NORMAL + LISTEX_FLAG_HIDDEN + LISTEX_FLAG_GHOST)
if ((mobile.ip) and (GetObjProperty(mobile, "3dclientversion")))
SendPacket(mobile, PacketHexString);
endif
endforeach
endfunction
function DrawGamePlayer(who, jgraphic, jcolor)
var PacketHexString := "20"+ ConvertIntToHex(who.serial, 4);
PacketHexString := PacketHexString + ConvertIntToHex(jgraphic, 2);
PacketHexString := PacketHexString +"00";
PacketHexString := PacketHexString + ConvertIntToHex(jcolor, 2);
PacketHexString := PacketHexString +"00";
PacketHexString := PacketHexString + ConvertIntToHex(who.x, 2);
PacketHexString := PacketHexString + ConvertIntToHex(who.y, 2);
PacketHexString := PacketHexString +"0000";
PacketHexString := PacketHexString + ConvertIntToHex(who.facing, 1);
PacketHexString := PacketHexString + ConvertIntToHex(who.z, 1);
SendPacket(who, PacketHexString);
endfunction
function DrawObject(ktowhom, kobj, kgraphic, kcolor, keqitrandcolor := 0)
var PacketHexStringPart1 := "78";
var PacketHexStringPart2 := ConvertIntToHex(kobj.serial, 4) + ConvertIntToHex(kgraphic, 2);
PacketHexStringPart2 := PacketHexStringPart2 + ConvertIntToHex(kobj.x, 2);
PacketHexStringPart2 := PacketHexStringPart2 + ConvertIntToHex(kobj.y, 2);
PacketHexStringPart2 := PacketHexStringPart2 + ConvertIntToHex(kobj.z, 1);
PacketHexStringPart2 := PacketHexStringPart2 + ConvertIntToHex(kobj.facing, 1);
PacketHexStringPart2 := PacketHexStringPart2 + ConvertIntToHex(kcolor, 2);
PacketHexStringPart2 := PacketHexStringPart2 +"0000";
if ((kobj.isa(POLCLASS_MOBILE)) and ((kobj.graphic = 400) or (kobj.graphic = 401)))
var color;
var graphic;
foreach item in ListEquippedItems(kobj)
PacketHexStringPart2 := PacketHexStringPart2 + ConvertIntToHex(item.serial, 4);
if (keqitrandcolor = 1)
color := RandomInt(99) + 2;
else
color := item.color;
endif
if (color = 0)
graphic := item.graphic;
else
graphic := item.graphic + 32768;
endif
PacketHexStringPart2 := PacketHexStringPart2 + ConvertIntToHex(graphic, 2);
PacketHexStringPart2 := PacketHexStringPart2 + ConvertIntToHex(item.layer, 1);
if (color != 0)
PacketHexStringPart2 := PacketHexStringPart2 + ConvertIntToHex(color, 2);
endif
endforeach
endif
PacketHexStringPart2 := PacketHexStringPart2 +"00000000";
var FullPacketHexStringLength := (len(PacketHexStringPart1) + len(PacketHexStringPart2)) / 2 + 2;
var FullPacketHexString := PacketHexStringPart1 + ConvertIntToHex(FullPacketHexStringLength, 2) + PacketHexStringPart2;
SendPacket(ktowhom, FullPacketHexString);
endfunction
function DeleteObject(who, lobj)
var PacketHexString := "1D"+ ConvertIntToHex(lobj.serial, 4);
SendPacket(who, PacketHexString);
endfunction
function RequestClientVersionInformation(who)
var PacketHexString := "BD0003";
SendPacket(who, PacketHexString);
endfunction
Code: Select all
use uo;
include "include/PartySystem";
program logoff( character )
EraseObjProperty(character, "#Online");
//party system begin
EraseObjProperty(character, "pinvitation");
var parray := GetObjProperty(character, "parray");
if (parray)
RemovePartyMember(SystemFindObjectBySerial(parray[1], SYSFIND_SEARCH_OFFLINE_MOBILES), character.serial);
endif
//party system end;
// print( "logoff: " + character.name );
// SendSysMessage( character, "You just logged off!" );
// online time counter
var sessiontime := ReadGameClock() - GetObjProperty(character,"logontime");
var timer := GetObjProperty(character,"onlinetimer");
if(!timer)
timer := 0;
endif
SetObjProperty(character,"onlinetimer",timer+sessiontime);
// end online time counter
if (!GetObjProperty(character, "private"))
Broadcast(character.name +" has just logged off!");
endif
endprogramCode: Select all
include "include/Chat";
program Chat(ch, data)
var dataarray := SplitWords(data);
if (dataarray[1] = "ClientPacketb5")
DisplayChatDialog(ch);
CreateChannel(ch, "Chat");
JoinChannel(ch, "Chat");
elseif (dataarray[1] = "ClientPacketb3")
var dataarray2 := dataarray[2];
if (dataarray2[15, 2] = "61")
var chatmessage := dataarray2[19, len(dataarray2) - 18];
if (len(chatmessage) % 2 != 0)
chatmessage := dataarray2[19, len(dataarray2) - 19];
endif
SendChatMessage(ch, ConvertHexToStr(dataarray2[5, 8]), ConvertHexToStr(chatmessage));
elseif (dataarray2[15, 2] = "58")
LeaveChannel(ch);
endif
endif
endprogram
Code: Select all
use uo;
include "include/SendPacket";
include "include/ReceivePacket";
function DisplayChatDialog(ch)
var PacketHexStringPart1 := "B2";
var PacketHexStringPart2 := "03ED00000000";
PacketHexStringPart2 := PacketHexStringPart2 + ConvertStrToHex(ch.name, 1);
PacketHexStringPart2 := PacketHexStringPart2 +"00000000";
var FullPacketHexStringLength := (len(PacketHexStringPart1) + len(PacketHexStringPart2)) / 2 + 2;
var FullPacketHexString := PacketHexStringPart1 + ConvertIntToHex(FullPacketHexStringLength, 2) + PacketHexStringPart2;
SendPacket(ch, FullPacketHexString);
endfunction
function CreateChannel(ch, channelname)
var PacketHexStringPart1 := "B2";
var PacketHexStringPart2 := "03E800000000"+ ConvertStrToHex(channelname, 1);
PacketHexStringPart2 := PacketHexStringPart2 +"000000300000";
var FullPacketHexStringLength := (len(PacketHexStringPart1) + len(PacketHexStringPart2)) / 2 + 2;
var FullPacketHexString := PacketHexStringPart1 + ConvertIntToHex(FullPacketHexStringLength, 2) + PacketHexStringPart2;
SendPacket(ch, FullPacketHexString);
endfunction
function JoinChannel(ch, channelname)
var PacketHexStringPart1 := "B2";
var PacketHexStringPart2 := "03F100000000"+ ConvertStrToHex(channelname, 1);
PacketHexStringPart2 := PacketHexStringPart2 +"0000";
var FullPacketHexStringLength := (len(PacketHexStringPart1) + len(PacketHexStringPart2)) / 2 + 2;
var FullPacketHexString := PacketHexStringPart1 + ConvertIntToHex(FullPacketHexStringLength, 2) + PacketHexStringPart2;
SendPacket(ch, FullPacketHexString);
PacketHexStringPart2 := "03EE00000000"+ ConvertStrToHex("0"+ ch.name, 1);
PacketHexStringPart2 := PacketHexStringPart2 +"0000";
FullPacketHexStringLength := (len(PacketHexStringPart1) + len(PacketHexStringPart2)) / 2 + 2;
FullPacketHexString := PacketHexStringPart1 + ConvertIntToHex(FullPacketHexStringLength, 2) + PacketHexStringPart2;
SetObjProperty(ch, "channelname", channelname);
foreach chatter in EnumerateOnlineCharacters()
if (GetObjProperty(chatter, "channelname") = channelname)
SendPacket(chatter, FullPacketHexString);
endif
endforeach
foreach chatter in EnumerateOnlineCharacters()
if ((chatter.serial != ch.serial) and (GetObjProperty(chatter, "channelname") = channelname))
PacketHexStringPart2 := "03EE00000000"+ ConvertStrToHex("0"+ chatter.name, 1);
PacketHexStringPart2 := PacketHexStringPart2 +"0000";
FullPacketHexStringLength := (len(PacketHexStringPart1) + len(PacketHexStringPart2)) / 2 + 2;
FullPacketHexString := PacketHexStringPart1 + ConvertIntToHex(FullPacketHexStringLength, 2) + PacketHexStringPart2;
SendPacket(ch, FullPacketHexString);
endif
endforeach
endfunction
function SendChatMessage(ch, language, chatmessage)
var PacketHexStringPart1 := "B2";
var nullbytes := 4 - len(language);
language := ConvertStrToHex(language);
while (nullbytes != 0)
language := language +"00";
nullbytes := nullbytes - 1;
endwhile
var PacketHexStringPart2 := "0025"+ language;
PacketHexStringPart2 := PacketHexStringPart2 + ConvertStrToHex("0"+ ch.name, 1);
PacketHexStringPart2 := PacketHexStringPart2 + ConvertStrToHex(chatmessage, 1);
var FullPacketHexStringLength := (len(PacketHexStringPart1) + len(PacketHexStringPart2)) / 2 + 2;
var FullPacketHexString := PacketHexStringPart1 + ConvertIntToHex(FullPacketHexStringLength, 2) + PacketHexStringPart2;
foreach chatter in EnumerateOnlineCharacters()
if (GetObjProperty(chatter, "channelname") = GetObjProperty(ch, "channelname"))
SendPacket(chatter, FullPacketHexString);
endif
endforeach
endfunction
function LeaveChannel(ch)
var PacketHexStringPart1 := "B2";
var PacketHexStringPart2 := "03EF00000000"+ ConvertStrToHex(ch.name, 1);
PacketHexStringPart2 := PacketHexStringPart2 +"0000";
var FullPacketHexStringLength := (len(PacketHexStringPart1) + len(PacketHexStringPart2)) / 2 + 2;
var FullPacketHexString := PacketHexStringPart1 + ConvertIntToHex(FullPacketHexStringLength, 2) + PacketHexStringPart2;
var channelname := GetObjProperty(ch, "channelname");
EraseObjProperty(ch, "channelname");
foreach chatter in EnumerateOnlineCharacters()
if (GetObjProperty(chatter, "channelname") = channelname)
SendPacket(chatter, FullPacketHexString);
endif
endforeach
PacketHexStringPart2 := "03E900000000"+ ConvertStrToHex(channelname, 1);
PacketHexStringPart2 := PacketHexStringPart2 +"0000";
FullPacketHexStringLength := (len(PacketHexStringPart1) + len(PacketHexStringPart2)) / 2 + 2;
FullPacketHexString := PacketHexStringPart1 + ConvertIntToHex(FullPacketHexStringLength, 2) + PacketHexStringPart2;
SendPacket(ch, FullPacketHexString);
endfunction
Code: Select all
function ConvertHexToInt(astring)
astring := CStr(astring);
while ((astring[1, 1] = "0") and (len(astring) > 1))
astring := astring[2, len(astring)];
endwhile
astring := "0x"+ astring;
astring := Hex(astring);
astring := CInt(astring);
return astring;
endfunction
function ConvertHexToLetter(bletter)
bletter := lower(CStr(bletter));
print(bletter);
case (bletter)
"41": return "A";
"c4": return "Ä";
"42": return "B";
"43": return "C";
"44": return "D";
"45": return "E";
"46": return "F";
"47": return "G";
"48": return "H";
"49": return "I";
"4a": return "J";
"4b": return "K";
"4c": return "L";
"4d": return "M";
"4e": return "N";
"4f": return "O";
"d6": return "Ö";
"50": return "P";
"51": return "Q";
"52": return "R";
"53": return "S";
"54": return "T";
"55": return "U";
"dc": return "Ü";
"56": return "V";
"57": return "W";
"58": return "X";
"59": return "Y";
"5a": return "Z";
"61": return "a";
"e4": return "ä";
"62": return "b";
"63": return "c";
"64": return "d";
"65": return "e";
"66": return "f";
"67": return "g";
"68": return "h";
"69": return "i";
"6a": return "j";
"6b": return "k";
"6c": return "l";
"6d": return "m";
"6e": return "n";
"6f": return "o";
"f6": return "ö";
"70": return "p";
"71": return "q";
"72": return "r";
"73": return "s";
"74": return "t";
"75": return "u";
"fc": return "ü";
"76": return "v";
"77": return "w";
"78": return "x";
"79": return "y";
"7a": return "z";
"21": return "!";
"2f": return "/";
"5b": return "[";
"5d": return "]";
"40": return "@";
"3d": return "=";
"23": return "#";
"27": return "'";
"b4": return "´";
"60": return "`";
"7b": return "{";
"7d": return "}";
"5f": return "_";
"2c": return ",";
"2e": return ".";
"3c": return "<";
"3e": return ">";
"7c": return "|";
"5e": return "^";
"df": return "ß";
"3f": return "?";
"3a": return ":";
"3b": return ";";
"2d": return "-";
"2b": return "+";
"2a": return "*";
"28": return "(";
"29": return ")";
"31": return "1";
"32": return "2";
"33": return "3";
"34": return "4";
"35": return "5";
"36": return "6";
"37": return "7";
"38": return "8";
"39": return "9";
"30": return "0";
"20": return " ";
"00": return "";
default: return " ";
endcase
endfunction
function ConvertHexToStr(cstring)
cstring := CStr(cstring);
var convertedstring := "";
var letter := 1;
repeat
convertedstring := convertedstring + ConvertHexToLetter(cstring[letter, 2]);
letter := letter + 2;
until (len(cstring) = letter - 1);
return convertedstring;
endfunction
Code: Select all
function manipulpacketBF(packetstr: String): String;
var
subcommand: Word;
subsubcommand: Byte;
begin
Move(packetstr[4], subcommand, SizeOf(Word));
subcommand := SwapWord(subcommand);
if subcommand = 6 then
begin
Move(packetstr[6], subsubcommand, SizeOf(Word));
case subsubcommand of
1: Result := manipulpacketBFsc6ssc1(packetstr);
8: Result := manipulpacketBFsc6ssc8(packetstr);
9: Result := manipulpacketBFsc6ssc9(packetstr);
3: Result := manipulpacketBFsc6ssc3(packetstr);
4: Result := manipulpacketBFsc6ssc4(packetstr);
6: Result := manipulpacketBFsc6ssc6(packetstr);
2: Result := manipulpacketBFsc6ssc2(packetstr);
end;
end
else if subcommand = $15 then
Result := manipulpacketBFsc15(packetstr)
else if subcommand = $13 then
Result := manipulpacketBFsc13(packetstr)
else
Result := packetstr;
end;
function manipulpacketBFsc6ssc1(packetstr: String): String;
var
memserial: DWord;
newpacketstr: String;
begin
Move(packetstr[7], memserial, SizeOf(DWord));
memserial := SwapDWord(memserial);
newpacketstr := createspeechpacketstr('.PartySystem ClientPacketbfSubcommand6 Subsubcommand1 '+
IntToStr(memserial));
Form1.ListBox1.Items.Add('Manipulated packet $BF!');
Result := newpacketstr;
end;
function manipulpacketBFsc6ssc8(packetstr: String): String;
var
memserial: DWord;
newpacketstr: String;
begin
Move(packetstr[7], memserial, SizeOf(DWord));
memserial := SwapDWord(memserial);
newpacketstr := createspeechpacketstr('.PartySystem ClientPacketbfSubcommand6 Subsubcommand8 '+
IntToStr(memserial));
Form1.ListBox1.Items.Add('Manipulated packet $BF!');
Result := newpacketstr;
end;
function manipulpacketBFsc6ssc9(packetstr: String): String;
var
memserial: DWord;
newpacketstr: String;
begin
Move(packetstr[7], memserial, SizeOf(DWord));
memserial := SwapDWord(memserial);
newpacketstr := createspeechpacketstr('.PartySystem ClientPacketbfSubcommand6 Subsubcommand9 '+
IntToStr(memserial));
Form1.ListBox1.Items.Add('Manipulated packet $BF!');
Result := newpacketstr;
end;
function manipulpacketBFsc6ssc3(packetstr: String): String;
var
memserial: DWord;
messagestr, newpacketstr: String;
begin
Move(packetstr[7], memserial, SizeOf(DWord));
memserial := SwapDWord(memserial);
messagestr := ConvertBinToStr(packetstr, 11, (Length(packetstr) - 10) *
SizeOf(Char));
newpacketstr := createspeechpacketstr('.PartySystem ClientPacketbfSubcommand6 Subsubcommand3 '+
IntToStr(memserial) +' '+ messagestr);
Form1.ListBox1.Items.Add('Manipulated packet $BF!');
Result := newpacketstr;
end;
function manipulpacketBFsc6ssc4(packetstr: String): String;
var
messagestr, newpacketstr: String;
begin
messagestr := ConvertBinToStr(packetstr, 7, (Length(packetstr) - 6) *
SizeOf(Char));
newpacketstr := createspeechpacketstr('.PartySystem ClientPacketbfSubcommand6 Subsubcommand4 '+ messagestr);
Form1.ListBox1.Items.Add('Manipulated packet $BF!');
Result := newpacketstr;
end;
function manipulpacketBFsc6ssc6(packetstr: String): String;
var
canloot: Byte;
newpacketstr: String;
begin
Move(packetstr[7], canloot, SizeOf(Byte));
newpacketstr := createspeechpacketstr('.PartySystem ClientPacketbfSubcommand6 Subsubcommand6 '+
IntToStr(canloot));
Form1.ListBox1.Items.Add('Manipulated packet $BF!');
Result := newpacketstr;
end;
function manipulpacketBFsc6ssc2(packetstr: String): String;
var
memserial: DWord;
newpacketstr: String;
begin
Move(packetstr[7], memserial, SizeOf(DWord));
memserial := SwapDWord(memserial);
newpacketstr := createspeechpacketstr('.PartySystem ClientPacketbfSubcommand6 Subsubcommand2 '+
IntToStr(memserial));
Form1.ListBox1.Items.Add('Manipulated packet $BF!');
Result := newpacketstr;
end;Code: Select all
function manipulpacketB5(packetstr: String): String;
var
hexstr, newpacketstr: String;
begin
hexstr := GenHexStr(Addr(packetstr[2]), Length(packetstr) - 1);
newpacketstr := createspeechpacketstr('.Chat ClientPacketb5 '+ hexstr);
Form1.ListBox1.Items.Add('Manipulated packet $B5!');
Result := newpacketstr;
end;
function manipulpacketB3(packetstr: String): String;
var
hexstr, newpacketstr: String;
begin
hexstr := GenHexStr(Addr(packetstr[2]), Length(packetstr) - 1);
newpacketstr := createspeechpacketstr('.Chat ClientPacketb3 '+ hexstr);
Form1.ListBox1.Items.Add('Manipulated packet $B3!');
Result := newpacketstr;
end;Code: Select all
use uo;
use os;
include "include/gumps";
program skilllock(who)
var teksts:=array(
"Alchemy",
"Anatomy",
"Animal Lore",
"Item Ident.",
"Arms Lore",
"Parrying",
"Begging",
"Blacksmithy",
"Bowcraft",
"Peacemaking",
"Camping",
"Carpentry",
"Cartography",
"Cooking",
"Detecting Hid.",
"Enticement",
"Evaluating Int.",
"Healing",
"Fishing",
"Forensic Eval.",
"Herding",
"Hiding",
"Provocation",
"Inscription",
"Lockpicking",
"Magery",
"Magic Res.",
"Tactic",
"Snooping",
"Musicianship",
"Poisoning",
"Archery",
"Farming",
"Stealing",
"Tailoring",
"Animal Taming",
"Taste Ident.",
"Tinkering",
"Tracking",
"Veterinary",
"Swordsmanship",
"Macefighting",
"Fencing",
"Wrestling",
"Lumberjacking",
"Mining",
"Meditation",
"Stealth",
"Remove Trap"
);
GFInitGump(10,40);
GFResizePic( 0, 0,9559, 350, 520);
var i,skillid;
var skillocks:= GetObjProperty (who,"skillocks");
if (!skillocks)
skillocks:=array{};
for (skillid:=0;skillid<49;skillid:=skillid+1)
skillocks[skillid+1]:=0;
endfor
setobjproperty(who,"skillocks",skillocks);
endif
for (i:=1;i<=25;i:=i+1)
GFTextLine (30,10+(i-1)*20,StdColor,teksts[i]);
GFCheckBox( 10, 15+(i-1)*20, 2361, 2360, skillocks[i], 100+i);
endfor
for (i:=26;i<=49;i:=i+1)
GFTextLine (200,10+(i-26)*20,StdColor,teksts[i]);
GFCheckBox( 180, 15+(i-26)*20, 2361, 2360, skillocks[i], 100+i);
endfor
var res := GFSendGump(who);
for (i:=1;i<=49;i:=i+1)
if (res[i+100])
skillocks[i]:=1;
else
skillocks[i]:=0;
endif
endfor
setobjproperty(who,"skillocks",skillocks);
endprogram
Code: Select all
if (getobjproperty(who,"skillocks"))
var skillocks:=getobjproperty(who,"skillocks");
if (skillocks[skillid+1]) //SKILLOCKED - wont grow
skillpoints:=0;
gainrate:=0;
endif
endifCode: Select all
if at skill cap
if skill not set locked
foreach other_skill for player
if other_skill set to lower
allow skill to advance
lower other_skill by same amount
endif
endforeach
endif
else
// not at skill cap
if skill set to locked or set to lower
no gain
endif
endifI'm just trying to come up with an elegant way to add this to attributes.inc. I think I'm going to go with the one for the 096 distro since that's the one I use. If you're not using the 096 distro you'll just have to add in the checks yourself.Raise - When a skill is set to Raise (up arrow), this skill will increase as it is used..
Lower - When a skill is set to Lower (down arror), this skill will decrease if you're at the skill cap and gain in other skills. Skills set to Lower will not allow you to gain stats from use of that skill.
Lock - When a skill is set to Lock (padlock), this skill's value will not change. Skills set to Lock will not allow you to gain stats from use of that skill.