1
Fork 0
mirror of https://bitbucket.org/Ioncannon/project-meteor-server.git synced 2025-04-22 12:47:46 +00:00
project-meteor-server/www/control_panel_edit_character.php
2016-03-28 22:07:10 -04:00

551 lines
No EOL
18 KiB
PHP

<?php
error_reporting(E_ALL | E_STRICT);
include("config.php");
include("database.php");
include("control_panel_common.php");
if(!isset($_GET["id"]))
{
header("Location: control_panel.php");
exit;
}
$g_characterId = $_GET["id"];
$g_tribes = array(
1 => "Hyur Midlander Male",
2 => "Hyur Midlander Female",
3 => "Hyur Highlander Male",
4 => "Elezen Wildwood Male",
5 => "Elezen Wildwood Female",
6 => "Elezen Duskwight Male",
7 => "Elezen Duskwight Female",
8 => "Lalafell Plainsfolk Male",
9 => "Lalafell Plainsfolk Female",
10 => "Lalafell Dunesfolk Male",
11 => "Lalafell Dunesfolk Female",
12 => "Miqo'te Seeker of the Sun Female",
13 => "Miqo'te Keeper of the Moon Female",
14 => "Roegadyn Sea Wolf Male",
15 => "Roegadyn Hellsguard Male"
);
$g_guardians = array(
1 => "Halone, the Fury",
2 => "Menphina, the Lover",
3 => "Thaliak, the Scholar",
4 => "Nymeia, the Spinner",
5 => "Llymlaen, the Navigator",
6 => "Oschon, the Wanderer",
7 => "Byregot, the Builder",
8 => "Rhalgr, the Destroyer",
9 => "Azeyma, the Warden",
10 => "Nald'thal, the Traders",
11 => "Nophica, the Matron",
12 => "Althyk, the Keeper"
);
$g_allegiances = array(
1 => "Limsa Lominsa",
2 => "Gridania",
3 => "Ul'dah",
);
$g_htmlToDbFieldMapping = array(
"characterName" => "name",
"characterTribe" => "tribe",
"characterSize" => "size",
"characterVoice" => "voice",
"characterSkinColor" => "skinColor",
"characterHairStyle" => "hairStyle",
"characterHairColor" => "hairColor",
"characterHairOption" => "hairOption",
"characterEyeColor" => "eyeColor",
"characterFaceType" => "faceType",
"characterFaceBrow" => "faceBrow",
"characterFaceEye" => "faceEye",
"characterFaceIris" => "faceIris",
"characterFaceNose" => "faceNose",
"characterFaceMouth" => "faceMouth",
"characterFaceJaw" => "faceJaw",
"characterFaceCheek" => "faceCheek",
"characterFaceOption1" => "faceOption1",
"characterFaceOption2" => "faceOption2",
"characterGuardian" => "guardian",
"characterBirthMonth" => "birthMonth",
"characterBirthDay" => "birthDay",
"characterAllegiance" => "allegiance",
"characterWeapon1" => "weapon1",
"characterWeapon2" => "weapon2",
"characterHeadGear" => "headGear",
"characterBodyGear" => "bodyGear",
"characterLegsGear" => "legsGear",
"characterHandsGear" => "handsGear",
"characterFeetGear" => "feetGear",
"characterWaistGear" => "waistGear",
"characterRightEarGear" => "rightEarGear",
"characterLeftEarGear" => "leftEarGear",
"characterRightFingerGear" => "rightFingerGear",
"characterLeftFingerGear" => "leftFingerGear"
);
function SaveCharacter($databaseConnection, $htmlFieldMapping, $characterId)
{
$characterInfo = array();
foreach($htmlFieldMapping as $htmlFieldName => $dbFieldName)
{
$characterInfo[$dbFieldName] = $_POST[$htmlFieldName];
}
UpdateCharacterInfo($databaseConnection, $characterId, $characterInfo);
}
function GenerateTextField($characterInfo, $htmlFieldMapping, $htmlFieldName, $fieldMaxLength = null)
{
$inputMaxLength = ($fieldMaxLength === null) ? "" : sprintf("maxlength=\"%d\"", $fieldMaxLength);
return sprintf("<input id=\"%s\" name=\"%s\" type=\"text\" value=\"%s\" %s />",
$htmlFieldName, $htmlFieldName, $characterInfo[$htmlFieldMapping[$htmlFieldName]], $inputMaxLength);
}
function GenerateSelectField($characterInfo, $htmlFieldMapping, $htmlFieldOptions, $htmlFieldName)
{
$dbFieldName = $htmlFieldMapping[$htmlFieldName];
$htmlText = sprintf("<select id=\"%s\" name=\"%s\">\n",
$htmlFieldName, $htmlFieldName);
foreach($htmlFieldOptions as $optionId => $optionName)
{
$htmlText .= sprintf("<option value=\"%d\" %s>%s</option>\n",
$optionId,
($optionId === (int)$characterInfo[$dbFieldName]) ? "selected" : "",
$optionName);
}
$htmlText .= "</select>\n";
return $htmlText;
}
if(isset($_POST["cancel"]))
{
header("Location: control_panel.php");
exit;
}
if(isset($_POST["save"]))
{
SaveCharacter($g_databaseConnection, $g_htmlToDbFieldMapping, $g_characterId);
header("Location: control_panel.php");
exit;
}
try
{
$g_characterInfo = GetCharacterInfo($g_databaseConnection, $g_userId, $g_characterId);
}
catch(Exception $e)
{
header("Location: control_panel.php");
exit;
}
?>
<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Seventh Umbral Server</title>
<link rel="stylesheet" type="text/css" href="css/reset.css" />
<link rel="stylesheet" type="text/css" href="css/global.css" />
<script type="application/ecmascript">
var weaponPresets = <?php echo require_once("presets_weapon.json"); ?>;
var armorPresets = <?php echo require_once("presets_armor.json"); ?>;
function loadPresetsInSelect(presets, selectName)
{
var select = document.getElementById(selectName);
for(var presetId in presets)
{
var el = document.createElement("option");
var preset = presets[presetId];
el.textContent = preset.name;
el.value = presetId;
select.appendChild(el);
}
}
window.onload = function()
{
loadPresetsInSelect(weaponPresets, "weaponPresets");
loadPresetsInSelect(armorPresets, "armorPresets");
}
function byteArrayToString(byteArray)
{
var i, str = '';
for(i = 0; i < byteArray.length; i++)
{
str += String.fromCharCode(byteArray[i]);
}
return str;
}
function decodeCharacterFile(inputArrayBuffer)
{
var outputArrayBuffer = new ArrayBuffer(inputArrayBuffer.byteLength);
var inputDataView = new DataView(inputArrayBuffer);
var outputDataView = new DataView(outputArrayBuffer);
for(var i = 0; i < inputDataView.byteLength; i++)
{
outputDataView.setUint8(i, inputDataView.getUint8(i) ^ 0x73);
}
return outputArrayBuffer;
}
function getCharacterAttributesFromString(characterFileString)
{
var lineArray = characterFileString.split('\n');
lineArray = lineArray.filter(function(str) { return str != ''; });
var characterAttributes = [];
for(var i = 0; i < lineArray.length; i++)
{
var attributeLine = lineArray[i];
attributeItems = attributeLine.split(',');
characterAttributes.push(
{
"name" : attributeItems[0].trim(),
"value" : attributeItems[3].trim()
}
);
}
return characterAttributes;
}
function getCharacterAttributeValue(attributes, attributeName)
{
for(var i = 0; i < attributes.length; i++)
{
var attribute = attributes[i];
if(attribute.name === attributeName)
{
return attribute.value;
}
}
return undefined;
}
function onImportAppearanceFileReaderLoad(evt)
{
var decodedCharacterFileArray = decodeCharacterFile(evt.target.result);
var decodedCharacterFileString = byteArrayToString(new Uint8Array(decodedCharacterFileArray));
var characterAttributes = getCharacterAttributesFromString(decodedCharacterFileString);
var fieldAssociations =
[
[ 'characterSize', 'appearancetype_size' ],
[ 'characterVoice', 'appearancetype_voice' ],
[ 'characterSkinColor', 'appearancetype_skin' ],
[ 'characterHairStyle', 'appearancetype_hairstyle' ],
[ 'characterHairColor', 'appearancetype_haircolor' ],
[ 'characterHairOption', 'appearancetype_hairoption2' ],
[ 'characterEyeColor', 'appearancetype_eyecolor' ],
[ 'characterFaceType', 'appearancetype_facetype' ],
[ 'characterFaceBrow', 'appearancetype_facebrow' ],
[ 'characterFaceEye', 'appearancetype_faceeye' ],
[ 'characterFaceIris', 'appearancetype_faceiris' ],
[ 'characterFaceNose', 'appearancetype_facenose' ],
[ 'characterFaceMouth', 'appearancetype_facemouth' ],
[ 'characterFaceJaw', 'appearancetype_facejaw_special' ],
[ 'characterFaceCheek', 'appearancetype_facecheek' ],
[ 'characterFaceOption1', 'appearancetype_faceoption1' ],
[ 'characterFaceOption2', 'appearancetype_faceoption2' ],
];
var characterTribe = getCharacterAttributeValue(characterAttributes, "rsc_tribe");
var characterTribeSelect = document.getElementById('characterTribe');
for(var i = 0; i < characterTribeSelect.length; i++)
{
var characterTribeSelectItem = characterTribeSelect[i];
characterTribeSelectItem.selected = characterTribeSelectItem.value === characterTribe;
}
for(var i = 0; i < fieldAssociations.length; i++)
{
var fieldAssociation = fieldAssociations[i];
var attributeValue = getCharacterAttributeValue(characterAttributes, fieldAssociation[1]);
document.getElementById(fieldAssociation[0]).value = attributeValue;
}
}
function importAppearanceFromFile(evt)
{
var file = evt.target.files[0];
var fileReader = new FileReader();
fileReader.readAsArrayBuffer(file);
fileReader.onload = onImportAppearanceFileReaderLoad;
}
function onEquipWeaponPreset()
{
var select = document.getElementById("weaponPresets");
var weapon1Field = document.getElementById("characterWeapon1");
var weapon2Field = document.getElementById("characterWeapon2");
var preset = weaponPresets[select.value];
weapon1Field.value = preset.weapon1;
weapon2Field.value = preset.weapon2;
}
function onEquipArmorPreset()
{
var select = document.getElementById("armorPresets");
var headGearField = document.getElementById("characterHeadGear");
var bodyGearField = document.getElementById("characterBodyGear");
var legsGearField = document.getElementById("characterLegsGear");
var handsGearField = document.getElementById("characterHandsGear");
var feetGearField = document.getElementById("characterFeetGear");
var waistGearField = document.getElementById("characterWaistGear");
var preset = armorPresets[select.value];
headGearField.value = preset.headGear;
bodyGearField.value = preset.bodyGear;
legsGearField.value = preset.legsGear;
handsGearField.value = preset.handsGear;
feetGearField.value = preset.feetGear;
waistGearField.value = preset.waistGear;
}
function toggleDisplay(elementName)
{
var element = document.getElementById(elementName);
if(element.style.display === 'none')
{
element.style.display = '';
}
else
{
element.style.display = 'none';
}
}
</script>
</head>
<body>
<?php include("header.php"); ?>
<?php include("control_panel_header.php"); ?>
<div class="edit">
<h2>Edit Character (<a href="#" onclick="toggleDisplay('guideDiv');">Help</a>)</h2>
<div id="guideDiv" style="background-color: white; display: none;">
<h3>General Notes</h3>
<p style="text-align: left">
All values here are editable, so change them at your own risk. Just keep in mind that
you can always import an appearance from a character creation data file and equip presetted
equipment to reset your character.
</p>
<h3>Import Appearance</h3>
<p style="text-align: left">
Use this to import a character creation data file. Those files
are created by the client when saving character creation data in the character creation
mode, just before selecting the server on which the character will be created. They are usually
located in the "C:\Users\{Username}\Documents\My Games\FINAL FANTASY XIV\user\00000000" folder
and have a '.CMB' extension.
</p>
</div>
<br />
<form method="post" autocomplete="off">
<table class="editForm">
<tr>
<th colspan="4">General Information</th>
</tr>
<tr>
<td colspan="4">Name:</td>
</tr>
<tr>
<td colspan="4"><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterName", 20); ?></td>
</tr>
<tr>
<td>Guardian:</td>
<td>Birth Month:</td>
<td>Birth Day:</td>
<td>Allegiance:</td>
</tr>
<tr>
<td><?php echo GenerateSelectField($g_characterInfo, $g_htmlToDbFieldMapping, $g_guardians, "characterGuardian"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterBirthMonth"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterBirthDay"); ?></td>
<td><?php echo GenerateSelectField($g_characterInfo, $g_htmlToDbFieldMapping, $g_allegiances, "characterAllegiance"); ?></td>
</tr>
</table>
<br />
<hr />
<table class="editForm">
<tr>
<th colspan="4">Appearance</th>
</tr>
<tr>
<td colspan="4">Tribe:</td>
</tr>
<tr>
<td colspan="4"><?php echo GenerateSelectField($g_characterInfo, $g_htmlToDbFieldMapping, $g_tribes, "characterTribe"); ?></td>
</tr>
<tr>
<td>Size:</td>
<td>Voice:</td>
<td>Skin Color:</td>
<td>Hair Style:</td>
</tr>
<tr>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterSize"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterVoice"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterSkinColor"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterHairStyle"); ?></td>
</tr>
<tr>
<td>Hair Color:</td>
<td>Hair Option:</td>
<td>Eye Color:</td>
<td>Face Type:</td>
</tr>
<tr>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterHairColor"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterHairOption"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterEyeColor"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterFaceType"); ?></td>
</tr>
<tr>
<td>Face Brow:</td>
<td>Face Eye:</td>
<td>Face Iris:</td>
<td>Face Nose:</td>
</tr>
<tr>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterFaceBrow"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterFaceEye"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterFaceIris"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterFaceNose"); ?></td>
</tr>
<tr>
<td>Face Mouth:</td>
<td>Face Jaw:</td>
<td>Face Cheek:</td>
<td>Face Option 1:</td>
</tr>
<tr>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterFaceMouth"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterFaceJaw"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterFaceCheek"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterFaceOption1"); ?></td>
</tr>
<tr>
<td>Face Option 2:</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterFaceOption2"); ?></td>
<td></td>
<td></td>
<td>
<script>
function onImportAppearanceButtonClick()
{
document.getElementById('importAppearance').click();
}
</script>
<input type="file" id="importAppearance" style="display: none;">
<button onclick="onImportAppearanceButtonClick(); return false;">Import Appearance</button>
<script>
document.getElementById('importAppearance').addEventListener('change', importAppearanceFromFile, false);
</script>
</td>
</tr>
</table>
<br />
<hr />
<table class="editForm">
<tr>
<th colspan="4">Gear</th>
</tr>
<tr>
<td>Weapon 1:</td>
<td>Weapon 2:</td>
<td></td>
<td></td>
</tr>
<tr>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterWeapon1"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterWeapon2"); ?></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Head Gear:</td>
<td>Body Gear:</td>
<td>Legs Gear:</td>
<td>Hands Gear:</td>
</tr>
<tr>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterHeadGear"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterBodyGear"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterLegsGear"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterHandsGear"); ?></td>
</tr>
<tr>
<td>Feet Gear:</td>
<td>Waist Gear:</td>
<td></td>
<td></td>
</tr>
<tr>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterFeetGear"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterWaistGear"); ?></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Right Ear Gear:</td>
<td>Left Ear Gear:</td>
<td>Right Finger Gear:</td>
<td>Left Finger Gear:</td>
</tr>
<tr>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterRightEarGear"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterLeftEarGear"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterRightFingerGear"); ?></td>
<td><?php echo GenerateTextField($g_characterInfo, $g_htmlToDbFieldMapping, "characterLeftFingerGear"); ?></td>
</tr>
<tr>
<td colspan="2">Weapon Presets:</td>
<td colspan="2">Armor Presets:</td>
</tr>
<tr>
<td colspan="2">
<select id="weaponPresets"></select>
<button onclick="onEquipWeaponPreset(); return false;">Equip</button>
</td>
<td colspan="2">
<select id="armorPresets"></select>
<button onclick="onEquipArmorPreset(); return false;">Equip</button>
</td>
</tr>
</table>
<br />
<hr />
<table class="infoForm">
<tr>
<td>
<input type="submit" name="save" value="Save" />
<input type="submit" name="cancel" value="Cancel" />
</td>
</tr>
</table>
</form>
</div>
<div>
</div>
</body>
</html>