Mirage Source

Free ORPG making software.
It is currently Wed Jun 05, 2024 1:44 pm

All times are UTC




Post new topic Reply to topic  [ 15 posts ] 
Author Message
PostPosted: Mon Jun 18, 2007 10:31 pm 
Offline
Regular
User avatar

Joined: Tue Jan 02, 2007 7:31 pm
Posts: 81
Location: UK
Tutorial - Multi item shop trades - MSE Build 1 - Tested and working

Server side changes
-----------------------

First of all open up modConstants and add this code along with the other MAX values.

Code:
Public Const MAX_GIVE_ITEMS = 5
Public Const MAX_GIVE_VALUE = 5
Public Const MAX_GET_ITEMS = 2
Public Const MAX_GET_VALUE = 2


The server doesn't seem to like a MAX_SHOPS value above 70ish when it writes a new shops.ini file (with the above
MAX values), I would recommend you set it to this or below.

Next, open modTypes and modify the TradeItemRec to look like this.

Code:
Type TradeItemRec
    GiveItem(1 To MAX_GIVE_ITEMS) As Long
    GiveValue(1 To MAX_GIVE_VALUE) As Long
    GetItem(1 To MAX_GET_ITEMS) As Long
    GetValue(1 To MAX_GET_VALUE) As Long
End Type


We'll move onto modDatabase now to sort out the loading and saving of the new trade values.
You'll need to modify both the SaveShop and LoadShop subs to allow for all the extra item information.

Code:
Sub SaveShop(ByVal ShopNum As Long)
Dim FileName As String
Dim i As Long
Dim n As Long

    FileName = App.Path & "\data\shops.ini"
   
    Call PutVar(FileName, "SHOP" & ShopNum, "Name", Trim(Shop(ShopNum).Name))
    Call PutVar(FileName, "SHOP" & ShopNum, "JoinSay", Trim(Shop(ShopNum).JoinSay))
    Call PutVar(FileName, "SHOP" & ShopNum, "LeaveSay", Trim(Shop(ShopNum).LeaveSay))
    Call PutVar(FileName, "SHOP" & ShopNum, "FixesItems", Trim(Shop(ShopNum).FixesItems))
   
    For i = 1 To MAX_TRADES
        For n = 1 To MAX_GIVE_ITEMS
            Call PutVar(FileName, "SHOP" & ShopNum, "Trade" & i & "GiveItem" & n, Trim(Shop(ShopNum).TradeItem(i).GiveItem(n)))
            Call PutVar(FileName, "SHOP" & ShopNum, "Trade" & i & "GiveValue" & n, Trim(Shop(ShopNum).TradeItem(i).GiveValue(n)))
        Next n
        For n = 1 To MAX_GET_ITEMS
            Call PutVar(FileName, "SHOP" & ShopNum, "Trade" & i & "GetItem" & n, Trim(Shop(ShopNum).TradeItem(i).GetItem(n)))
            Call PutVar(FileName, "SHOP" & ShopNum, "Trade" & i & "GetValue" & n, Trim(Shop(ShopNum).TradeItem(i).GetValue(n)))
        Next n
    Next i
End Sub


Code:
Sub LoadShops()
On Error Resume Next
Dim FileName As String
Dim x As Long, y As Long, n As Long

    Call CheckShops
   
    FileName = App.Path & "\data\shops.ini"
   
    For y = 1 To MAX_SHOPS
        Shop(y).Name = GetVar(FileName, "SHOP" & y, "Name")
        Shop(y).JoinSay = GetVar(FileName, "SHOP" & y, "JoinSay")
        Shop(y).LeaveSay = GetVar(FileName, "SHOP" & y, "LeaveSay")
        Shop(y).FixesItems = GetVar(FileName, "SHOP" & y, "FixesItems")
       
        For x = 1 To MAX_TRADES
            For n = 1 To MAX_GIVE_ITEMS
                Shop(y).TradeItem(x).GiveItem(n) = GetVar(FileName, "SHOP" & y, "Trade" & x & "GiveItem" & n)
                Shop(y).TradeItem(x).GiveValue(n) = GetVar(FileName, "SHOP" & y, "Trade" & x & "GiveValue" & n)
            Next n
            For n = 1 To MAX_GET_ITEMS
                Shop(y).TradeItem(x).GetItem(n) = GetVar(FileName, "SHOP" & y, "Trade" & x & "GetItem" & n)
                Shop(y).TradeItem(x).GetValue(n) = GetVar(FileName, "SHOP" & y, "Trade" & x & "GetValue" & n)
            Next n
        Next x
   
        DoEvents
    Next y
End Sub


Now we've defined the new shop trade combinations we have to deal with sending this information to the client
and receiving the modified data back from the client.

First of all, in modHandledata, modify the Save Shop Packet to include the extra item data.
A new variable 'f' needs to be declared so add the following at the top of Sub HandleData.

Code:
Dim f As Long


Code:
    ' ::::::::::::::::::::::
    ' :: Save shop packet ::
    ' ::::::::::::::::::::::
    If (LCase(Parse(0)) = "saveshop") Then
        ' Prevent hacking
        If GetPlayerAccess(Index) < ADMIN_DEVELOPER Then
            Call HackingAttempt(Index, "Admin Cloning")
            Exit Sub
        End If
       
        ShopNum = Val(Parse(1))
       
        ' Prevent hacking
        If ShopNum < 0 Or ShopNum > MAX_SHOPS Then
            Call HackingAttempt(Index, "Invalid Shop Index")
            Exit Sub
        End If
       
        ' Update the shop
        Shop(ShopNum).Name = Trim(Parse(2))
   Shop(ShopNum).JoinSay = Trim(Parse(3))
   Shop(ShopNum).LeaveSay = Trim(Parse(4))
        Shop(ShopNum).FixesItems = Val(Parse(5))
       
        n = 6
        For i = 1 To MAX_TRADES
            For f = 1 To MAX_GIVE_ITEMS
                Shop(ShopNum).TradeItem(I).GiveItem(f) = Val(Parse((n - 1) + f))
            Next f
            n = n + MAX_GIVE_ITEMS
            For f = 1 To MAX_GIVE_VALUE
                Shop(ShopNum).TradeItem(I).GiveValue(f) = Val(Parse((n - 1) + f))
            Next f
            n = n + MAX_GIVE_VALUE
            For f = 1 To MAX_GET_ITEMS
                Shop(ShopNum).TradeItem(I).GetItem(f) = Val(Parse((n - 1) + f))
            Next f
            n = n + MAX_GET_ITEMS
            For f = 1 To MAX_GET_VALUE
                Shop(ShopNum).TradeItem(I).GetValue(f) = Val(Parse((n - 1) + f))
            Next f
            n = n + MAX_GET_VALUE
        Next i
       
        ' Save it
        Call SendUpdateShopToAll(ShopNum)
        Call SaveShop(ShopNum)
        Call AddLog(GetPlayerName(Index) & " saving shop #" & ShopNum & ".", ADMIN_LOG)
        Exit Sub
    End If


The Trade Request Packet is sent to the server every time a character tries to buy something from a shop.
Change the code, as shown below, to check if the player has all the items that might make up the trade,
and give them all the items they have bought.

Code:
    ' ::::::::::::::::::::::::::
    ' :: Trade request packet ::
    ' ::::::::::::::::::::::::::
    If LCase(Parse(0)) = "traderequest" Then
        ' Trade num
        n = Val(Parse(1))
       
        ' Prevent hacking
        If (n <= 0) Or (n > MAX_TRADES) Then
            Call HackingAttempt(Index, "Trade Request Modification")
            Exit Sub
        End If
       
        ' Index for shop
        i = Map(GetPlayerMap(Index).Shop
       
        ' Check if inv full
        For f = 1 To MAX_GET_ITEMS
            If Shop(i).TradeItem(n).GetItem(f) > 0 Then
                x = FindOpenInvSlot(Index, Shop(i).TradeItem(n).GetItem(f))
                If x = 0 Then
                    Call PlayerMsg(Index, "Inventory Full.", BrightRed)
                    Exit Sub
                End If
            End If
        Next f
       
        ' Check if they have the items
        For f = 1 To MAX_GIVE_ITEMS
            If Shop(i).TradeItem(n).GiveItem(f) > 0 Then
                If HasItem(Index, Shop(i).TradeItem(n).GiveItem(f)) >= Shop(i).TradeItem(n).GiveValue(f) Then
                Else
                    Call PlayerMsg(Index, "Trade Unsuccessful.", BrightRed)
                    Exit Sub
                End If
            End If
        Next f
       
        ' If they have all the items, make the trade
        For f = 1 To MAX_GIVE_ITEMS
            Call TakeItem(Index, Shop(i).TradeItem(n).GiveItem(f), Shop(i).TradeItem(n).GiveValue(f))
        Next f
        For f = 1 To MAX_GET_ITEMS
            Call GiveItem(Index, Shop(i).TradeItem(n).GetItem(f), Shop(i).TradeItem(n).GetValue(f))
        Next f
        Call PlayerMsg(Index, "Trade Successful.", BrightRed)
        Exit Sub
    End If


Then, in the modServerTCP, adjust the makeup of the packets in the SendEditShopTo and SendTrade subs to allow
for multiple items.

Code:
Sub SendEditShopTo(ByVal Index As Long, ByVal ShopNum As Long)
Dim Packet As String
Dim i As Long, n As Long

    Packet = "EDITSHOP" & SEP_CHAR & ShopNum & SEP_CHAR & Trim(Shop(ShopNum).Name) & SEP_CHAR & Trim(Shop(ShopNum).JoinSay) & SEP_CHAR & Trim(Shop(ShopNum).LeaveSay) & SEP_CHAR & Shop(ShopNum).FixesItems
    For i = 1 To MAX_TRADES
        For n = 1 To MAX_GIVE_ITEMS
            Packet = Packet & SEP_CHAR & Shop(ShopNum).TradeItem(i).GiveItem(n)
        Next n
        For n = 1 To MAX_GIVE_VALUE
            Packet = Packet & SEP_CHAR & Shop(ShopNum).TradeItem(i).GiveValue(n)
        Next n
        For n = 1 To MAX_GET_ITEMS
            Packet = Packet & SEP_CHAR & Shop(ShopNum).TradeItem(i).GetItem(n)
        Next n
        For n = 1 To MAX_GET_VALUE
            Packet = Packet & SEP_CHAR & Shop(ShopNum).TradeItem(i).GetValue(n)
        Next n
    Next i
    Packet = Packet & SEP_CHAR & END_CHAR

    Call SendDataTo(Index, Packet)
End Sub



Code:
Sub SendTrade(ByVal Index As Long, ByVal ShopNum As Long)
Dim Packet As String
Dim I As Long, x As Long, y As Long, n As Long

    Packet = "TRADE" & SEP_CHAR & ShopNum & SEP_CHAR & Shop(ShopNum).FixesItems
    For i = 1 To MAX_TRADES
        For n = 1 To MAX_GIVE_ITEMS
            Packet = Packet & SEP_CHAR & Shop(ShopNum).TradeItem(i).GiveItem(n)
        Next n
        For n = 1 To MAX_GIVE_VALUE
            Packet = Packet & SEP_CHAR & Shop(ShopNum).TradeItem(i).GiveValue(n)
        Next n
        For n = 1 To MAX_GET_ITEMS
            Packet = Packet & SEP_CHAR & Shop(ShopNum).TradeItem(i).GetItem(n)
        Next n
        For n = 1 To MAX_GET_VALUE
            Packet = Packet & SEP_CHAR & Shop(ShopNum).TradeItem(i).GetValue(n)
        Next n
       
   For n = 1 To MAX_GET_ITEMS
            ' Item #
            x = Shop(ShopNum).TradeItem(i).GetItem(n)
       
            If Item(x).Type = ITEM_TYPE_SPELL Then
                ' Spell class requirement
                y = Spell(Item(x).Data1).ClassReq
           
                If y = 0 Then
                    Call PlayerMsg(Index, Trim(Item(x).Name) & " can be used by all classes.", Yellow)
                Else
                    Call PlayerMsg(Index, Trim(Item(x).Name) & " can only be used by a " & GetClassName(y - 1) & ".", Yellow)
                End If
            End If
   Next n
    Next i
    Packet = Packet & SEP_CHAR & END_CHAR
   
    Call SendDataTo(Index, Packet)
End Sub


Just one last sub to change now, open up modGameLogic and modify the ClearShop sub to zero all the item
values when the server starts up.

Code:
Sub ClearShop(ByVal Index As Long)
Dim i As Long
Dim n As Long

    Shop(Index).Name = ""
    Shop(Index).JoinSay = ""
    Shop(Index).LeaveSay = ""
    Shop(Index).FixesItems = 0
   
    For i = 1 To MAX_TRADES
        For n = 1 To MAX_GIVE_ITEMS
            Shop(Index).TradeItem(i).GiveItem(n) = 0
        Next n
        For n = 1 To MAX_GIVE_VALUE
            Shop(Index).TradeItem(i).GiveValue(n) = 0
        Next n
        For n = 1 To MAX_GET_ITEMS
            Shop(Index).TradeItem(i).GetItem(n) = 0
        Next n
        For n = 1 To MAX_GET_VALUE
            Shop(Index).TradeItem(i).GetValue(n) = 0
        Next n
    Next i
End Sub


That's all for the server side......


First job client side is to add the new shop trade definitions, in modTypes change the
TradeItemRec to look like the code below.

Code:
Type TradeItemRec
    GiveItem(1 To MAX_GIVE_ITEMS) As Long
    GiveValue(1 To MAX_GIVE_VALUE) As Long
    GetItem(1 To MAX_GET_ITEMS) As Long
    GetValue(1 To MAX_GET_VALUE) As Long
End Type


As with the server, we need to add the maximum amount of items a player gives for a trade
and the maximum amount of items they receive, in modConstants add the following code in with
the other MAX Constants.

Code:
Public Const MAX_GIVE_ITEMS = 5
Public Const MAX_GIVE_VALUE = 5
Public Const MAX_GET_ITEMS = 2
Public Const MAX_GET_VALUE = 2


Now would be a good time for us to tackle the changes to frmShopEditor, bring up the form and move the controls
apart a little to create a gap between the 'fixes items' checkbox and the 'item give' combobox, then again between the 'value' textbox for 'item give' and the 'item get' combobox.
Right, follow this next part closely, there are new controls to add and the old give/get item controls will be re-named.

In the first gap;
* add a label with the caption 'Give Item',
* add a scrollbar next to that called 'scrlGiveItem' with the 'Min' value set to 1,
* add a label to the end of the scrollbar named 'lblGiveItem' with 'Autosize' set to TRUE and the 'Caption' as '1'.
* now change the 'cmbItemGive' comboboxes name to 'cmbShopItemGive'
* and change the 'txtItemGiveValue' textboxes name to 'txtShopGiveValue'.

In the second gap;
* add a label with the caption 'Get Item',
* add a scrollbar next to that called 'scrlGetItem' with the 'Min' value set to 1,
* add a label to the end of the scrollbar named 'lblGetItem' with 'Autosize' set to TRUE and the 'Caption' as '1'.
* now change the 'cmbItemGet' comboboxes name to 'cmbShopItemGet'
* and change the 'txtItemGetValue' textboxes name to 'txtShopGetValue'.

With that done we can change the associated code, bring up the forms code window, locate Sub cmdShopUpdate_Click()
and comment out all the code except for the call to 'UpdateShopTrade'.
Now add the following code to the end to deal with the controls we've added and the ones we modfied.

Code:
Private Sub lstTradeItem_Click()
    cmbShopItemGive.ListIndex = Shop(EditorIndex).TradeItem(lstTradeItem.ListIndex + 1).GiveItem(scrlGiveItem.Value)
    txtShopGiveValue.Text = Shop(EditorIndex).TradeItem(lstTradeItem.ListIndex + 1).GiveValue(scrlGiveItem.Value)
    lblGiveItem.Caption = scrlGiveItem.Value
    cmbShopItemGet.ListIndex = Shop(EditorIndex).TradeItem(lstTradeItem.ListIndex + 1).GetItem(scrlGetItem.Value)
    txtShopGetValue.Text = Shop(EditorIndex).TradeItem(lstTradeItem.ListIndex + 1).GetValue(scrlGetItem.Value)
    lblGetItem.Caption = scrlGetItem.Value
End Sub


Code:
Private Sub scrlGiveItem_Change()
    cmbShopItemGive.ListIndex = Shop(EditorIndex).TradeItem(lstTradeItem.ListIndex + 1).GiveItem(scrlGiveItem.Value)
    txtShopGiveValue.Text = Shop(EditorIndex).TradeItem(lstTradeItem.ListIndex + 1).GiveValue(scrlGiveItem.Value)
    lblGiveItem.Caption = scrlGiveItem.Value
End Sub


Code:
Private Sub cmbShopItemGive_Click()
    If lstTradeItem.ListIndex >= 0 Then
        Shop(EditorIndex).TradeItem(lstTradeItem.ListIndex + 1).GiveItem(scrlGiveItem.Value) = cmbShopItemGive.ListIndex
    End If
End Sub


Code:
Private Sub txtShopGiveValue_Change()
    Shop(EditorIndex).TradeItem(lstTradeItem.ListIndex + 1).GiveValue(scrlGiveItem.Value) = Val(txtShopGiveValue.Text)
End Sub


Code:
Private Sub scrlGetItem_Change()
    cmbShopItemGet.ListIndex = Shop(EditorIndex).TradeItem(lstTradeItem.ListIndex + 1).GetItem(scrlGetItem.Value)
    txtShopGetValue.Text = Shop(EditorIndex).TradeItem(lstTradeItem.ListIndex + 1).GetValue(scrlGetItem.Value)
    lblGetItem.Caption = scrlGetItem.Value
End Sub


Code:
Private Sub cmbShopItemGet_Click()
    If lstTradeItem.ListIndex >= 0 Then
        Shop(EditorIndex).TradeItem(lstTradeItem.ListIndex + 1).GetItem(scrlGetItem.Value) = cmbShopItemGet.ListIndex
    End If
End Sub


Code:
Private Sub txtShopGetValue_Change()
    Shop(EditorIndex).TradeItem(lstTradeItem.ListIndex + 1).GetValue(scrlGetItem.Value) = Val(txtShopGetValue.Text)
End Sub


There aren't any real visual changes to frmTrade to be made, although you may want to widen 'lstTrade' to cope with the longer trade descriptions.
No changes to the code for this form either, so we'll move onto the changes in packet data.

First up is the Edit Shop Packet in modHandledata, more changes in view of the extra items per trade.
I've used another variable for each item in the GIVE and GET ITEM arrays and a new string variable for each trade description, so add this code to the top of Sub HandleData with the other Dim statements,

Code:
Dim f As Long
Dim TradeDescription As String


Modify the Edit shop Packet to look like the code below.

Code:
    ' ::::::::::::::::::::::
    ' :: Edit shop packet :: <- Used for shop editor admins only
    ' ::::::::::::::::::::::
    If (LCase(Parse(0)) = "editshop") Then
        ShopNum = Val(Parse(1))
       
        ' Update the shop
        Shop(ShopNum).Name = Parse(2)
        Shop(ShopNum).JoinSay = Parse(3)
        Shop(ShopNum).LeaveSay = Parse(4)
        Shop(ShopNum).FixesItems = Val(Parse(5))
       
        n = 6
        For i = 1 To MAX_TRADES
            For f = 1 To MAX_GIVE_ITEMS
                Shop(ShopNum).TradeItem(i).GiveItem(f) = Val(Parse((n - 1) + f))
            Next f
            n = n + MAX_GIVE_ITEMS
            For f = 1 To MAX_GIVE_VALUE
                Shop(ShopNum).TradeItem(i).GiveValue(f) = Val(Parse((n - 1) + f))
            Next f
            n = n + MAX_GIVE_VALUE
            For f = 1 To MAX_GET_ITEMS
                Shop(ShopNum).TradeItem(i).GetItem(f) = Val(Parse((n - 1) + f))
            Next f
            n = n + MAX_GET_ITEMS
            For f = 1 To MAX_GET_VALUE
                Shop(ShopNum).TradeItem(i).GetValue(f) = Val(Parse((n - 1) + f))
            Next f
            n = n + MAX_GET_VALUE
        Next i
       
        ' Initialize the shop editor
        Call ShopEditorInit

        Exit Sub
    End If


The Trade Packet will also need to be changed to the code below for when the client receives the shop trades data.

Code:
    ' ::::::::::::::::::
    ' :: Trade packet ::
    ' ::::::::::::::::::
    If (LCase(Parse(0)) = "trade") Then
        ShopNum = Val(Parse(1))
        If Val(Parse(2)) = 1 Then
            frmTrade.picFixItems.Visible = True
        Else
            frmTrade.picFixItems.Visible = False
        End If
       
        n = 3
        For i = 1 To MAX_TRADES
            For f = 1 To MAX_GIVE_ITEMS
                Shop(ShopNum).TradeItem(i).GiveItem(f) = Val(Parse((n - 1) + f))
            Next f
            n = n + MAX_GIVE_ITEMS
            For f = 1 To MAX_GIVE_VALUE
                Shop(ShopNum).TradeItem(i).GiveValue(f) = Val(Parse((n - 1) + f))
            Next f
            n = n + MAX_GIVE_VALUE
            For f = 1 To MAX_GET_ITEMS
                Shop(ShopNum).TradeItem(i).GetItem(f) = Val(Parse((n - 1) + f))
            Next f
            n = n + MAX_GET_ITEMS
            For f = 1 To MAX_GET_VALUE
                Shop(ShopNum).TradeItem(i).GetValue(f) = Val(Parse((n - 1) + f))
            Next f
            n = n + MAX_GET_VALUE
           
            TradeDescription = ""
       
            For f = 1 To MAX_GET_ITEMS
                If (Shop(ShopNum).TradeItem(i).GetItem(f) > 0) And (Shop(ShopNum).TradeItem(i).GetValue(f) > 0) Then
                    TradeDescription = TradeDescription & Shop(ShopNum).TradeItem(i).GetValue(f) & " x " & Trim(Item(Shop(ShopNum).TradeItem(i).GetItem(f)).Name) & " + "
                End If
            Next f
            If TradeDescription = "" Then
                frmTrade.lstTrade.AddItem "Empty Trade Slot"
                frmTrade.lstTrade.ListIndex = 0
                If frmTrade.lstTrade.ListCount > 0 Then
                    frmTrade.lstTrade.ListIndex = 0
                End If
                Exit For
            End If
            TradeDescription = Left(TradeDescription, (Len(TradeDescription) - 2))
            TradeDescription = TradeDescription & "for "
            For f = 1 To MAX_GIVE_ITEMS
                If (Shop(ShopNum).TradeItem(i).GiveItem(f) > 0) And (Shop(ShopNum).TradeItem(i).GiveValue(f) > 0) Then
                    TradeDescription = TradeDescription & Shop(ShopNum).TradeItem(i).GiveValue(f) & " x " & Trim(Item(Shop(ShopNum).TradeItem(i).GiveItem(f)).Name) & " + "
                End If
            Next f
            If TradeDescription = "" Then
                frmTrade.lstTrade.AddItem i & "Empty Trade Slot"
                frmTrade.lstTrade.ListIndex = 0
                If frmTrade.lstTrade.ListCount > 0 Then
                    frmTrade.lstTrade.ListIndex = 0
                End If
                Exit For
            End If
            TradeDescription = Left(TradeDescription, (Len(TradeDescription) - 2))
            frmTrade.lstTrade.AddItem i & ": " & TradeDescription
        Next i
       
        If frmTrade.lstTrade.ListCount > 0 Then
            frmTrade.lstTrade.ListIndex = 0
        End If
        frmTrade.Show vbModal
        Exit Sub
    End If


Over to frmClientTCP now, find the sub SendSaveShop and change it to the following code.

Code:
Public Sub SendSaveShop(ByVal ShopNum As Long)
Dim Packet As String
Dim i As Long, f As Long

    With Shop(ShopNum)
        Packet = "SAVESHOP" & SEP_CHAR & ShopNum & SEP_CHAR & Trim(.Name) & SEP_CHAR & Trim(.JoinSay) & SEP_CHAR & Trim(.LeaveSay) & SEP_CHAR & .FixesItems & SEP_CHAR
    End With
   
    For i = 1 To MAX_TRADES
        With Shop(ShopNum).TradeItem(i)
            For f = 1 To MAX_GIVE_ITEMS
                Packet = Packet & .GiveItem(f) & SEP_CHAR
            Next f
            For f = 1 To MAX_GIVE_VALUE
                Packet = Packet & .GiveValue(f) & SEP_CHAR
            Next f
            For f = 1 To MAX_GET_ITEMS
                Packet = Packet & .GetItem(f) & SEP_CHAR
            Next f
            For f = 1 To MAX_GET_VALUE
                Packet = Packet & .GetValue(f) & SEP_CHAR
            Next f
        End With
    Next i
   
    Packet = Packet & END_CHAR
    Call SendData(Packet)
End Sub


Lastly we come to modGameLogic, the changes here set how the shop editor displays the new trade item information.
Once again, modify the code to look like the code that follows.

Code:
Public Sub ShopEditorInit()
On Error Resume Next
Dim i As Long

    frmShopEditor.txtName.Text = Trim(Shop(EditorIndex).Name)
    frmShopEditor.txtJoinSay.Text = Trim(Shop(EditorIndex).JoinSay)
    frmShopEditor.txtLeaveSay.Text = Trim(Shop(EditorIndex).LeaveSay)
    frmShopEditor.chkFixesItems.Value = Shop(EditorIndex).FixesItems
   
    frmShopEditor.scrlGiveItem.Max = MAX_GIVE_ITEMS
    frmShopEditor.scrlGetItem.Max = MAX_GET_ITEMS
   
    frmShopEditor.cmbShopItemGive.Clear
    frmShopEditor.cmbShopItemGive.AddItem "None"
    frmShopEditor.cmbShopItemGet.Clear
    frmShopEditor.cmbShopItemGet.AddItem "None"
    For i = 1 To MAX_ITEMS
        frmShopEditor.cmbShopItemGive.AddItem i & ": " & Trim(Item(i).Name)
        frmShopEditor.cmbShopItemGet.AddItem i & ": " & Trim(Item(i).Name)
    Next i
    frmShopEditor.cmbShopItemGive.ListIndex = 0
    frmShopEditor.cmbShopItemGet.ListIndex = 0
   
    frmShopEditor.lstTradeItem.ListIndex = 0
    Call UpdateShopTrade
   
    frmShopEditor.Show vbModal
End Sub


Code:
Public Sub UpdateShopTrade()
Dim i As Long, f As Long
Dim TradeDescription As String
Dim GiveItem(1 To MAX_GIVE_ITEMS) As Byte
Dim GiveValue(1 To MAX_GIVE_ITEMS) As Byte
Dim GetItem(1 To MAX_GET_ITEMS) As Byte
Dim GetValue(1 To MAX_GET_VALUE) As Byte

    frmShopEditor.lstTradeItem.Clear
    For i = 1 To MAX_TRADES
        For f = 1 To MAX_GIVE_ITEMS
            GiveItem(f) = Shop(EditorIndex).TradeItem(i).GiveItem(f)
            GiveValue(f) = Shop(EditorIndex).TradeItem(i).GiveValue(f)
        Next f
        For f = 1 To MAX_GET_ITEMS
            GetItem(f) = Shop(EditorIndex).TradeItem(i).GetItem(f)
            GetValue(f) = Shop(EditorIndex).TradeItem(i).GetValue(f)
        Next f
           
        TradeDescription = ""
       
        For f = 1 To MAX_GET_ITEMS
            If (GetItem(f) > 0) And (GetValue(f) > 0) Then
                TradeDescription = TradeDescription & GetValue(f) & " x " & Trim(Item(GetItem(f)).Name) & " + "
            End If
        Next f
        If TradeDescription = "" Then
            frmShopEditor.lstTradeItem.AddItem "Empty Trade Slot"
            frmShopEditor.lstTradeItem.ListIndex = 0
       Exit For
        End If
        TradeDescription = Left(TradeDescription, (Len(TradeDescription) - 2))
        TradeDescription = TradeDescription & "for "
        For f = 1 To MAX_GIVE_ITEMS
            If (GiveItem(f) > 0) And (GiveValue(f) > 0) Then
                TradeDescription = TradeDescription & GiveValue(f) & " x " & Trim(Item(GiveItem(f)).Name) & " + "
            End If
        Next f
        If TradeDescription = "" Then
            frmShopEditor.lstTradeItem.AddItem i & "Empty Trade Slot"
            frmShopEditor.lstTradeItem.ListIndex = 0
       Exit For
        End If
        TradeDescription = Left(TradeDescription, (Len(TradeDescription) - 2))
        frmShopEditor.lstTradeItem.AddItem i & ": " & TradeDescription
    Next i
    frmShopEditor.lstTradeItem.ListIndex = 0
End Sub


Code:
Public Sub ShopEditorOk()
    Shop(EditorIndex).Name = frmShopEditor.txtName.Text
    Shop(EditorIndex).JoinSay = frmShopEditor.txtJoinSay.Text
    Shop(EditorIndex).LeaveSay = frmShopEditor.txtLeaveSay.Text
    Shop(EditorIndex).FixesItems = frmShopEditor.chkFixesItems.Value
   
    Call SendSaveShop(EditorIndex)
    InShopEditor = False
    Unload frmShopEditor
End Sub


And There you have it, you should now be able to set up multiple item trades in your shops.
It's best to delete the shops.ini file in the Data folder server side before running the server again.
It is possible to change the MAX_GIVE_ITEMS and MAX_GET_ITEMS and _VALUE constants to give different combinations.
NB: with MAX_GIVE_ITEMS set to 5 and MAX_GET_ITEMS set to 2, an .ini file will hold just over 70 shops.

** Know Issue - There is one last sub or code modification that this tutorial needs to complete it, I haven't gotten around to adding it to my source yet so you'll have to make it up yourself.
Basically it concerns the servers check for open inventory slots, at the moment if a player has just one open inventory slot the FindOpenInvSlot sub will find that open slot for each Get Item the character will receive, meaning the player will run out of inventory before they get all the items their due.
Best of Luck.


Top
 Profile  
 
PostPosted: Tue Aug 07, 2007 7:47 pm 
Offline
Regular
User avatar

Joined: Wed Aug 01, 2007 6:18 pm
Posts: 55
Does this Only work for MSE Build 1 or will it also work for MS V3.0.3?


Top
 Profile  
 
PostPosted: Tue Aug 07, 2007 8:22 pm 
Should work for both.


Top
  
 
PostPosted: Thu Dec 16, 2021 10:01 am 
Offline
Mirage Source Lover

Joined: Sun Jul 04, 2021 4:04 am
Posts: 495069
http://audiobookkeeper.ruhttp://cottagenet.ruhttp://eyesvision.ruhttp://eyesvisions.comhttp://factoringfee.ruhttp://filmzones.ruhttp://gadwall.ruhttp://gaffertape.ruhttp://gageboard.ruhttp://gagrule.ruhttp://gallduct.ruhttp://galvanometric.ruhttp://gangforeman.ruhttp://gangwayplatform.ruhttp://garbagechute.ruhttp://gardeningleave.ruhttp://gascautery.ruhttp://gashbucket.ruhttp://gasreturn.ruhttp://gatedsweep.ruhttp://gaugemodel.ruhttp://gaussianfilter.ruhttp://gearpitchdiameter.ru
http://geartreating.ruhttp://generalizedanalysis.ruhttp://generalprovisions.ruhttp://geophysicalprobe.ruhttp://geriatricnurse.ruhttp://getintoaflap.ruhttp://getthebounce.ruhttp://habeascorpus.ruhttp://habituate.ruhttp://hackedbolt.ruhttp://hackworker.ruhttp://hadronicannihilation.ruhttp://haemagglutinin.ruhttp://hailsquall.ruhttp://hairysphere.ruhttp://halforderfringe.ruhttp://halfsiblings.ruhttp://hallofresidence.ruhttp://haltstate.ruhttp://handcoding.ruhttp://handportedhead.ruhttp://handradar.ruhttp://handsfreetelephone.ru
http://hangonpart.ruhttp://haphazardwinding.ruhttp://hardalloyteeth.ruhttp://hardasiron.ruhttp://hardenedconcrete.ruhttp://harmonicinteraction.ruhttp://hartlaubgoose.ruhttp://hatchholddown.ruhttp://haveafinetime.ruhttp://hazardousatmosphere.ruhttp://headregulator.ruhttp://heartofgold.ruhttp://heatageingresistance.ruhttp://heatinggas.ruhttp://heavydutymetalcutting.ruhttp://jacketedwall.ruhttp://japanesecedar.ruhttp://jibtypecrane.ruhttp://jobabandonment.ruhttp://jobstress.ruhttp://jogformation.ruhttp://jointcapsule.ruhttp://jointsealingmaterial.ru
http://journallubricator.ruhttp://juicecatcher.ruhttp://junctionofchannels.ruhttp://justiciablehomicide.ruhttp://juxtapositiontwin.ruhttp://kaposidisease.ruhttp://keepagoodoffing.ruhttp://keepsmthinhand.ruhttp://kentishglory.ruhttp://kerbweight.ruhttp://kerrrotation.ruhttp://keymanassurance.ruhttp://keyserum.ruhttp://kickplate.ruhttp://killthefattedcalf.ruhttp://kilowattsecond.ruhttp://kingweakfish.ruhttp://kinozones.ruhttp://kleinbottle.ruhttp://kneejoint.ruhttp://knifesethouse.ruhttp://knockonatom.ruhttp://knowledgestate.ru
http://kondoferromagnet.ruhttp://labeledgraph.ruhttp://laborracket.ruhttp://labourearnings.ruhttp://labourleasing.ruhttp://laburnumtree.ruhttp://lacingcourse.ruhttp://lacrimalpoint.ruhttp://lactogenicfactor.ruhttp://lacunarycoefficient.ruhttp://ladletreatediron.ruhttp://laggingload.ruhttp://laissezaller.ruhttp://lambdatransition.ruhttp://laminatedmaterial.ruhttp://lammasshoot.ruhttp://lamphouse.ruhttp://lancecorporal.ruhttp://lancingdie.ruhttp://landingdoor.ruhttp://landmarksensor.ruhttp://landreform.ruhttp://landuseratio.ru
http://languagelaboratory.ruhttp://largeheart.ruhttp://lasercalibration.ruhttp://laserlens.ruhttp://laserpulse.ruhttp://laterevent.ruhttp://latrinesergeant.ruhttp://layabout.ruhttp://leadcoating.ruhttp://leadingfirm.ruhttp://learningcurve.ruhttp://leaveword.ruhttp://machinesensible.ruhttp://magneticequator.ruhttp://magnetotelluricfield.ruhttp://mailinghouse.ruhttp://majorconcern.ruhttp://mammasdarling.ruhttp://managerialstaff.ruhttp://manipulatinghand.ruhttp://manualchoke.ruhttp://medinfobooks.ruhttp://mp3lists.ru
http://nameresolution.ruhttp://naphtheneseries.ruhttp://narrowmouthed.ruhttp://nationalcensus.ruhttp://naturalfunctor.ruhttp://navelseed.ruhttp://neatplaster.ruhttp://necroticcaries.ruhttp://negativefibration.ruhttp://neighbouringrights.ruhttp://objectmodule.ruhttp://observationballoon.ruhttp://obstructivepatent.ruhttp://oceanmining.ruhttp://octupolephonon.ruhttp://offlinesystem.ruhttp://offsetholder.ruhttp://olibanumresinoid.ruhttp://onesticket.ruhttp://packedspheres.ruhttp://pagingterminal.ruhttp://palatinebones.ruhttp://palmberry.ru
http://papercoating.ruhttp://paraconvexgroup.ruhttp://parasolmonoplane.ruhttp://parkingbrake.ruhttp://partfamily.ruhttp://partialmajorant.ruhttp://quadrupleworm.ruhttp://qualitybooster.ruhttp://quasimoney.ruhttp://quenchedspark.ruhttp://quodrecuperet.ruhttp://rabbetledge.ruhttp://radialchaser.ruhttp://radiationestimator.ruhttp://railwaybridge.ruhttp://randomcoloration.ruhttp://rapidgrowth.ruhttp://rattlesnakemaster.ruhttp://reachthroughregion.ruhttp://readingmagnifier.ruhttp://rearchain.ruhttp://recessioncone.ruhttp://recordedassignment.ru
http://rectifiersubstation.ruhttp://redemptionvalue.ruhttp://reducingflange.ruhttp://referenceantigen.ruhttp://regeneratedprotein.ruhttp://reinvestmentplan.ruhttp://safedrilling.ruhttp://sagprofile.ruhttp://salestypelease.ruhttp://samplinginterval.ruhttp://satellitehydrology.ruhttp://scarcecommodity.ruhttp://scrapermat.ruhttp://screwingunit.ruhttp://seawaterpump.ruhttp://secondaryblock.ruhttp://secularclergy.ruhttp://seismicefficiency.ruhttp://selectivediffuser.ruинфоhttp://semifinishmachining.ruhttp://spicetrade.ruhttp://spysale.ru
http://stungun.ruhttp://tacticaldiameter.ruhttp://tailstockcenter.ruhttp://tamecurve.ruhttp://tapecorrection.ruhttp://tappingchuck.rutaskreasoning.ruhttp://technicalgrade.ruhttp://telangiectaticlipoma.ruhttp://telescopicdamper.ruсайтhttp://temperedmeasure.ruhttp://tenementbuilding.rutuchkashttp://ultramaficrock.ruhttp://ultraviolettesting.ru


Top
 Profile  
 
PostPosted: Fri Feb 11, 2022 3:17 am 
Offline
Mirage Source Lover

Joined: Sun Jul 04, 2021 4:04 am
Posts: 495069
Bram64.4EyeRBettDaniClosSwinSunnAndrMereUlriDanuTescTescWeddClasJameSamuMikeXIIIGallBriaSupe
BeatViviArthZebrStouPatrToveHurrJameVijaChanForeYourVerlAlleLeviChogRajkDaviTescTescNordXIII
RobeVIIILycrCarlRobeLineJeweHabiElegRockFallGeneCapiSelaElegCircToscMervRoxyOwenPushFranXVII
CotoLycrSelaSelaFallToscFlorMylePhilELEGJameEasySelaDefoZoneChriZoneJourJeweJoseCiriZoneCool
ZoneZoneZoneZoneZoneInspXVIIZoneZoneZoneAnnaZoneZoneHerbProfRockZoneZoneZoneZoneWortZoneZone
ZoneeugeolliMicrguitWhatMabeMabeCompScouSolaUmaNTwinBeflMistXVIIXIIINancSTARJanuSvetmostUkra
ValiFrelEducreneZongHasbTranwwwnMicrSaleOffiBrauBoscCafeRoyaWindGlamWindWernLiveWelcLiveCarl
JerrRalpByluJohaVIIIMoskDaviunflAlaiMartLibeNataYellHappGirlperfYourDiabWithVIIIRobeDaviBurk
DragFitzElaiNicoKarethreRubyGAAPJameRobeRobeJudyXVIIOpenMaryDaviKateLarsJameJackCrazMicrMicr
MicrLostTambKrusThisKohaOrigStonTwisThisMetaexspPinktuchkasMicrMoth


Top
 Profile  
 
PostPosted: Sun Mar 13, 2022 3:45 pm 
Offline
Mirage Source Lover

Joined: Sun Jul 04, 2021 4:04 am
Posts: 495069
инфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфо
инфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфо
инфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфо
инфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинйоинфоинфоинфоинфоинфо
инфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфо
инфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоmagnetotelluricfield.ruинфоинфоинфоинфоинфоинфоинфоинфо
инфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфо
инфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфо
инфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфо
инфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоинфоtuchkasинфоинфо


Top
 Profile  
 
PostPosted: Thu Jun 16, 2022 4:57 pm 
Offline
Mirage Source Lover

Joined: Sun Jul 04, 2021 4:04 am
Posts: 495069
AITH231.1BettCHAPDonnHenrMicrStarSandMoriPatrAtlaLuciPlotMollXVIIStuaManuveruClubZoneImmaCher
BornEnjoTesclemoCreoPayoPalmBlueAfraOralJustliveXIIIXVIIGillChocWellFlaxGillXVIIJuliFiorOral
HarrLondCarlMariScotVincViewgunmClemStanDvorELEGLineCircCircNikiFELIAlexXVIINikiRobeTrasSieL
ThomComiPaliRogeLloyLawrRUSCRondElegMicrFuxiLapiGranZonePlayZoneAldoComiRobeEricZonePassLuis
ErnsBillSlunRichRickGarydiamXVIIDILMZoneRitcXVIIDianinfoLucaZonediamMarkStraZoneZoneDarrXVII
XboxZassYeddSennINTEINTEMielDavoDougHellClauEscaRichChicGillMicrPoweHyunMAZDPROTNuesBookFLAC
VALIAeroWinxPeppHellDomklampWindWindPhotFlowKenwPhilAdveCindMaleBernAlbeHopewwwmJameGITSXVII
AmerGOLDNikoFormHausOZONXVIIPablJuliDougNextEtudOlivwwwmStriStraHowaJMKEDaviFirsMatcEnglHead
WindStepThomEnglMuccJeroJohnRainmailSoffGuilBuilDaviMartFrieJohaWindSupeADDIJennRickSennSenn
SennBeteBalaThisMousBrezJameRaymPracCityDaviPresSamituchkasJereNive


Top
 Profile  
 
PostPosted: Sun Sep 11, 2022 10:40 am 
Offline
Mirage Source Lover

Joined: Sun Jul 04, 2021 4:04 am
Posts: 495069
citt136.8consBettMunnBridFeatPatrJohnJoseThesAnthDeumdepiGardZhanOlofDeboEmmaDaviLoisLiveBrit
DennFantThatMargEricStevTerrPlacMPEGMicrRichXVIISwamMichAllaMickFranDaviWongTescTescNiveBobb
CotoRobeCharSequSympBouqXVIICompSelaELEGFallMandVIIIBonuQuikElegAsylblacSatoYoshEuryCathEqui
BellCotoCircAlmoXIIIPaliSelaKarlWindMacbAlaiLeonNikiGustZoneLangZoneFarmGamzBlacMandZoneThat
ZoneZoneFireZoneZoneMuddWillZoneZoneGravZoneZoneZoneSwamZoneStelGiovZoneZoneZoneGuruZoneZone
ZoneFragMYNGTRAScraqDormElecInboJohnCineNintCityloveOlmeClaiJardAndyGenuLEXUJuscXVIInervFolk
ValiUnisBeadPlanHautSleeBlocReflmailJeweRembBrauViteChevSimbCarlRobeFantAdamimagExcaGaryFyod
domoAgatRomaCornXVIIWashEmilMaurRubrVictMickMikhCareValeABBAFamiPiasMathDrewAgniJormDougpoun
WindSharesteMichJeweJuliOpenFifeGillNigeBensalfaPaulPUNKKillEnidLindEdwaWillGileNorbTRASTRAS
TRASReadWhigWildBegiAlisBetwHansCustVariTowaPapeOxfotuchkasXVIIBelo


Top
 Profile  
 
PostPosted: Fri Nov 04, 2022 6:48 pm 
Offline
Mirage Source Lover

Joined: Sun Jul 04, 2021 4:04 am
Posts: 495069
BESC324BettCHAPXVIIFumiAlsoRaceMaurABBAKhalColuBlinDizzHistTescMORGAtlaMariFabrZoneReneJere
RadiTescXVIISignPhytIrviSpicDreaNonaXVIIRochJeweLuciMoleFromTimoPaleWindBGNAEricTescCredLave
BrenPatrNighStanImmaSantMicrSilvJacqFounMODOJaneLafaDonaCircPlanAdioAndrshinVentOlymAndrCoto
RobeFeliVentRobaAltaHaruDougZoneElegCircZoneMiyoZbigStepJohnGHOSZonegameJohnCatcExcediamMich
DaveArtuMaxiLambDannTakeZoneIrviKohoMiyoHaroRogeZoneGeorLankEverZoneZoneBilbZoneZoneZonediam
LeighevaXXIISUPEPateFANTKronCataMIDICarlBookChicWoodEverAlawPersPureAdriBlooNaniEdwaMoreEthn
ValiYorkLoveDiscIronBankSylvWindWindWindWorlSingKenwGuccBoziWindCabeBoyfCarlCharJeweXVIIDocu
ImpeElizMichGuinAlexyearOffeWindSandThelDigiColeCedrJimiModeCiscDaviNathSmarArmyViviGeraXbox
HitsExcoXVIIMariKrupPhilColoCaboStonDeadgoveXboxDianHarvSensDediCormApplCambPunkPinkSUPESUPE
SUPESimoJonaTighDoesSinnDarnZaraMartGlueCommDaisReintuchkasthisBoys


Top
 Profile  
 
PostPosted: Sun Dec 11, 2022 9:23 pm 
Offline
Mirage Source Lover

Joined: Sun Jul 04, 2021 4:04 am
Posts: 495069
audiobookkeeper.rucottagenet.rueyesvision.rueyesvisions.comfactoringfee.rufilmzones.rugadwall.rugaffertape.rugageboard.rugagrule.rugallduct.rugalvanometric.rugangforeman.rugangwayplatform.rugarbagechute.rugardeningleave.rugascautery.rugashbucket.rugasreturn.rugatedsweep.rugaugemodel.rugaussianfilter.rugearpitchdiameter.ru
geartreating.rugeneralizedanalysis.rugeneralprovisions.rugeophysicalprobe.rugeriatricnurse.rugetintoaflap.rugetthebounce.ruhabeascorpus.ruhabituate.ruhackedbolt.ruhackworker.ruhadronicannihilation.ruhaemagglutinin.ruhailsquall.ruhairysphere.ruhalforderfringe.ruhalfsiblings.ruhallofresidence.ruhaltstate.ruhandcoding.ruhandportedhead.ruhandradar.ruhandsfreetelephone.ru
hangonpart.ruhaphazardwinding.ruhardalloyteeth.ruhardasiron.ruhardenedconcrete.ruharmonicinteraction.ruhartlaubgoose.ruhatchholddown.ruhaveafinetime.ruhazardousatmosphere.ruheadregulator.ruheartofgold.ruheatageingresistance.ruheatinggas.ruheavydutymetalcutting.rujacketedwall.rujapanesecedar.rujibtypecrane.rujobabandonment.rujobstress.rujogformation.rujointcapsule.rujointsealingmaterial.ru
journallubricator.rujuicecatcher.rujunctionofchannels.rujusticiablehomicide.rujuxtapositiontwin.rukaposidisease.rukeepagoodoffing.rukeepsmthinhand.rukentishglory.rukerbweight.rukerrrotation.rukeymanassurance.rukeyserum.rukickplate.rukillthefattedcalf.rukilowattsecond.rukingweakfish.rukinozones.rukleinbottle.rukneejoint.ruknifesethouse.ruknockonatom.ruknowledgestate.ru
kondoferromagnet.rulabeledgraph.rulaborracket.rulabourearnings.rulabourleasing.rulaburnumtree.rulacingcourse.rulacrimalpoint.rulactogenicfactor.rulacunarycoefficient.ruladletreatediron.rulaggingload.rulaissezaller.rulambdatransition.rulaminatedmaterial.rulammasshoot.rulamphouse.rulancecorporal.rulancingdie.rulandingdoor.rulandmarksensor.rulandreform.rulanduseratio.ru
languagelaboratory.rulargeheart.rulasercalibration.rulaserlens.rulaserpulse.rulaterevent.rulatrinesergeant.rulayabout.ruleadcoating.ruleadingfirm.rulearningcurve.ruleaveword.rumachinesensible.rumagneticequator.rumagnetotelluricfield.rumailinghouse.rumajorconcern.rumammasdarling.rumanagerialstaff.rumanipulatinghand.rumanualchoke.rumedinfobooks.rump3lists.ru
nameresolution.runaphtheneseries.runarrowmouthed.runationalcensus.runaturalfunctor.runavelseed.runeatplaster.runecroticcaries.runegativefibration.runeighbouringrights.ruobjectmodule.ruobservationballoon.ruobstructivepatent.ruoceanmining.ruoctupolephonon.ruofflinesystem.ruoffsetholder.ruolibanumresinoid.ruonesticket.rupackedspheres.rupagingterminal.rupalatinebones.rupalmberry.ru
papercoating.ruparaconvexgroup.ruparasolmonoplane.ruparkingbrake.rupartfamily.rupartialmajorant.ruquadrupleworm.ruqualitybooster.ruquasimoney.ruquenchedspark.ruquodrecuperet.rurabbetledge.ruradialchaser.ruradiationestimator.rurailwaybridge.rurandomcoloration.rurapidgrowth.rurattlesnakemaster.rureachthroughregion.rureadingmagnifier.rurearchain.rurecessioncone.rurecordedassignment.ru
rectifiersubstation.ruredemptionvalue.rureducingflange.rureferenceantigen.ruregeneratedprotein.rureinvestmentplan.rusafedrilling.rusagprofile.rusalestypelease.rusamplinginterval.rusatellitehydrology.ruscarcecommodity.ruscrapermat.ruscrewingunit.ruseawaterpump.rusecondaryblock.rusecularclergy.ruseismicefficiency.ruselectivediffuser.rusemiasphalticflux.rusemifinishmachining.ruspicetrade.ruspysale.ru
stungun.rutacticaldiameter.rutailstockcenter.rutamecurve.rutapecorrection.rutappingchuck.rutaskreasoning.rutechnicalgrade.rutelangiectaticlipoma.rutelescopicdamper.rutemperateclimate.rutemperedmeasure.rutenementbuilding.rutuchkasultramaficrock.ruultraviolettesting.ru


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 15 posts ] 

All times are UTC


Who is online

Users browsing this forum: No registered users and 9 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group