Jump to content

Recommended Posts

Posted

Variables in detail

 

1. Introduction

It is a known fact that variables are used to “store” data into them, for a later use. But how do they do this and what does this storing exactly mean? You will find out more by reading this tutorial. You should have basic knowledge in either GUI or JASS. Note that chapters, notes and paragraphs starting with a * are strictly for JASS coding.

 

2. The elements of a variable in GUI/JASS

Each variable has three very important elements, and without understand each it is impossible to work with variables at their maximum potential.

 

a) First element is the logical name of the variable. It’s pretty logical that you need something to make difference between one variable and another, in an understandable manner, making variables easier to use and manipulate. The name is simply used in the code and you are the only one working with it. The computer does not care what name you use so you should some suggestive names.

 

Note: Valid names can contain only alphanumeric characters along with the character “_”.

*All names must begin with a letter.

 

Example: An appropriate name for a variable in which you store the (Target Unit of Ability Being Cast)/GetSpellTargetUnit() would be targ or target. A name such as ubv, an_unit or wing_ding are not good ones. Also try to avoid too long names, in case you don’t want to make the code messier and harder to understand.

 

 

b) Stored type is the second element of variable. Being a relatively organized scripting language, JASS (that will include GUI, because all such codes are converted to JASS) requests the programmer to specify the type of each variable. Let it be integer, real, boolean, string, code or handle (with all extended types: unit, unit group/group, point/location etc.), a variable can hold a single type (respectively extension) which must be mentioned when the variable is declared. You cannot store a different type to a variable than the one specified at the declaration. Trying to do so will result in an error.

 

A global variables’ types are declared in the variable editor.

*Local variables’ types are declared along with the variables themselves.

 

*Example

 

local unit cast
local boolean  b

 

 

c) Value/Address

The third and probably most important element of variables, since it is the purpose of using them. The value refers to what a variable contains. Now you may ask why I added address too. That’s because handle variables do not store a value, yet instead the address of one. We’ll see in a moment what’s the difference.

 

All temporary data is stored into the memory (RAM) of the computer. The memory is split into bits (small pieces which can store values of 1 and 0 =>binary code). Every bit is made out of two elements: the address and the value it contains. The address is like its name, and is unique for each bit. You can access a bit through its address, just like you can access a variable through its name. It is very important to make difference between address and value. The address for a bit is always the same. The only element that changes is the value. Just like for a variable the name is always the same, only its value changes. You can have bits with the same value, but you can’t have bits with the same address. Just like two variables can contain the same value, but cannot have the same name.

 

Now, it is clear that a value is stored on multiple bits. The value type is necessary to know on how many bits is the value stored. When storing a value to a variable, you actually refer to the address where it is stored into the memory. Then when accessing the variable, you practically access the bits containing the value “stored” into the variable.

 

Now, you cannot control this mechanism in JASS and you can’t make difference between address and value. However, you should know that integer, real, boolean and string variables when assigned a value either directly or from another variable, into the variable the value itself is stored.

 

Example: We have the global variables Anumber and Bnumber. Left code is GUI, right code is the equivalent JASS.

 

Set Anumber = 100                                      set udg_Anumber=100
Set Bnumber = Anumber                                     set udg_Bnumber=udgAnumber
Set Anumber = 200                                              set udg_Anumber =200

 

 

At the end of the code, Anumber will have stored the integer 200, while Bnumber integer 100. Why? Because the the two variables are independent. When I said Bnumber=Anumber I actually copied the value of Anumber into Bnumber. The value from Bnumber and Anumber are at different addresses in the memory, even when they have the same value. This is how integer, real, string,boolean and code variables behave.

 

Now, there are handle variables which unlike the other types are “pointers”. This means that instead of values, they store addresses, which means that if the value of one changes, so does the value of the other one. Let’s analyze this code (first is GUI, second is JASS). I have two unit group global variables: AGroup and BGroup.

 

 

 Unit - Create 1 Footman for Player 1 (Red) at (Center of (Playable map area)) facing Default building facing degrees
    Unit Group - Add (Last created unit) to AGroup
    Set BGroup = AGroup
    Unit Group - Remove (Last created unit) from AGroup
    Unit - Remove (Random unit from BGroup) from the game

 

    local unit u = CreateUnit( Player(0), 'hfoo', 0,0,0 )
    call GroupAddUnit(udg_AGroup, u)
    set udg_BGroup = udg_AGroup
    call GroupRemoveUnit( udg_AGroup, u )
    call RemoveUnit( GroupPickRandomUnit(udg_BGroup) )

 

 

Normally even though we removed the unit from group AGroup, it should still exist to BGroup, so the unit should be removed from the map. But strangely as it is, the unit still remains on the map. That means that the unit was removed from both BGroup and AGroup. But how could this be possible? That is because when I actually said BGroup = AGroup I made BGroup point (contain) at the address of the same group AGroup pointed. As a conclusion, the two “contain” the same group, so assigning a handle variable a value means making it point to that value, and not copying it elsewhere in memory like it happened with non-handles. This is really important behavior and you will find out in the next chapters why.

 

 

3. Variable extensions

 

Even though this would be a subject about value types, I think I can discuss about it here. I mentioned before that all variable types except boolean, integer, real, string and code are extensions of the type handle. What is an extension?

 

Well, an extended type is one which inherits all the properties of the root type (handle in this case) and has some of its own. But then what are the properties of a handle? Well… in fact, a handle is an object that before you can use must be created (usually through functions). Once you no longer need it, the handle can be destroyed. Handles are more complex than a number, a true/false value or a serie of characters. These complex objects can have many properties. For example, a point is a pair of two reals, coordinates of a point. Groups contain addresses to multiple units. Timers are objects which have two real value (timeout and time left), one boolean value (repetitive or not) and the address of a code (to execute once the time left reaches 0).

 

The best example to understand inheritance (extending a type) is the value type “widget”. It is an extension of handle that besides the fact that it is an object, it is an object which has a life and a position. There are then other types extending a “widget” and more specifically a unit, a destructable and an item. The difference between them is obvious in-game so I won’t bother explaining it.

 

 

4. Leaks

 

First problem that usually occurs to handles is the “leaking” stuff. You all heard about it, you know that it consumes memory and blah blah, but ever asked yourself how and why does this happen? When creating an object (handle) we know that it is stored into the memory and so, of course it consumes part of it. However in order for us to be able to know where each object is created, every such creation functions usually return the address at which the object is stored, so it is utterly important that you store it immediately to a variable.

What happens if you don’t do this and you just use the function (for example Polar Offset/PolarProjection)? Well, the value is stored at an address in the memory, but we do not know exactly where. Integers, booleans and reals if stored into local variables are discarded from the memory when the memory. Perfectly logical because you can always mention those values, considering that they do not have variable properties like handles.

 

Note: It is said that strings themselves leak because once added to the memory, they are never removed. At this moment, there is no way to prevent this leak.

 

When it comes to objects though, their value does not “disappear” once variable points to another place in memory and is not discarded from locals once the function ends. Pretty obvious, considering that let’s say you would store the response unit (Triggering Unit)/GetTriggerUnit() to a local variable. It is unlogical to remove it from the game because the function where it was stored into a local ended.

 

However, there are certain handles (such as locations and groups) which should be removed once they are used, or else they will consume the memory, even though you no longer need them. Let’s take for example Polar Offset. You use it to move an unit in circle. Well, every position of the circle will be stored somewhere in the memory. Considering that there are 100 such units rotating and each rotation means 180 points, that’s 18000 locations stored into the memory when they are not needed for now. How can we solve the problem? We move the unit to the location and then we remove the location itself. Result? The memory is free and it is not uselessly consumed and kept “busy”.

 

Another known leak is the fact that handle-type local variables need to be nullified a.k.a removed at the end of the function, or else they will keep memory “busy” too. Why is that? Well, usually when creating a new object the program searches for a place into the memory to store it. Of course if a place in the memory is not free, it will not create the object over it, because it would overlap the value and cause problems.

 

As we know, variables point at a place in the memory. Apparently if the function ends while local is still pointing at a certain address, that address will be considered occupied and will not be used to store another value, even though it should be available. As a conclusion, before the function ends and the locals disappear, it is recommended that you make them point at the value “null”. It is a constant handle value that is never removed from the game. Forcing locals to point at it makes it free the previous byte at who’s address it was pointing at (of course if there is no object and there are no other variables pointing at it), not keeping it “busy” uselessly.

 

6. Conversion from one type to another

 

Even though this has again more to do with types than with variables, I believe it is utterly important to understand conversion from one type to another, in order to create more complex coding.

 

a) Numeric & String conversions

These are the basic and most important conversions, because they allow you to turn numbers (let them be real or integer) into text or vice-versa. You can also do numeric conversions (real to integer and integer to real). The procedure is very simple. Simply by using a function that takes as a parameter a type, you will get back the equivalent type.

 

In GUI when you want to do a conversion it is enough to replace the desired field with the appropriate function, which can be found under “Conversion – “. In JASS use the functions R2I & I2R (for real-integer conversions), R2S & S2R (for real-string conversions) and I2S & S2I (for integer-string conversions).

 

Trick:

If you want to turn a real value to string, the resulting string will contain the point and the decimals after it too. To get rid of them, you will first have to convert the real to integer, and then convert the resulting integer to string. Like this:

String(Integer(REAL_VALUE)) / I2S(R2I(REAL_VALUE))

 

*b) Any type of conversions

 

Due to a famous bug in JASS, it is possible to convert any type to any type (though sometimes this may lead to crash so be careful what you convert to what). First I’ll explain you the bug and then we will take some examples.

 

If in a function more than one “return” is used, the compiler will strictly check if the type returned by the last instruction is correct! Obviously a function that is supposed to return an unit cannot return a timer. However, if the type returned by the last instruction is correct, the compiler does not check the previous “return”s and you can put any type of value you want there, because you will get no warning. And to make things better, you can even use two returns one after another. The first one will be taken in consideration, while the second one will not (because a return ends the execution of the instructions after it into the function).

 

Example: The classical Handle to Integer conversion function looks like this.

 

function H2I takes handle h returns integer
    return h
    return 0
endfunction

 

Even though it may sound hilarious and silly, the function converts the handle to an integer. And that’s not all! Two different handles will always give two different integers. The explanation would be the fact that the returned value is the ID of the handle.

 

Even though this bug may not seem useful, it was used in systems such as Kattana’s HandleVars and Vexorian’s CSCache. My tutorial unfortunately does not cover these chapter but you can always check the code and see how they were made.

 

 

*7. Handling groups

 

Groups are probably the most difficult handles to operate with. They store the addresses of multiple units, and are very handy because instead of using the non-conventional unit arrays which are slow and hard to manipulate, the groups can easily work with the units they “store” because of the native functions operating with them. However, there are some important issues you should be careful when operating with them.

 

The most important one is how you grab the units from the group. The easiest method is using the native function ForGroup. However, it is pretty unhandy in some cases because it uses a code as a parameter for the list of instructions done upon each unit. So there is an algorithm to do this manually without losing locals and it looks like this:

 

 

loop
                    set u = FirstOfGroup(g) 
                    exitwhen u==null
                    call GroupRemoveUnit(g,u)
                    //do what you have to do with unit u
             endloop

 

 

The only problem is that once you do something with an unit from the group, you also remove it from the group. Hmm… not very good, isn’t it? The alternative people usually would choose is copying the group to another group. And I suggest that myself. But you must know how to do this. Because we know that doing something like w=g will not create a separate group.

 

First solution would be to use the native function GroupAddGroup which actually copies the units from a group into another group, while keeping the two handles distinct objects. To do this you will have to create first the destination group. It would look like this:

 

local group w = CreateGroup()
call GroupAddGroup(w,g) //copy group to another one
//do the sequence above
call DestroyGroup(g)
set g = w //it is safe now to make g point at the copy.

 

For those who do not like using non-natives I have another solution.

 

local group w = CreateGroup()
loop
                    set u = FirstOfGroup(g) 
                    exitwhen u==null
                    call GroupAddUnit(w,u)
                    call GroupRemoveUnit(g,u)
                    //do what you have to do with unit u
endloop
call DestroyGroup(g)
set g = w

 

Instead of adding the units to the secure group through a function, I made it manually. It’s quite the same thing, dunno which is faster, so you can use any you want and find better for your needs.

 

 

Well, that’s about it. If I think there are other things that I should add to this tutorial I certainly will. Feel free to post suggestions and comments. I’ll do my best to fulfill your needs.

 

 

All credits go to Daelin!!!

Posted

is this a scripting language that is used to create w3 maps/units etc..?

Indeed. Thanks for sticky my mate. I hope it helps you *luck's* ^^

  • 2 years later...
  • 3 weeks later...
Posted

Its not mine you pathetic retard read the title and then use your low creativity to spam/

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Posts

    • General Trackers :   IPTorrents invite IPTorrents account 1 tb TorrentLeech invite Torrentleech account 1 tb buffer  InTheShaDow ( ITS ) account Acid-lounge invite Torrentday invite Crnaberza account Abn.Lol account Limit-of-eden account Norbits account Xspeeds account Xspeeds invite Bemaniso invite Wigornot account Turkseed.com account Bithumen invite Filelist account Funfile invite AvistaZ invite Potuk.net invite ResurrectThe.Net invite GrabThe.Info invite Greek-Team invite LinkoManija invite Fano.in account tracker.czech-server.com Speed.cd invite Arab-torrents.net account Arabscene.me account Scenetime account 4thd.xyz invite Btarg.com.ar account Dedbit invite Estone.cc account Speedapp invite Finvip invite Fluxzone account GigaTorrents account Gimmepeers account Haidan.video invite Mojblink account Mycarpathians invite Newinsane.info account Oscarworld.xyz account Peers.FM invite Pt.msg.vg account Ransackedcrew account Redemption invite Scene-rush account Seedfile.io invite Teracod invite Torrent.ai account Torrentmasters invite Ttsweb invite X-files invite X-ite invite Ncore account TorrentHR account Rptorrents account BwTorrents account Superbits invite Krazyzone account Immortalseed account Tntracker invite Pt.eastgame.org account Bitturk account Rstorrent account Tracker.btnext invite Torrent-turk.de account BeiTai.PT account Pt.keepfrds account 52pt.site account Pthome account Torrentseeds account Aystorrent account Blues-brothers.biz invite Divteam account Thesceneplace invite CinemaMovies.pl account Brasiltracker account Patiodebutacas account Newheaven.nl account  Swarmazon.club invite Bc-reloaded account Crazyspirits account Silentground invite Omg.wtftrackr invite Milkie.cc invite Breathetheword invite Madsrevolution account Chilebt account Yubraca account Uniongang.tv account Frboard account Exvagos account Diablotorrent account Microbit account Carp-hunter.hu account Majomparade.eu account Theshinning.me account Youiv.info account Dragonworld-reloaded account Sharewood.tv account Partis.si account Digitalcore.club invite Fuzer.me account R3vuk.wtf invite Ztracker account 1 tb buffer 3changtrai account Best-core.info account Bitsite.us account Eliteunitedcrew invite Exitorrent.org account Tophos invite Torrent.lt account Sktorrent.eu account Oshen account Pirata.digital account Esharenet account Ohmenarikgi.la Pirate-share account Immortuos account Kiesbits account Cliente.amigos-share.club account Broadcity invite Ilovetorzz account Torrentbytes account Polishsource account Portugas account Shareisland account ArabaFenice account Hudbt.hust.edu.cn account Audiences account Nanyangpt account Pt.sjtu.edu.cn account Pt.zhixing.bjtu.edu.cn account Byr.pt invite Ptfiles invite Red-bits account Pt.hdpost.top account Irrenhaus.dyndns.dk (NewPropaganda) account Mnvv2.info (MaxNewVision V2) account 1ptba.com account Spidertk.top account Film-paleis account Generation-free account Aftershock-tracker account Twilightsdreams account Back-ups.me invite Sor-next.tk ( Spirit Of Revolution ) account Tfa.tf ( The Falling Angels ) account Hdmayi account S-f-p.dyndns.dk ( Share Friends Projekt ) account Unlimitz.biz account Pttime account St-tracker.eu account New-retro.eu account Zbbit account Tigers-dl.net account Jptvts.us account Lat-team account Club.hares.top account Falkonvision-team account Concen account Drugari account T.ceskeforum account Peeratiko.org account Zamunda.se account Central-torrent.eu account h-o-d.org account Torrentleech.pl account Demonoid invite Lst.gg account Fakedoor.store account LaidBackManor account Vrbsharezone.co.uk invite Torrenteros account Arenaelite account Datascene account Tracker.0day.community Tapochek.net invite Ptchina invite Lesaloon account Exyusubs account Therebels.tv account Ubits.club invite Zmpt.cc account Turktorrent.us account Dasunerwarte account Hawke.uno account Monikadesign account Fearnopeer account Alpharatio account Wukongwendao.top account Chinapyg account Azusa.wiki account Yggtorrent.top account Torrentdd account Cyanbug.net invite Hhanclub.top account Wintersakura.net account Xthor account Tctg.pm account Finelite invite Agsvpt.com account Pt.0ff.cc invite Qingwapt.com account Xingtan.one account Ptcafe.club invite W-o-t.pro account Coastal-crew.bounceme.net account Darkpeers.org account Pianyuan.org account Seedpool.org  account Tempelbox account Pt.itzmx.com account Itatorrents.xyz  account Letseed.org account The-new-fun.com  account Malayabits.cc account Trellas.me account Yu-scene.net account Futuretorrent.org account Bitpt.cn account Tocashare.biz  account Videoteka.org  account White-angel.hu account Xbytesv2.li account Torr9  account Desitorrents account Okpt.net account Samaritano.cc account Polishtorrent.top  account C411.org account Bigcore.eu account Infinitylibrary.net account Beload.org account Emuwarez.com account Yhpp.cc account Rastastugan account Tlzdigital account account Upscalevault account Bluraytracker.cz account Torrenting.com account Infire.si account Dasunerwartete.biz invite The-torrent-trader account New-asgard.xyz account Pandapt account Deildu account Tmpt.top invite Pt.gtk.pw account Media.slo-bitcloud.eu account P.t-baozi.cc account 13city.org account Cangbao.ge account Cc.mypt.cc invite Dubhe.site invite Hdbao.cc account Kufei.org invite Mooko.org account Pt.aling.de invite Pt.lajidui.top invite Longpt.org invite Pt.luckpt.de invite Ptlover.cc invite Raingfh.top account Sewerpt.com account Huntorrent.org account Xtremebytes.net account Bitbazis.net account Turkseed.com account Mundo-pirata.org account   Movies Trackers :   Secret-cinema account Anthelion account Pixelhd account Cinemageddon account Cinemaz account Retroflix account Classix-unlimited - invite Movie-Torrentz (m2g.link) invite Punck-tracker.net account Tmghub account Cathode-ray.tube account Greatposterwall account Arabicsource.net account Upload.cx account Crabpt.vip invite Onlyencodes.cc account Exyusubs account Hellashut.net invite Nordichd.sytes.net invite Locadora.cc account Retro-movies.club account HD Trackers :   Blutopia buffered account Hd-olimpo buffered account Hdf.world account Torrentland.li account HdSky account Hdchina account Chdbits account Totheglory account Hdroute account Hdhome account TorrentCCF aka et8.org account 3DTorrents invite HD-Torrents account Bit-HDTV account HDME.eu invite Hdarea.co account Asiancinema.me account JoyHD invite HDSpace invite CrazyHD invite Bluebird-hd invite Htpt.cc account Hdtime invite Ourbits.club account Hd4fans account Siambit account Privatehd account Springsunday account Tjupt account Hdcity.leniter invite Ccfbits account Discfan account Pt.btschool.club account Ptsbao.club invite Hdzone.me invite Danishbytes account Zonaq.pw account Tracker.tekno3d account Arabp2p account Hd-united account Reelflix.xyz account Hdatmos.club account Anasch.cc invite Tigris-t account Nethd.org account Hd.ai invite Hitpt.com account Hdmonkey account Dragonhd.xyz account Hdclub.eu account Forum.bluraycd.com account Carpt account Hdfun.me invite Pt.hdupt invite Puntotorrent account Ultrahd account Rousi.zip account Bearbit account Hdturk.club account Asiandvdclub account Star-space.net account Nordicq.org account Hdkyl.in account Utp.to account Hdzero account Novahd account Hdtorrents.eu account 4k3dyptt account Duckboobee.org invite Si-qi.xyz account     Music Trackers :   Dicmusic account Music-Vid account Open.cd account LzTr account ProAudioTorrents invite Jpopsuki invite TranceTraffic invite Audionews invite Kraytracker invite Libble.me invite Losslessclub invite Indietorrents.com invite Dimeadozen account Funkytorrents invite Karaokedl account zombtracker.the-zomb account Concertos account Sugoimusic account Satclubbing.club invite Metal.iplay invite Psyreactor invite Panda.cd account Adamsfile account Freehardmusic account Tracker.hqmusic.vn accouunt Twilightzoom account 3 tb buffer Hiresmusic account Metalguru account Musictorrents.org account Musebootlegs.com invite Zappateers.com account Jungleland.dnsalias.com account Naftamusic account Bemusic account   E-Learning Trackers :   Theplace account Thevault account Myanonamouse account Libranet account 420Project account Learnflakes account Pt.soulvoice.club account P2pelite account Aaaaarg.fail invite Ebooks-shares.org account Abtorrents account Pt.tu88.men invite Docspedia.world invite   TV-Trackers :   Skipthecommercials.xyz account Cryptichaven account TV-Vault invite Shazbat.TV account Myspleen account Tasmanit.es invite Tvstore.me account Tvchaosuk account Jptv.club account   XXX - Porn Trackers :   Homeporntorrents.club account FemdomCult account Pussytorrents account Adult-cinema-network account Bootytape account 1 Tb buffer Exoticaz account Bitporn account Kufirc account Gaytorrent.ru invite Nicept account Gay-torrents.org invite Ourgtn account Pt.hdbd.us account BitSexy account Happyfappy.org account Kamept.com account Lesbians4u.org account Fappaizuri.me account   Gaming Trackers :   Pixelcove account Mteam.fr account BitGamer invite Retrowithin invite Gamegamept account   Cartoon/Anime/Comic Trackers :   Animeworld account Oldtoons.world account U2.dmhy account CartoonChaos invite Mononoke account Totallykids.tv account Bakabt.me invite Revanime account Ansktracker account Tracker.shakaw.com.br invite Bt.mdan.org account Skyey2.com account Animetracker.cc Adbt.it.cx invite Tracker.uniotaku.com account Mousebits.com account   Sports Trackers :   MMA-Tracker invite T3nnis.tv invite AcrossTheTasman account RacingForMe invite Sportscult invite Ultimatewrestlingtorrents account Worldboxingvideoarchive invite CyclingTorrents account Xtremewrestlingtorrents account Tc-boxing invite Mma-torrents account Aussierul invite Xwt-classics account Racing4everyone account Talk.tenyardtracker account Stalker.societyglitch invite Extremebits invite Rgfootball.net account F1carreras.xyz account Software/Apps Trackers : Brokenstones account Appzuniverse invite Teamos.xyz account Macbb.org account Phoenixproject.app account Tormac.org account   Graphics Trackers:   Forum.Cgpersia account Cgfxw account   Others   Hduse.net account Fora.snahp.eu account Makingoff.org/forum account Xrel.to account Undergunz.su account Corebay account Endoftheinter.net ( EOTI ) account Thismight.be invite Skull.facefromouter.space account Avxhm.se (AvaxHome) account Ssdforum account Notfake.vip account Intotheinter.net account Tildes.net invite Thetoonz account Usinavirtual account Hdclasico invite HispaShare account Valentine.wtf account Adit-hd account Forum-andr.net account Warezforums account Justanothermusic.site account Forbiddenlibrary.moe account Senturion.to account Movieparadise account Dcdnet.ru account Sftdevils.net account Heavy-r.com account New-team.org account Ddl.tv account Filewarez.club account Hispamula.org account Hubwarez.tv account Ultim-zone.in account Leprosorium.ru account Planet-ultima.org account The-dark-warez.com account Koyi.pub account Tehparadox.net account Forumophilia account Torrentinvite.fr account Gmgard.com account Board4all.biz account Gentoo-zh.org account   NZB :   Ninjacentral account Tabula-rasa.pw account Drunkenslug account Drunkenslug invite Usenet-4all account Dognzb.cr invite Kleverig account Nzb.cat account Nzbplanet.net invite Ng4you.com account NZB.to account Samuraiplace account Abhdtv.net account Abook.link account Comix.pw account House-of-usenet Secretbinaries.net account Vnext.to account Stockboxx.top account Sky-of-use.net account Indexer.codeshy.com account Oldboys.pw account Uhd100.com account Prices start from 3 $ to 100 $   Payment methods: Crypto, Neteller, Revolut   If you want to buy something send me a pm or contact me on:   Email: morrison2102@gmail.com   Discord: LFC4LIFE#4173   Telegram: https://t.me/LFC4LIFE4173   Skype: morrison2102@hotmail.com  
    • SMMTG.PRO — TELEGRAM SERVICES PROVIDER PRICE LIST ★ Premium Subscribers for Bots Russia — from $5.6 / 1,000 subs Ukraine — from $5.6 / 1,000 subs USA — from $6.4 / 1,000 subs Israel — from $6.4 / 1,000 subs Uzbekistan — from $6.4 / 1,000 subs Turkey — from $6.4 / 1,000 subs China — from $6.4 / 1,000 subs Thailand — from $6.4 / 1,000 subs Europe — from $6.4 / 1,000 subs India — from $6.4 / 1,000 subs Other countries — from $13 / 1,000 subs OTHER SERVICES Telegram Boost — from $42 / 1,000 votes Premium Subscribers for Channels — from $2.9 / 1,000 Telegram Stars — from $16.9 / 1,000 stars Regular Subscribers for Channels — from $0.19 / 1,000 Regular Subscribers for Bots — from $0.25 / 1,000 Post Reactions — from $0.14 / 1,000 reactions Post Views — from $0.07 / 1,000 views EXCLUSIVE SERVICES ★ Telegram Search TOP Ranking | SEO Optimization ★ Aged Telegram Bots (registered accounts) — from $1.9 / bot ★ Telegram SEO & Search Training PAYMENT METHODS Heleket — any cryptocurrency CrystalPay — RUB | KZT | SBP | CryptoBot & more Payeer — multiple payment options ➤ Website (24/7): SMMTG.PRO ➤ Telegram Channel: https://t.me/+U8H180SSuoVjN2Iy ➤ 24/7 Support: t.me/smmtg_new
    • Telegram Bot TOP Search Promotion | SEO Optimization for Bots | SMMTG.PRO We promote Telegram bots to the TOP of search results — by keywords, topics, and countries. What’s included: • Promotion to the TOP of Telegram search • Bot optimization for Telegram algorithms • Competitor analysis and keyword selection • Testing and securing stable ranking Delivery time: 2–3 days per bot Pricing: Starts from $40 per bot (final cost depends on competition level and target country) We work with 50+ countries: Russia • Ukraine • USA • Israel • Uzbekistan • Turkey • China • Thailand • Europe • India Training is also available: Telegram bot SEO optimization Techniques & insights for reaching TOP search positions Real-world cases and recommendations Contact: Telegram — t.me/smmtg_new Our SMM panel: SMMTG.PRO
    • SELLING EMPTY TELEGRAM BOTS WITH AGE Registration date: November 2024 High-quality & clean bots — no subscribers, no bans, created on fresh IPs. y rested and reliable — perfect for: — Telegram search ranking — any technical or marketing tasks Delivery options: tdata, by phone number, ownership transfer, or via tokens. Current price list: From 3 pcs — $3 each From 20 pcs — $2.5 each From 60 pcs — $2.3 each From 100 pcs — $2.2 each From 400 pcs — $1.9 each Over 15,000+ bots available — ready for instant delivery. Contact on Telegram: t.me/smmtg_new
  • Topics

×
×
  • Create New...

Important Information

This community uses essential cookies to function properly. Non-essential cookies and third-party services are used only with your consent. Read our Privacy Policy and We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue..