// 4Creative Game System - Main HUD v0.7.1 // ToDo: // - Gegestände verarbeiten einbauen (Pfeilspitze + Holz = Pfeil) // - Max. Traglast einbauen (Jedes Item hat einGewicht in seinem Script) // - Spielername vom Chatter holen // - Meter bauen // - Max. Traglast = Level * 2 Gegenstände (In Items einbauen) // - Anzahl gesammelter Gegenstände vom Level und Zufall abhängig // ► ◄ █ ▄ ■ ▲ ▼ © ▓ ░ ─ ↑ ↓ ▲ ▼ ✔ ✘ • ♫ « » integer m_min = FALSE; // HUD minimiert? integer m_num_slots = 8; // Anzahl Slots, die der Spieler hat. integer m_max_slots = 8; // Anzahl mx. erreichbare Slots (WICHTIG: AUCH IN JEDEM ITEM SETZEN!) integer m_refreshtime = 190; // Nach welcher Zeit soll das HUD aktualisiert werden. integer m_listener_socket = 0; integer m_listener_channel = 0; list m_last_touch = []; string m_listener_state = ""; string m_last_action = ""; string m_lang_groupMessage = "Das Sammelsystem ist hier noch nicht eingerichtet! Bitte benutze das Setup-Tool."; string m_lang_blueBoxDescText = "Was willst du mit '{0}' machen?\n \n{1}"; string m_lang_useToOther = "Auf wen möchtest du ' {0}' anwenden?"; string m_lang_deleteConfirm = "Dies ist ein wichtiges, vielleicht sogar ein einzigartiges Item. Bist du dir wirklich sicher dass du dieses Item nicht mehr brauchst?"; string m_lang_sendToOther = "An wen möchtest Du '{0}' weitergeben?"; string m_lang_selectActions = "Was möchtest Du mit '{0}' machen?"; string m_lang_avatarNotOnRegion = "{0} ist nicht mehr auf der Region."; string m_lang_noFreeSlot = "{0} hat keinen freien Inventarplatz mehr!"; string m_lang_getItem = "{0} hat Dir {1} gegeben."; string m_lang_deleteText = "Du hast {0} weggeworfen."; string m_lang_toHighWeight = "Dies kann nicht mehr getragen werden."; string m_lang_ja = "JA"; string m_lang_nein = "NEIN"; string m_lang_leveltext = "Level: {0} [XP: {1}]"; string m_lang_init = "Aktualisierung..."; string m_lang_maxlevel = "Du hast den höchstmöglichen Level (Level {0}) erreicht."; string m_lang_maxweight = "Sorry, Du kannst nicht mehr tragen."; string m_lang_newname = "Gib bitte hier Deinen RP Spielernamen ein:"; string m_lang_kill = "Wegwerfen"; string m_lang_use = "Benutzen"; string m_lang_give = "Weitergeben"; string m_lang_btn_close = "Schließen "; string m_lang_btn_sound = "Ton ✔"; string m_lang_btn_sound_on = "Ton ✔"; string m_lang_btn_sound_off = "Ton ✘"; string m_lang_btn_messages = "Meldungen ✔"; string m_lang_btn_messages_on = "Meldungen ✔"; string m_lang_btn_messages_off = "Meldungen ✘"; string m_lang_reset = "Zurücksetzen"; string line = "────────────────────────────────────────"; list m_dataStore = []; list m_dataUserStore = []; list m_current = []; integer m_playsound = TRUE; change_iconsize(integer prim) { string primname = llGetLinkName(prim); if(primname == llGetObjectName() || llSubStringIndex(primname, "inv-slot") == 0 || primname == "LOGO" || primname == "preferences") { vector size = llList2Vector(llGetLinkPrimitiveParams(prim, [PRIM_SIZE]), 0); llSetLinkPrimitiveParamsFast(prim, [PRIM_SIZE, size - <0.00, size.y - (size.y * 0.8), size.z - (size.z * 0.8)>]); if(llSubStringIndex(primname, "inv-slot") == 0) { if(m_playsound == TRUE) osPlaySound(LINK_THIS, "inventar", 1); } else { if(m_playsound == TRUE) osPlaySound(LINK_THIS, "click", 1); } llSleep(0.20); llSetLinkPrimitiveParamsFast(prim, [PRIM_SIZE, size]); } } minmax() { m_min = !m_min; vector minmax_size = llList2Vector(llGetLinkPrimitiveParams(LINK_THIS, [PRIM_SIZE]), 0); if(m_min == FALSE) { llSetLocalRot(llEuler2Rot(<0, 0, 0> * DEG_TO_RAD)); llSetTimerEvent(m_refreshtime); refreshData(); } else { llSetLocalRot(llEuler2Rot(<0, 180, 0> * DEG_TO_RAD)); llSetTimerEvent(0); osMessageAttachments(llGetOwner(), "HIDE", [ATTACH_HEAD], 0); } } updateTime(integer _update) { integer _checkTime = llGetUnixTime() - (integer)getDataEntryFromDataList(m_dataUserStore, "stats.lastCheck"); integer _food = (integer)getDataEntryFromDataList(m_dataUserStore, "stats.essen"); integer _xp = (integer)getDataEntryFromDataList(m_dataUserStore, "stats.xp"); integer _water = (integer)getDataEntryFromDataList(m_dataUserStore, "stats.wasser"); integer _updatedStats = FALSE; integer _currentMin = 0; for(_currentMin = 1; _currentMin <= (_checkTime / 60); ++_currentMin) { _food = _food - (integer)getDataEntryFromDataList(m_dataUserStore, "stats.levels.sub_food"); _water = _water - (integer)getDataEntryFromDataList(m_dataUserStore, "stats.levels.sub_water"); _updatedStats = TRUE; } if(_updatedStats == TRUE) { m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "stats.essen", _food); m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "stats.wasser", _water); m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "stats.xp", _xp); m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "stats.lastCheck", llGetUnixTime()); } if(_update == TRUE) refreshData(); } default { state_entry() { llPreloadSound("click"); llPreloadSound("inventar"); m_dataStore = getDataListFromDataStorage("game.hud"); m_dataUserStore = getDataListFromDataStorage("game.hud.player." + llGetOwner()); llSetTimerEvent(m_refreshtime); startGame(); } timer() { m_dataStore = getDataListFromDataStorage("game.hud"); m_dataUserStore = getDataListFromDataStorage("game.hud.player." + llGetOwner()); m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "stats.lastCheck", llGetUnixTime()); updateTime(TRUE); } attach(key id) { if(id) { m_dataStore = getDataListFromDataStorage("game.hud"); m_dataUserStore = getDataListFromDataStorage("game.hud.player." + llGetOwner()); updateTime(FALSE); startGame(); } } touch_start(integer i) { change_iconsize(llDetectedLinkNumber(0)); m_dataStore = getDataListFromDataStorage("game.hud"); m_dataUserStore = getDataListFromDataStorage("game.hud.player." + llGetOwner()); m_last_touch = llParseString2List(llGetLinkName(llDetectedLinkNumber(0)), ["-"], []); m_listener_state = "main"; if(llList2String(m_last_touch, 0) == "inv" && llList2String(m_last_touch, 1) == "slot") { integer _inventarSlot = llList2String(m_last_touch, 2); string _inventarItemName = getDataEntryFromDataList(m_dataUserStore, "inventar.slot." + _inventarSlot); list _inventarItemDataStorage = getDataListFromDataStorage("item." +_inventarItemName); string _inventarItemDisplayName = getDataEntryFromDataList(_inventarItemDataStorage, "displayname"); string _inventarItemBeschreibung = getDataEntryFromDataList(_inventarItemDataStorage, "beschreibung"); if(_inventarItemName != "") { list _aktionen = [m_lang_kill, m_lang_use, m_lang_give]; m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "selected", _inventarSlot); saveDataListToDataStorage(m_dataUserStore, "game.hud.player." + llGetOwner()); llDialog(llDetectedKey(0), line + "\n" + osFormatString(m_lang_blueBoxDescText, [_inventarItemDisplayName, _inventarItemBeschreibung]), _aktionen, m_listener_channel); return; } } else { if(llGetLinkName(llDetectedLinkNumber(0)) == llGetObjectName()) { change_iconsize(llGetLinkName(llDetectedLinkNumber(0))); minmax(); refreshData(); } if(llGetLinkName(llDetectedLinkNumber(0)) == "preferences") llResetScript(); } } listen(integer channel, string name, key id, string message ) { m_dataStore = getDataListFromDataStorage("game.hud"); m_dataUserStore = getDataListFromDataStorage("game.hud.player." + llGetOwner()); if(left(message, ";") == "gamecommand") { if(right(message, ";") == "reload") refreshData(); } else { integer _inventarSlot = llList2String(m_last_touch, 2); string _inventarItemName = getDataEntryFromDataList(m_dataUserStore, "inventar.slot." + _inventarSlot); if(_inventarItemName != "") { list _inventarItemDataStorage = getDataListFromDataStorage("item." +_inventarItemName); string _inventarItemDisplayName = getDataEntryFromDataList(_inventarItemDataStorage, "displayname"); string _inventarItemDUnique = getDataEntryFromDataList(_inventarItemDataStorage, "unique"); if(m_listener_state == "main") { if(message == m_lang_kill) { if(_inventarItemDUnique != "TRUE") { m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "inventar.slot." + _inventarSlot, ""); m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "inventar.slot." + _inventarSlot + ".count", "0"); refreshData(); saveDataListToDataStorage(m_dataUserStore, "game.hud.player." + llGetOwner()); } else { m_listener_state = "confirmDelete"; llDialog(llGetOwner(), m_lang_deleteConfirm, [m_lang_ja, m_lang_nein], m_listener_channel); } return; } if(message == m_lang_give) { list _avatars = llGetAgentList(AGENT_LIST_REGION, []); integer _avatarsCount = llGetListLength(_avatars); list _player = []; while(_avatarsCount--) if(osCheckDataValue("game.hud.player." + llList2String(_avatars, _avatarsCount))) if(llList2Key(_avatars, _avatarsCount) != llGetOwner()) _player += [left(left(llKey2Name(llList2String(_avatars, _avatarsCount)), " "), ".")]; m_listener_state = "give"; llDialog(llGetOwner(), osFormatString(m_lang_sendToOther, [_inventarItemDisplayName]), _player, m_listener_channel); return; } if(message == m_lang_use) { list _actionen = []; list _inventarItemInternalActions = llParseString2List(getDataEntryFromDataList(_inventarItemDataStorage, "actions"), [";"], []); integer _inventarItemInternalActionsCount = llGetListLength(_inventarItemInternalActions); while(_inventarItemInternalActionsCount--) { string _actionName = llList2String(_inventarItemInternalActions, _inventarItemInternalActionsCount); if(_actionName != "") _actionen += [getDataEntryFromDataList(_inventarItemDataStorage, "actions." + _actionName + ".displayname")]; } m_listener_state = "use"; llDialog(llGetOwner(), osFormatString(m_lang_selectActions, [_inventarItemDisplayName]), _actionen, m_listener_channel); return; } } else if(m_listener_state == "give") { list _allAvatarsInRegion = llGetAgentList(AGENT_LIST_REGION, []); integer _allAvatarsInRegionCount = llGetListLength(_allAvatarsInRegion); key _selectedTargetAvatar = NULL_KEY; while(_allAvatarsInRegionCount--) { string _avatarID = left(left(llKey2Name(llList2String(_allAvatarsInRegion, _allAvatarsInRegionCount)), " "), "."); if(_avatarID == message) _selectedTargetAvatar = llList2Key(_allAvatarsInRegion, _allAvatarsInRegionCount); } if(_selectedTargetAvatar == NULL_KEY) { llOwnerSay(osFormatString(m_lang_avatarNotOnRegion, [llKey2Name(_selectedTargetAvatar)])); return; } list _selectedTargetAvatarDataStorage = getDataListFromDataStorage("game.hud.player." + _selectedTargetAvatar); integer _selectedTargetAvatarInventarSlot = getInventarSlot(_selectedTargetAvatarDataStorage, _inventarItemName); if(_selectedTargetAvatarInventarSlot == 0) { llOwnerSay(osFormatString(m_lang_noFreeSlot, [message])); return; } if(getMaxPlayerWeight(_selectedTargetAvatarDataStorage) < calcPlayerWeight(_selectedTargetAvatarDataStorage)) { llOwnerSay(m_lang_toHighWeight); return; } _selectedTargetAvatarDataStorage = setDataEntryInDataList(_selectedTargetAvatarDataStorage, "inventar.slot." + _selectedTargetAvatarInventarSlot, _inventarItemName); _selectedTargetAvatarDataStorage = setDataEntryInDataList(_selectedTargetAvatarDataStorage, "inventar.slot." + _selectedTargetAvatarInventarSlot + ".count", getItemCountFromSlot(_selectedTargetAvatarDataStorage, _selectedTargetAvatarInventarSlot) + 1); m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "inventar.slot." + _inventarSlot + ".count", (integer)getItemCountFromSlot(m_dataUserStore, _inventarSlot) - 1); if(getItemCountFromSlot(m_dataUserStore, _inventarSlot) <= 0) { m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "inventar.slot." + _inventarSlot, ""); m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "inventar.slot." + _inventarSlot + ".count", "0"); } saveDataListToDataStorage(_selectedTargetAvatarDataStorage, "game.hud.player." + _selectedTargetAvatar); saveDataListToDataStorage(m_dataUserStore, "game.hud.player." + llGetOwner()); refreshData(); llRegionSay((integer)getDataEntryFromDataList(_selectedTargetAvatarDataStorage, "channel"), "gamecommand;reload"); llRegionSayTo(_selectedTargetAvatar, 0, osFormatString(m_lang_getItem, [llList2String(llParseString2List(llKey2Name(llGetOwner()), [" "], [""]), 0), _inventarItemDisplayName])); return; } else if(m_listener_state == "use") { useAction(_inventarItemName, message, _inventarSlot, llGetOwner(), FALSE); } else if(m_listener_state == "confirmDelete") { if(message == m_lang_ja) { setDataEntryInDataList(m_dataUserStore, "inventar.slot." + _inventarSlot, ""); setDataEntryInDataList(m_dataUserStore, "inventar.slot." + _inventarSlot + ".count", "0"); saveDataListToDataStorage(m_dataUserStore, "game.hud.player." + llGetOwner()); refreshData(); } } else if(m_listener_state == "getTarget") { list _allAvatarsInRegion = llGetAgentList(AGENT_LIST_REGION, []); integer _allAvatarsInRegionCount = llGetListLength(_allAvatarsInRegion); key _selectedTargetAvatar = NULL_KEY; while(_allAvatarsInRegionCount--) { string _avatarID = left(left(llKey2Name(llList2String(_allAvatarsInRegion, _allAvatarsInRegionCount)), " "), "."); if(_avatarID == message) _selectedTargetAvatar = llList2Key(_allAvatarsInRegion, _allAvatarsInRegionCount); } if(_selectedTargetAvatar == NULL_KEY) { llOwnerSay(osFormatString(m_lang_avatarNotOnRegion, [""])); return; } useAction(_inventarItemName, m_last_action, _inventarSlot, _selectedTargetAvatar, TRUE); if(m_playsound == TRUE) osPlaySound(LINK_THIS, "inventar", 1); } } } } changed(integer change) { if(change & CHANGED_TELEPORT) { m_dataStore = getDataListFromDataStorage("game.hud"); refreshData(); } } } //Spielfunktionen cleanGameState() { if(m_listener_socket != 0) llListenRemove(m_listener_socket); integer i; for(i = 1; i < m_num_slots; i++) { setInventarSlotImage(i, TEXTURE_BLANK, 0); setInventarSlotCountNumber(i, 0); } setLevelDisplayNumber(0, 0); setBalkenValue("wasser", 0); setBalkenValue("essen", 0); setBalkenValue("xp", 0); setBalkenValue("hp", 0); setBalkenValue("weight", 0); } startGame() { cleanGameState(); if(checkDataEntryInDataList(m_dataStore, "enable") == FALSE || getDataEntryFromDataList(m_dataStore, "enable") == "FALSE") { llOwnerSay(m_lang_groupMessage); return; } m_listener_channel = Key2AppChan(llGetOwner(), 39724); m_listener_socket = llListen(m_listener_channel, "", "", ""); m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "channel", m_listener_channel); m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "player", "true"); if(checkDataEntryInDataList(m_dataUserStore, "stats.essen") == FALSE) m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "stats.essen", "100"); if(checkDataEntryInDataList(m_dataUserStore, "stats.wasser") == FALSE) m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "stats.wasser", "100"); if(checkDataEntryInDataList(m_dataUserStore, "stats.xp") == FALSE) m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "stats.xp", "0"); if(checkDataEntryInDataList(m_dataUserStore, "stats.hp") == FALSE) m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "stats.hp", "100"); if(checkDataEntryInDataList(m_dataUserStore, "stats.weight") == FALSE) m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "stats.weight", "0"); if(checkDataEntryInDataList(m_dataUserStore, "stats.lastCheck") == FALSE) m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "stats.lastCheck", llGetUnixTime()); integer i; for (i = 1; i <= m_num_slots; i++) { if(checkDataEntryInDataList(m_dataUserStore, "inventar.slot." + i) == FALSE) { m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "inventar.slot." + i, ""); m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "inventar.slot." + i + ".count", "0"); } } saveDataListToDataStorage(m_dataUserStore, "game.hud.player." + llGetOwner()); refreshData(); } integer getInventarSlot(list _userStorage, string itemName) { integer _currentSlot; integer _freeSlot = 0; for(_currentSlot = 1; _currentSlot <= m_num_slots; ++_currentSlot) { if(getDataEntryFromDataList(_userStorage, "inventar.slot." + _currentSlot) == itemName) return _currentSlot; if(getDataEntryFromDataList(_userStorage, "inventar.slot." + _currentSlot) == "") if(_freeSlot == 0) _freeSlot = _currentSlot; } return _freeSlot; } integer getItemCountFromSlot(list _userStorage, integer _slot) { integer _returnValue = (integer)getDataEntryFromDataList(_userStorage, "inventar.slot." + _slot + ".count"); return _returnValue; } integer calcPlayerWeight(list _userStorage) { integer _currentSlot; integer _currentWeight = 0; for(_currentSlot = 1; _currentSlot <= m_num_slots; ++_currentSlot) { if(getDataEntryFromDataList(_userStorage, "inventar.slot." + _currentSlot) != "") { string _itemName = getDataEntryFromDataList(_userStorage, "inventar.slot." + _currentSlot); list _itemData = getDataListFromDataStorage("item." +_itemName); integer _itemCount = getItemCountFromSlot(_userStorage, _currentSlot); integer _itemWeight = (integer)getDataEntryFromDataList(_itemData, "weight"); _currentWeight = _currentWeight + (_itemCount * _itemWeight); } } return _currentWeight; } integer getMaxPlayerWeight(list _userDataStorage) { integer _maxweight = (integer)getDataEntryFromDataList(m_dataStore, "stats.levels.maxweight"); float _xpMultiplier = (float)getDataEntryFromDataList(m_dataStore, "stats.levels.multiplier"); list _levelData = calcLevelData(_userDataStorage); integer _playerLevel = llList2Integer(_levelData, 0) + 1; integer _playerMaxWight = _maxweight * (_playerLevel * _xpMultiplier); return _playerMaxWight; } list calcLevelData(list _dataStorage) { integer _xpLevelStep = (integer)getDataEntryFromDataList(m_dataStore, "stats.levels.firstStep"); integer _maxlevel = (integer)getDataEntryFromDataList(m_dataStore, "stats.levels.maxlevel"); float _xpLevelStepMultiplier = (float)getDataEntryFromDataList(m_dataStore, "stats.levels.multiplier"); integer _currentXP = (integer)getDataEntryFromDataList(_dataStorage, "stats.xp"); integer _currentLevel = 0; integer _xpNeedForNextLevel = _xpLevelStep * _xpLevelStepMultiplier; while(_currentXP > _xpNeedForNextLevel) { if(_currentLevel <= _maxlevel) { _currentLevel = _currentLevel + 1; _currentXP = _currentXP - _xpNeedForNextLevel; _xpNeedForNextLevel = (_xpNeedForNextLevel * _xpLevelStepMultiplier); } } return [_currentLevel, (integer)_currentXP, _xpNeedForNextLevel]; } refreshData() { integer _currentSlot; for(_currentSlot = 1; _currentSlot <= m_num_slots; ++_currentSlot) { if(getDataEntryFromDataList(m_dataUserStore, "inventar.slot." + _currentSlot) != "") { integer _count = getDataEntryFromDataList(m_dataUserStore, "inventar.slot." + _currentSlot + ".count"); setInventarSlotImage(_currentSlot, getInventarObjectImageKey(getDataEntryFromDataList(m_dataUserStore, "inventar.slot." + _currentSlot)), 255); setInventarSlotCountNumber(_currentSlot, _count); } else { setInventarSlotImage(_currentSlot, TEXTURE_BLANK, 0); setInventarSlotCountNumber(_currentSlot, 0); } } list _levelData = calcLevelData(m_dataUserStore); //llOwnerSay("leveldata " + llList2CSV(_levelData)); setLevelDisplayNumber(llList2Integer(_levelData, 0), llList2Integer(_levelData, 1)); float _xpBalkenValue = (float)((100 / llList2Float(_levelData, 2)) * llList2Float(_levelData, 1)); float _hpBalkenValue = (float)((llList2Integer(_levelData, 0) * 100) / 100); integer _food = (integer)getDataEntryFromDataList(m_dataUserStore, "stats.essen"); integer _water = (integer)getDataEntryFromDataList(m_dataUserStore, "stats.wasser"); integer _hp = (integer)getDataEntryFromDataList(m_dataUserStore, "stats.hp"); if(_food > 100) m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "stats.essen", "100"); if(_food < 0) m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "stats.essen", "0"); if(_water > 100) m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "stats.wasser", "100"); if(_water < 0) m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "stats.wasser", "0"); if(_hp > 100) m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "stats.hp", "100"); if(_hp < 0) m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "stats.hp", "0"); setBalkenValue("wasser", (integer)getDataEntryFromDataList(m_dataUserStore, "stats.wasser")); setBalkenValue("essen", (integer)getDataEntryFromDataList(m_dataUserStore, "stats.essen")); setBalkenValue("hp", (integer)getDataEntryFromDataList(m_dataUserStore, "stats.hp")); setBalkenValue("xp", _xpBalkenValue); setBalkenValue("weight", (integer)getMaxPlayerWeight(getDataListFromDataStorage("game.hud.player." + llGetOwner()))); saveDataListToDataStorage(m_dataUserStore, "game.hud.player." + llGetOwner()); //osMessageAttachments(llGetOwner(), "SHOW" + NAME, [ATTACH_HEAD], 0); osMessageAttachments(llGetOwner(), "LEVEL:" + (string)llList2Integer(_levelData, 0), [ATTACH_HEAD], 0); osMessageAttachments(llGetOwner(), "HP:" + getDataEntryFromDataList(m_dataUserStore, "stats.hp"), [ATTACH_HEAD], 0); } useAction(string _itemName, string _actionName, integer _slot, key _avatar, integer _other) { integer _inventarSlot = llList2String(m_last_touch, 2); string _inventarItemName = getDataEntryFromDataList(m_dataUserStore, "inventar.slot." + _inventarSlot); list _targetUserDataStore = getDataListFromDataStorage("game.hud.player." + _avatar); list _getItems = []; m_last_action = _actionName; if(_inventarItemName != "") { list _inventarItemDataStorage = getDataListFromDataStorage("item." +_inventarItemName); string _inventarItemDisplayName = getDataEntryFromDataList(_inventarItemDataStorage, "displayname"); string _inventarItemDUnique = getDataEntryFromDataList(_inventarItemDataStorage, "unique"); list _inventarItemInternalActions = llParseString2List(getDataEntryFromDataList(_inventarItemDataStorage, "actions"), [";"], []); integer _inventarItemInternalActionsCount = llGetListLength(_inventarItemInternalActions); while(_inventarItemInternalActionsCount--) { string _inventarItemInternalActionName = llList2String(_inventarItemInternalActions, _inventarItemInternalActionsCount); string _inventarItemInternalActionDisplayname = getDataEntryFromDataList(_inventarItemDataStorage, "actions." + _inventarItemInternalActionName + ".displayname"); string _inventarItemInternalActionSetTarget = getDataEntryFromDataList(_inventarItemDataStorage, "actions." + _inventarItemInternalActionName + ".setTarget"); string _inventarItemInternalActionConsume = getDataEntryFromDataList(_inventarItemDataStorage, "actions." + _inventarItemInternalActionName + ".consume"); list _inventarItemInternalActionTasks = llParseString2List(getDataEntryFromDataList(_inventarItemDataStorage, "actions." + _inventarItemInternalActionName + ".tasks"), [";"], []); integer _inventarItemInternalActionTasksCount = llGetListLength(_inventarItemInternalActionTasks); if(_inventarItemInternalActionDisplayname == _actionName) { if(_inventarItemInternalActionSetTarget != "TRUE" || _other == TRUE) { while(_inventarItemInternalActionTasksCount--) { string _actionStringAction = left(llList2String(_inventarItemInternalActionTasks, _inventarItemInternalActionTasksCount), ":"); string _actionStringArgs = right(llList2String(_inventarItemInternalActionTasks, _inventarItemInternalActionTasksCount), ":"); if(_actionStringAction == "say") llDialog(_avatar, " \n \n" + _actionStringArgs, [], -1); if(_actionStringAction == "addFood") _targetUserDataStore = setDataEntryInDataList(_targetUserDataStore, "stats.essen", (integer)getDataEntryFromDataList(_targetUserDataStore, "stats.essen") + (integer)_actionStringArgs); if(_actionStringAction == "addWater") _targetUserDataStore = setDataEntryInDataList(_targetUserDataStore, "stats.wasser", (integer)getDataEntryFromDataList(_targetUserDataStore, "stats.wasser") + (integer)_actionStringArgs); if(_actionStringAction == "addXP") _targetUserDataStore = setDataEntryInDataList(_targetUserDataStore, "stats.xp", (integer)getDataEntryFromDataList(_targetUserDataStore, "stats.xp") + (integer)_actionStringArgs); if(_actionStringAction == "addHP") _targetUserDataStore = setDataEntryInDataList(_targetUserDataStore, "stats.hp", (integer)getDataEntryFromDataList(_targetUserDataStore, "stats.hp") + (integer)_actionStringArgs); if(_actionStringAction == "getItem") _getItems += [_actionStringArgs]; if(_actionStringAction == "contextSwitch") { saveDataListToDataStorage(_targetUserDataStore, "game.hud.player." + _avatar); _targetUserDataStore = getDataListFromDataStorage("game.hud.player." + llGetOwner()); _avatar = llGetOwner(); } if(_actionStringAction == "attach") llRegionSay((integer)_actionStringArgs, "attach|" + _avatar); if(_actionStringAction == "custom") { integer customChannel = (integer)left(_actionStringArgs, ","); string customText = right(_actionStringArgs, ","); llRegionSay(customChannel, customText); } } integer _getItemsListCount = llGetListLength(_getItems); while(_getItemsListCount--) { string _getItemsName = left(llList2String(_getItems, _getItemsListCount), "="); string _getItemsCount = right(llList2String(_getItems, _getItemsListCount), "="); integer _invSlot = getInventarSlot(_targetUserDataStore, _getItemsName); if(_invSlot == 0) { llRegionSayTo(_avatar, 0, osFormatString(m_lang_noFreeSlot, [_getItemsName])); return; } _targetUserDataStore = setDataEntryInDataList(_targetUserDataStore, "inventar.slot." + _invSlot, _getItemsName); _targetUserDataStore = setDataEntryInDataList(_targetUserDataStore, "inventar.slot." + _invSlot + ".count", (integer)getItemCountFromSlot(_targetUserDataStore, _invSlot) + (integer)_getItemsCount); } saveDataListToDataStorage(_targetUserDataStore, "game.hud.player." + _avatar); m_dataUserStore = getDataListFromDataStorage("game.hud.player." + llGetOwner()); if(_inventarItemInternalActionConsume == "TRUE") { m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "inventar.slot." + _inventarSlot + ".count", (integer)getItemCountFromSlot(m_dataUserStore, _inventarSlot) - 1); if(getItemCountFromSlot(m_dataUserStore, _inventarSlot) <= 0) { m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "inventar.slot." + _inventarSlot, ""); m_dataUserStore = setDataEntryInDataList(m_dataUserStore, "inventar.slot." + _inventarSlot + ".count", ""); } } saveDataListToDataStorage(m_dataUserStore, "game.hud.player." + llGetOwner()); if(_other == TRUE) llRegionSay((integer)getDataEntryFromDataList(_targetUserDataStore, "channel"), "gamecommand;reload"); refreshData(); } else { m_listener_state = "getTarget"; list _allAvatarsInRegion = llGetAgentList(AGENT_LIST_REGION, []); integer _allAvatarsInRegionCount = llGetListLength(_allAvatarsInRegion); list _player = []; while(_allAvatarsInRegionCount--) if(osCheckDataValue("game.hud.player." + llList2String(_allAvatarsInRegion, _allAvatarsInRegionCount))) _player += [left(left(llKey2Name(llList2String(_allAvatarsInRegion, _allAvatarsInRegionCount)), " "), ".")]; llDialog(_avatar, osFormatString(m_lang_useToOther, [_inventarItemInternalActionDisplayname]), _player, m_listener_channel); } } } } } key getInventarObjectImageKey(string objektName) { list _inventarItemDataStorage = getDataListFromDataStorage("item." + objektName); string _inventarItemImage = getDataEntryFromDataList(_inventarItemDataStorage, "image"); if(_inventarItemImage != "") return (key)_inventarItemImage; return TEXTURE_BLANK; } setInventarSlotImage(integer slot, key imageID, integer alpha) { if(getDataEntryFromDataList(m_current, "state.slot."+ slot) != (string)imageID) { integer _linkCount = osGetLinkNumber("inv-slot-" + slot); llSetLinkAlpha(_linkCount, alpha, 4); llSetLinkTexture(_linkCount, imageID, 4); m_current = setDataEntryInDataList(m_current, "state.slot."+ slot, (string)imageID); } } setBalkenValue(string balken, integer count) // integer max { if(getDataEntryFromDataList(m_dataStore, "stats.enable") != "TRUE") count = 0; if(getDataEntryFromDataList(m_current, "balken."+ balken) != (string)count) { integer _linkCount = osGetLinkNumber("display-balken-" + balken); if(count != 0) llSetLinkAlpha(_linkCount, 255, 4); if(count == 0) llSetLinkAlpha(_linkCount, 0, 4); float _balkenValue = (1.0 / 100) * count; llSetLinkPrimitiveParamsFast(_linkCount, [PRIM_SLICE,< 0, _balkenValue, 0>]); m_current = setDataEntryInDataList(m_current, "balken."+ balken, (string)count); } } setInventarSlotCountNumber(integer slot, integer count) { if(m_min == TRUE) count = 0; if(getDataEntryFromDataList(m_current, "state.slot."+ slot +".count") != (string)count) { integer _linkCount = osGetLinkNumber("inv-number-" + slot); if(count != 0) llSetLinkPrimitiveParamsFast(_linkCount, [PRIM_TEXT, (string)count, <1, 1, 0.5>, 1.0]); if(count == 0) llSetLinkPrimitiveParamsFast(_linkCount, [PRIM_TEXT, "", <0, 0, 0>, 0.0]); m_current = setDataEntryInDataList(m_current, "state.slot."+ slot +".count", (string)count); } } setLevelDisplayNumber(integer level, integer xp) { if(getDataEntryFromDataList(m_current, "level") != (string)level + (string)xp + (string)m_min) { integer _linkCount = osGetLinkNumber("level-anzeige"); llSetLinkPrimitiveParamsFast(_linkCount, [PRIM_TEXT, osFormatString(m_lang_leveltext, [(string)level, (string)xp]), <0, 1, .2>, !m_min]); m_current = setDataEntryInDataList(m_current, "level", (string)level + (string)xp) + (string)m_min; } } //Hilfsfunktionen integer Key2AppChan(key ID, integer App) { return 0x80000000 | ((integer)("0x"+(string)ID) ^ App); } list getDataListFromDataStorage(string _storage) { return llCSV2List(osGetDataValue(_storage)); } saveDataListToDataStorage(list _dataList, string _storage) { string _csv = llList2CSV(_dataList); osSetDataValue(_storage, _csv); } integer checkDataEntryInDataList(list _dataList, string _key) { integer _inListPosition = llListFindList(_dataList, [_key]); if(_inListPosition == -1) return FALSE; return TRUE; } string getDataEntryFromDataList(list _dataList, string _key) { integer _inListPosition = llListFindList(_dataList, [_key]); if(_inListPosition == -1) return ""; return llList2String(_dataList, _inListPosition + 1); } list setDataEntryInDataList(list _dataList, string _key, string _value) { integer _inListPosition = llListFindList(_dataList, [_key]); if(_inListPosition == -1) { _dataList += [_key, _value]; return _dataList; } return llListReplaceList(_dataList, [_value], _inListPosition + 1, _inListPosition + 1); } string left(string src, string divider) { integer index = llSubStringIndex( src, divider ); if(~index)return llDeleteSubString( src, index, -1); return src; } string right(string src, string divider) { integer index = llSubStringIndex( src, divider ); if(~index)return llDeleteSubString( src, 0, index + llStringLength(divider) - 1); return src; }