Aktív mountpecsét effekt?

Indította fabtam11, 2018-09-03, 22:00:00

Üdv!

Hogy tudnám kivitelezni ezt https://metin2dev.org/board/index.php?/topic/17071-gf-v175-active-pet-seal-effect/ a kis módosítást a meglevő questes mountsystemeken, azaz mikor aktiválódik egy pecsét és a karakter egy mountot ride-ol, akkor a leltárban ill a tálcán is jelzi a játék, hogy az adott pecsét aktiválva van?
Jó, tom lehet maradi az elgondolás és már 2014-ben meg kellett volna nyitnom egy ilyen témát, de azért biztosra venném, hogy jópár fórumozót érdekelne ez a fejlesztés.

Előre is köszönöm a segítséget!

most mivel slotba rakja a mount pecsétet, így fölösleges arra :D
Hamarosan...

http://metin2hungary.net/index.php/topic,201359.msg1064544.html#msg1064544

Gondolom nem használ emiatt sem costume_mountot, sem sima felvehetőset.
Mondjuk az a delay szerintem olyan kicsi, hogy én ameddig nem láttam a témát, észre sem vettem.

Hasonlóképpen megoldható a dolog, mint a petes, mindössze questben módosítod a tárgy socket értékét és kliens oldalon meg megírod melyik tárgyakat vegye figyelembe mountként.

2018-09-04, 11:01:08 #4 Utolsó szerkesztés: 2018-09-04, 11:53:53 Szerző: fabtam11
valahogy így? quest ride begin
state start begin
function Ride( vnum, remain_time )
ride_info = {
[52001] = { 20116, 60*60*24*365, apply.ATTBONUS_MONSTER, 0, 1, false, true }, --Ez egy vadkan

}

if pc.level < ride_info[vnum][5] then
syschat("Még nincs meg a szinted.")
else
if ride_info[vnum][2] == 0 and remain_time != 0 then
pc.mount( ride_info[vnum][1], remain_time*60 )
pc.mount_bonus( ride_info[vnum][3], ride_info[vnum][4], remain_time*60 )
else
pc.mount( ride_info[vnum][1], ride_info[vnum][2] )
pc.mount_bonus( ride_info[vnum][3], ride_info[vnum][4], ride_info[vnum][2] )
end

if true == ride_info[vnum][6] then
pc.remove_item(vnum, 1)
end
end
end

when login begin
local vnum, remain_time = pc.get_special_ride_vnum()

if 0 != vnum then
ride.Ride(vnum, remain_time)
end
end

when 52001.use begin
if pc.is_polymorphed() then
syschat("Próbáld újra ha nem vagy átváltoztva.")
elseif false == pc.is_riding() then
if true == horse.is_summon() then
horse.unsummon()
end

item.set_socket(1) -->tom, hogy kinda bullshit de a bekapcsolása megy
ride.Ride(item.vnum, 0)
else
item.set_socket(1) --> csak a kikapcsolásával adódnak gondjaim o_o
pc.unmount()
chat("Leszálltál a hátasodról.")
end
end
end
end

~Az effekt működik, csak a leszállás utáni kikapcsolása kérdésesebb, mert az effekt még mindig fut?!

2018-09-04, 12:41:44 #5 Utolsó szerkesztés: 2018-09-04, 12:44:42 Szerző: K3zX
Idézelseif false == pc.is_riding() then
             if true == horse.is_summon() then
               horse.unsummon()
            end

            item.set_socket(1) -->tom, hogy kinda bullshit de a bekapcsolása megy
            ride.Ride(item.vnum, 0)
         else
            item.set_socket(1) --> csak a kikapcsolásával adódnak gondjaim o_o
            pc.unmount()
            chat("Leszálltál a hátasodról.")
         end

Nulla kellene szerintem oda.

2018-09-04, 13:11:39 #6 Utolsó szerkesztés: 2018-09-04, 13:29:35 Szerző: fabtam11
Yes... egy kis elírás, de már cseréltem, visszatöltöttem, qc-ztem, relogoltam, /reload questeztem, /ipztem, újralehívtam és újra bekapcsoltam, majd kikapcsoltam, de az effekt el se akar indulni?

uitaskbar
## QuickSlot
def RefreshQuickSlot(self):

pageNum = player.GetQuickPage()

try:
self.quickPageNumImageBox.LoadImage(TaskBar.QUICKPAGE_NUMBER_FILENAME[pageNum])
except:
pass

startNumber = 0
for slot in self.quickslot:

for i in xrange(4):

slotNumber = i+startNumber

(Type, Position) = player.GetLocalQuickSlot(slotNumber)

if player.SLOT_TYPE_NONE == Type:
slot.ClearSlot(slotNumber)
continue

if player.SLOT_TYPE_INVENTORY == Type:

itemIndex = player.GetItemIndex(Position)
itemCount = player.GetItemCount(Position)
if itemCount <= 1:
itemCount = 0

## ŔÚµżą°ľŕ (#72723, #72724) ĆŻĽöĂł¸® - ľĆŔĚĹŰŔεĄµµ ˝˝·Ôżˇ Č°ĽşČ­/şńČ°ĽşČ­ ÇĄ˝Ă¸¦ Ŕ§ÇŃ ŔŰľ÷ŔÓ - [hyo]
if constInfo.IS_AUTO_POTION(itemIndex):
# metinSocket - [0] : Č°ĽşČ­ ż©şÎ, [1] : »çżëÇŃ ľç, [2] : ĂÖ´ë żë·®
metinSocket = [player.GetItemMetinSocket(Position, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)]

if 0 != int(metinSocket[0]):
slot.ActivateSlot(slotNumber)
else:
slot.DeactivateSlot(slotNumber)

##PET
elif itemIndex >= 53001 and itemIndex <= 53999:
metinSocket = [int(player.GetItemMetinSocket(Position, j)) for j in xrange(player.METIN_SOCKET_MAX_NUM)]
if 0 != metinSocket[1]:
slot.ActivateSlot(slotNumber)
else:
slot.DeactivateSlot(slotNumber)
##PET
##MOUNT
elif itemIndex >= 52000 and itemIndex <= 52999:
metinSocket = [int(player.GetItemMetinSocket(Position, j)) for j in xrange(player.METIN_SOCKET_MAX_NUM)]
if 0 != metinSocket[1]:
slot.ActivateSlot(slotNumber)
else:
slot.DeactivateSlot(slotNumber)
##MOUNT
slot.SetItemSlot(slotNumber, itemIndex, itemCount)



uiinventory részlet:
def RefreshBagSlotWindow(self):
getItemVNum=player.GetItemIndex
getItemCount=player.GetItemCount
setItemVNum=self.wndItem.SetItemSlot

for i in xrange(player.INVENTORY_PAGE_SIZE):
slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(i)

itemCount = getItemCount(slotNumber)
# itemCount == 0ŔĚ¸é ĽŇÄĎŔ» şńżî´Ů.
if 0 == itemCount:
self.wndItem.ClearSlot(i)
continue
elif 1 == itemCount:
itemCount = 0

itemVnum = getItemVNum(slotNumber)
setItemVNum(i, itemVnum, itemCount)

## ŔÚµżą°ľŕ (HP: #72723 ~ #72726, SP: #72727 ~ #72730) ĆŻĽöĂł¸® - ľĆŔĚĹŰŔεĄµµ ˝˝·Ôżˇ Č°ĽşČ­/şńČ°ĽşČ­ ÇĄ˝Ă¸¦ Ŕ§ÇŃ ŔŰľ÷ŔÓ - [hyo]
if constInfo.IS_AUTO_POTION(itemVnum):
# metinSocket - [0] : Č°ĽşČ­ ż©şÎ, [1] : »çżëÇŃ ľç, [2] : ĂÖ´ë żë·®
metinSocket = [player.GetItemMetinSocket(slotNumber, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)]

#if slotNumber >= player.INVENTORY_PAGE_SIZE:
# slotNumber -= player.INVENTORY_PAGE_SIZE

if slotNumber >= player.INVENTORY_PAGE_SIZE:
slotNumber -= player.INVENTORY_PAGE_SIZE

isActivated = 0 != metinSocket[0]

if isActivated:
self.wndItem.ActivateSlot(slotNumber)
potionType = 0;
if constInfo.IS_AUTO_POTION_HP(itemVnum):
potionType = player.AUTO_POTION_TYPE_HP
elif constInfo.IS_AUTO_POTION_SP(itemVnum):
potionType = player.AUTO_POTION_TYPE_SP

usedAmount = int(metinSocket[1])
totalAmount = int(metinSocket[2])
player.SetAutoPotionInfo(potionType, isActivated, (totalAmount - usedAmount), totalAmount, self.__InventoryLocalSlotPosToGlobalSlotPos(i))

else:
self.wndItem.DeactivateSlot(slotNumber)
self.wndItem.RefreshSlot()
##PET
if 53000 <= itemVnum and 53999 >= itemVnum:
metinSocket = [player.GetItemMetinSocket(slotNumber, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)]

if slotNumber >= player.INVENTORY_PAGE_SIZE*self.inventoryPageIndex:
slotNumber -= player.INVENTORY_PAGE_SIZE*self.inventoryPageIndex

isActivated = 0 != metinSocket[1]
if isActivated:
self.wndItem.ActivateSlot(slotNumber)
self.wndItem.RefreshSlot()
else:
self.wndItem.DeactivateSlot(slotNumber)
self.wndItem.RefreshSlot()
##PET
##MOUNT
if 52000 <= itemVnum and 52999 >= itemVnum:
metinSocket = [player.GetItemMetinSocket(slotNumber, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)]

if slotNumber >= player.INVENTORY_PAGE_SIZE*self.inventoryPageIndex:
slotNumber -= player.INVENTORY_PAGE_SIZE*self.inventoryPageIndex

isActivated = 0 != metinSocket[1]
if isActivated:
self.wndItem.ActivateSlot(slotNumber)
self.wndItem.RefreshSlot()
else:
self.wndItem.DeactivateSlot(slotNumber)
self.wndItem.RefreshSlot()
##MOUNT

Szia, próbáld meg így, hátha.


quest ride begin
state start begin
function Ride( vnum, remain_time )
ride_info = {
[52001] = { 20116, 60*60*24*365, apply.ATTBONUS_MONSTER, 0, 1, false, true }, --Ez egy vadkan

}

if pc.level < ride_info[vnum][5] then
syschat("Még nincs meg a szinted.")
else
if ride_info[vnum][2] == 0 and remain_time != 0 then
pc.mount( ride_info[vnum][1], remain_time*60 )
pc.mount_bonus( ride_info[vnum][3], ride_info[vnum][4], remain_time*60 )
else
pc.mount( ride_info[vnum][1], ride_info[vnum][2] )
pc.mount_bonus( ride_info[vnum][3], ride_info[vnum][4], ride_info[vnum][2] )
end

if true == ride_info[vnum][6] then
pc.remove_item(vnum, 1)
end
end
end

when login begin
local vnum, remain_time = pc.get_special_ride_vnum()

if 0 != vnum then
ride.Ride(vnum, remain_time)
end
end

when 52001.use begin
if pc.is_polymorphed() then
syschat("Próbáld újra ha nem vagy átváltoztva.")
elseif false == pc.is_riding() then
if true == horse.is_summon() then
horse.unsummon()
end

item.set_socket(1,1) -->tom, hogy kinda bullshit de a bekapcsolása megy
ride.Ride(item.vnum, 0)
else
item.set_socket(1,0) --> csak a kikapcsolásával adódnak gondjaim o_o
pc.unmount()
chat("Leszálltál a hátasodról.")
end
end
end
end


2018-09-04, 13:43:26 #8 Utolsó szerkesztés: 2018-09-04, 19:39:51 Szerző: fabtam11
Köszönöm, ment a plussz és a dolog remekel! Zárom a témát!  ;D

Üzenet összefésülés: 2018-09-04, 19:39:51

A ctrl+ G-s parancs eltávolításáról kérhetnék egy gyors pár soros javaslatot?  ;D

Ki akarod venni?

game.py:

def __PressGKey(self):
if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL):
net.SendChatPacket("/ride")
else:
if self.ShowNameFlag:
self.interface.ToggleGuildWindow()
else:
app.PitchCamera(app.CAMERA_TO_POSITIVE)


to

def __PressGKey(self):
if self.ShowNameFlag:
self.interface.ToggleGuildWindow()
else:
app.PitchCamera(app.CAMERA_TO_POSITIVE)

Szerintem nem kiakarja venni, mivel sokan úgy szokták meg(köztük én is). Úgy szeretné, hogy amikor ctrl+g-vel leszállnak róla, akkor leszedje az effektet az ikonról.

2018-09-04, 20:47:07 #11 Utolsó szerkesztés: 2018-09-04, 20:51:54 Szerző: K3zX
Nyilván úgy lenne célszerű, ezért is kérdeztem meg.
IdézA ctrl+ G-s parancs eltávolításáról
Csakhát ugye nem az effekt hanem a parancs eltávolítását írta.

Amúgy a /ride parancshoz forrásban simán oda kell írni a socket állítást mint a peteknél.
pItem->SetSocket(1, TRUE); (be)
pItem->SetSocket(1, FALSE); (ki)
(pItem lehet más néven fut, most nem tudom megnézni)

Pontosan hogyan gondoltad?

Hát én úgy akartam csinálni, ahogy de ha már valaki bölcset kérdez, akkor nem állhatok meg a saját igényeimnél... Am ezutóbbi módosítás a forrás game\src\cmd.cpp-s parancsainál lenne a kiegészítés?

cmd_general.cpp ACMD(do_ride)-ba kell, bár most belenéztem és csak úgy simán nem lehet beleírni mint pl a peteknél, lesz vele egy kis munka :D

Esetleg így?

ACMD(do_unmount)
{
if (true == ch->UnEquipSpecialRideUniqueItem())
{
for (WORD i = 0; i < INVENTORY_MAX_NUM; ++i)
{
LPITEM pkItem = ch->GetItem(TItemPos(INVENTORY, i));
if (pkItem && !pkItem->IsRideItem() && UNIQUE_GROUP_SPECIAL_RIDE == pkItem->GetSpecialGroup() && pkItem->GetSocket(1) == TRUE)
{
pkItem->SetSocket(1, FALSE);
}
}

ch->RemoveAffect(AFFECT_MOUNT);
ch->RemoveAffect(AFFECT_MOUNT_BONUS);

if (ch->IsHorseRiding())
{
ch->StopRiding();
}
}
else
{
ch->ChatPacket( CHAT_TYPE_INFO, LC_TEXT("ŔÎşĄĹ丮°ˇ ˛Ë Â÷Ľ­ ł»¸± Ľö ľř˝Ŕ´Ď´Ů."));
}
}

Várj és és az unmount hol teszi zéróra a socketet?

2018-09-05, 18:36:32 #17 Utolsó szerkesztés: 2018-09-05, 18:42:00 Szerző: gife974
pkItem->SetSocket(1, FALSE);

Üzenet összefésülés: 2018-09-05, 18:42:00

Köszi P3NG3R, de sajnos nem akar működni, nem szedi le az effektet róla.

2018-09-05, 18:48:59 #18 Utolsó szerkesztés: 2018-09-05, 19:14:10 Szerző: fabtam11
nos a módosítás tényleg két rebuild után se nagyon kapcsolta ki az effektet az unmount résznél, szóval jó okkal kérdeztem az előbbi kommentemnél azt a socket dolgot :D


esetleg valahogy másképpen?  :o

A pecsét Vnumja benne van a special_item_group.txt 10030-as csoportban?